1

次のコードに問題があります。

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define NUM_SPAWNS 2
// Based on the example from: http://mpi.deino.net/mpi_functions/MPI_Comm_spawn.html
void MPI_messenger(int stuff, int dest)
{
    MPI_Send(&stuff, 1, MPI_INT, dest, 1,intercomm);
}

int main( int argc, char *argv[] )
{
    int my_rank;
    int size;
    int np = NUM_SPAWNS;
    int errcodes[NUM_SPAWNS];
    MPI_Comm parentcomm, intercomm, testcomm;
    MPI_Init( &argc, &argv );
    MPI_Status stat;
    MPI_Comm_get_parent( &parentcomm );
    if (parentcomm == MPI_COMM_NULL)
    {
        MPI_Comm_spawn( "spawn_example4", MPI_ARGV_NULL, np, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, errcodes );
        MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        int lol = 10;
        MPI_messenger(lol,0);
        MPI_messenger(lol,1);
    }
    else
    {
        MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        int lol;
        MPI_Recv(&lol, 1, MPI_INT,0,1,parentcomm, &stat);


        std::cout << lol << "\n";
    }
    fflush(stdout);
    MPI_Finalize();
    return 0;
}

もちろん、intercommunicator intercommは、関数MPI_messengerのスコープでは定義されていません。このインターコミュニケーターを引数として渡さずに関数内に取得できるかどうか、またどのように取得できるかを知りたいと思いました。

4

1 に答える 1

2

他の変数と同じように、グローバルに宣言するか、との両方main()に表示される他の共通のスコープで宣言しますMPI_messenger()(たとえば、メンバーと同じクラス内で)。

于 2012-06-07T16:59:12.077 に答える