C++でOpenMPI入門4 構造体のブロードキャスト1

前回はプリミティブ型であるintをブロードキャストしたが, 複数の型の変数をまとめて同期したいときなどは構造体にしてブロードキャストできると便利.

#include <iostream>
#include <mpi.h>

struct parameter
{
    int seed;
    double temperature;
};

int main(int argc, char **argv)
{
    MPI::Init(argc, argv);

    int rank = MPI::COMM_WORLD.Get_rank();
    parameter param;
    if (rank == 0)
    {
        std::cout << "Input a seed : ";
        std::cin >> param.seed;
        std::cout << "Input a temperature : ";
        std::cin >> param.temperature;
    }

    MPI::COMM_WORLD.Bcast(&param, sizeof(param), MPI_BYTE, 0);
    std::cout << "rank = " << rank
              << " : seed = " << param.seed
              << " : temperature = " << param.temperature << std::endl;

    MPI::Finalize();
}

実行例.

Input a seed : 19
Input a temperature : 36.7
rank = 1 : seed = 19 : temperature = 36.7
rank = 2 : seed = 19 : temperature = 36.7
rank = 3 : seed = 19 : temperature = 36.7
rank = 0 : seed = 19 : temperature = 36.7

前回との違いは, ブロードキャストする際に型としてMPI_BYTEを指定している点と, sizeof(param)としてバイト長を用いている点. これで明らかな通り, 結局はバイト列として送受信しているのでしょう.

これによって, int型とdouble型(MPI::INTとMPI::DOUBLE)という異なる型の変数を同時に1つの構造体としてブロードキャストできました.