1

MPI 経由で送信する構造体を作成していますが、他の関数で構造体を使用するのに少し問題があります..

typedef struct Coordinates
{
    int x;
    int y;
} XY;

int main (int argc, char *argv[])
{
    MPI_Init(&argc, &argv);
    .
    .
    .
    const int num_items = 2;
    int blocklengths[2] = {1, 1};
    MPI_Aint offsets [2];
    offsets[0] = offsetof(XY, x);
    offsets[1] = offsetof(XY, y);
    MPI_Datatype types[2] = {MPI_INT, MPI_INT};
    MPI_Datatype mpi_new_type;

    MPI_Type_struct(...., &mpi_new_type);
    MPI_Type_commit(&mpi_new_type);

    // Call some function here depending on rank
    if (rank == 0)
        controlFunction(..);
    else
        someFunction(..);

    return 0;
}

int controlFunction(..)
{
    MPI_Recv(.., mpi_new_type,...);
    .
    .
}

int someFunction(..)
{
    MPI_Send(.., mpi_new_type,...);
    .
    .
}

したがって、基本的な考え方は、いくつかのデータを含む構造体を作成し、新しい MPI_Datatype を作成して MPI 経由で構造体を処理することです。問題は、プログラムをコンパイルすると、両方の関数でエラーが発生する場所にcontrolFunctionあります。someFunctionmpicc file.c -o filempi_new_type undeclared

他の関数でこのデータ型にアクセスする方法はありますか?

ありがとう。

編集 - 要求に応じて mpi_new_type の宣言を表示するコードを追加しました。

4

1 に答える 1

3

変数mpi_new_typeは、関数の本体のスコープでのみ表示されmainます。someFunctionおよびcontrolFunctionの本体のスコープ内で名前が宣言されていません。変数を引数としてそれらに渡すことができます

 int main() {   
 ...
 if (...)
    controlFunction(mpi_new_type, ...);
 else
    ...
 ...
 }

 int controlFunction(MPI_Dataype mpi_new_type, ...) {

または、それをグローバル変数にします (ただし、グローバル変数が推奨されないすべての理由を忘れないでください)。

于 2013-05-03T05:35:22.707 に答える