3

配列へのポインタをブロードキャストしています

MPI_Bcast(&xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);

プロセス0から、0以外のプロセスからこのブロードキャストを受信

MPI_Bcast(&xd_sim_recv, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);

受信した値を読み取ろうとすると、セグメンテーション違反 11 が発生します。このような

for(i=0; i<Numlines_Sim; i++)
printf("%f\n",xd_sim_recv[i]);fflush(stdout);

ここで何が問題なのですか。修正するのを手伝ってもらえますか?

4

2 に答える 2

5

ポインターを送信しても意味がありません。そのポインターは他の並列プロセスでは無効になるため、代わりにバッファーを送信します。

MPI_Bcast(xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);
于 2012-11-16T20:42:00.790 に答える
4

ルートプロセスで使用されるもの以外のベクトルでデータを受信する場合は、次のようにする必要があります(擬似コード)。

if (THIS PROCESS IS ROOT) {
    MPI_Bcast(xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);
} else {
    MPI_Bcast(xd_sim_recv, Numlines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);
}

なしでは&、変数xd_sim_send xd_sim_recvはすでにポインターであるため、それがMPI_Bcast必要です。

于 2012-11-16T20:53:57.563 に答える