私はあなたがテキストファイルを参照するのではなく、ポインタでアクセスされる算術データに言及していることを理解します。あなたの問題は、すべてのプロセスが同じサイズのデータを持っているわけではないことも理解しています。
この場合、おそらくMPI_Gatherv機能を探しています。 MPI_Gather関数とよく似ていますが、送信するデータの数(受信ランクで指定されたrecvcounts
配列)と、ターゲットの場所(displs
配列)に配置されるデータを定義できます。
単純MPI_Gather、マスタのみランクはデータの完全な配列にメモリを割り当てた:
MPI_Comm comm;
int gsize,sendarray[100];
int root, myrank, *rbuf;
...
MPI_Comm_rank(comm, myrank);
if (myrank == root) {
MPI_Comm_size(comm, &gsize);
rbuf = (int *)malloc(gsize*100*sizeof(int));
}
MPI_Gather(sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm);
ここMPI Forumの文書から2つの例であります
この例では、すべてのプロセスに100個の整数のチャンクがあります。あなたの場合、int
をfloat
に変更することができます。
MPI_Gatherv:この例では
MPI_Comm comm;
int gsize,sendarray[100];
int root, *rbuf, stride;
int *displs,i,*rcounts;
...
MPI_Comm_size(comm, &gsize);
rbuf = (int *)malloc(gsize*stride*sizeof(int));
displs = (int *)malloc(gsize*sizeof(int));
rcounts = (int *)malloc(gsize*sizeof(int));
for (i=0; i<gsize; ++i) {
displs[i] = i*stride;
rcounts[i] = 100;
}
MPI_Gatherv(sendarray, 100, MPI_INT, rbuf, rcounts, displs, MPI_INT,
root, comm);
、同じ数の要素が受信(100の整数)とstride
整数によって分離されているメモリ領域に定期的に置かれています。ターゲット配列(rbuf
)は、(number_of_ranks * のストライド)の整数を格納できます。
あなたは完全に固定サイズストライドを無視して、あなたがそれらを知っていれば、プロセスごとに個別にdispls
とrcounts
を設定することができます。あなたがそれらを知らない場合は、MPIフォーラムのページの最後の例を見てください。
いずれの場合でも、データ(例:array [i])では単一ポインタを使用していて、倍精度ではないと仮定します(array [i] [j]など)。これには、正しいインデックスを設定するために多少の努力が必要ですが、MPIや場合によってはより高速に使用する方が簡単です。
ファイルを連結する(ディスクに書き込むなど)代わりに、すべてのローカルアレイを1つに集約したくないと思います。私はまた、あなたは数字(どのような種類)を使用したいと思うし、テキストではないと思います。これらの権利はありますか? – MakisH
ええ、彼らはすべて浮きです。 – brad