2016-10-24 6 views
-1

複数のコアから複数のテキストファイルを1つのコアに連結する簡単な方法はありますか?MPIを使用したテキストファイルの連結

コア0

1 4 6 4 2 6 
4 5 4 2 4 7 
3 5 6 7 8 5 

コア1

5 6 7 5 3 6 
5 6 7 8 5 4 
6 4 3 5 6 7 

のCore 2

6 7 8 5 3 6 
4 5 7 3 4 5 
8 7 6 5 2 3 
6 7 8 6 5 4 
8 9 0 3 2 1 

私は、コア1と、コアからテキストファイルをコア0上のテキストファイルを追加したいです私はそれが何かのようなものだと知っています...

int textSize = ...; // size of text file on each core 
     if (rank == 0) { 
      int size = malloc(sizeof(float) * textSize); 
     } 
     MPI_Gather(&name_of_text_file, textSize, MPI_FLOAT, *size, textSize, MPI_FLOAT, 0, MPI_COMM_WORLD); 

ご協力いただければ幸いです。

+1

ファイルを連結する(ディスクに書き込むなど)代わりに、すべてのローカルアレイを1つに集約したくないと思います。私はまた、あなたは数字(どのような種類)を使用したいと思うし、テキストではないと思います。これらの権利はありますか? – MakisH

+0

ええ、彼らはすべて浮きです。 – brad

答えて

0

私はあなたがテキストファイルを参照するのではなく、ポインタでアクセスされる算術データに言及していることを理解します。あなたの問題は、すべてのプロセスが同じサイズのデータ​​を持っているわけではないことも理解しています。

この場合、おそらく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); 

Example of MPI_Gather (from MPI Forum)

ここMPI Forumの文書から2つの例であります

この例では、すべてのプロセスに100個の整数のチャンクがあります。あなたの場合、intfloatに変更することができます。

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); 

Example of MPI_Gatherv (from MPI Forum)

、同じ数の要素が受信(100の整数)とstride整数によって分離されているメモリ領域に定期的に置かれています。ターゲット配列(rbuf)は、(number_of_ranks * のストライド)の整数を格納できます。

あなたは完全に固定サイズストライドを無視して、あなたがそれらを知っていれば、プロセスごとに個別にdisplsrcountsを設定することができます。あなたがそれらを知らない場合は、MPIフォーラムのページの最後の例を見てください。

いずれの場合でも、データ(例:array [i])では単一ポインタを使用していて、倍精度ではないと仮定します(array [i] [j]など)。これには、正しいインデックスを設定するために多少の努力が必要ですが、MPIや場合によってはより高速に使用する方が簡単です。

関連する問題