1

スレーブからマスターに 2 次元配列を送信するプログラムを作成します。このようなコード:

int **hasil;
hasil=(int**)malloc(baris*sizeof(int));
for(t=0;t<baris;t++){
    hasil[t]=(int*)malloc(kolom*sizeof(int));
}

//some code to generate data

MPI_Type_contiguous(kolom, MPI_INT,&rowtype);
MPI_Type_commit(&rowtype);

if(rank==master){
    int **terima;
    int t,m,x;

    terima=(int**)malloc(baris*sizeof(int));
    for(t=0;t<baris;t++){
        terima[t]=(int*)malloc(kolom*sizeof(int));        
        for(m=0;m<kolom;m++){
            terima[t][m]=-1;
        }
    }
    for(x=1;x<numOfProc;x++){       
        MPI_Recv(&(terima[0][0]),baris,rowtype,x,99,MPI_COMM_WORLD,&status);
    }
} else {
    MPI_Send(&(hasil[0][0]),baris,rowtype,master,99,MPI_COMM_WORLD);
}

すべての配列要素が送信されない理由がわかりません。

「ハシル」について:

1 123 1234 1234 55345
2 123 1234 1234 12345
3 98765 1234 1234 12345
4 123 1234 1234 12345
5 123 1234 1234 12345
6 123 1234 1234 12345
7 123 1234 1234 12345
8 123 1234 1234 12345
9 123 1234 1234 12345
10 123 1234 1234 12345
11 123 1234 1234 12345

しかし、「terima」では:

1 123 1234 1234 55345
2 123 1234 1234 12345
3 98765 1234 1234 12345
4 123 1234 1234 12345
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1

私のコードの何が問題なのか誰か知っていますか? 私にお知らせください。

皆さんありがとう

4

2 に答える 2

1

配列の割り当てについて言われていることに加えて、間違ったバイト数を送受信しています。カウントはバリではなく1にする必要があります。

MPI_Send(&(hasil[0][0]),1,rowtype,master,99,MPI_COMM_WORLD);

これは、指定されたアドレス&(hasil [0] [0])(ちなみにhasil [0]と同じ)にサイズkolomの配列を割り当てたためです。

hasil[t]=(int*)malloc(kolom*sizeof(int));

したがって、hasil[0]からkolomバイトを超えて送信することはできません。kolomintまたは1行タイプを送信します。

また、各プロセスから何を送信したいのか、どこに保存したいのか、よくわかりません。すべてのデータをMPI_Recvの1つの場所(terima [0])に保存します。さまざまなプロセスからテリマのさまざまな場所に1行タイプのデータを次々に送受信できます。したがって、これをマスターに書き込むことができます。

for(x=1;x<numOfProc;x++){
  MPI_Recv(terima[x],1,rowtype,x,99,MPI_COMM_WORLD,&status);
}

一方、実装でhasil配列全体をすべてのスレッドからマスターに転送する場合(terimaにのみ受信する場合は、データが上書きされることに注意してください)、ループで行う必要があります。これは、 2次元配列をどのように割り当てたか:

for(i=1;i<baris;i++){
  MPI_Send(hasil[i],1,rowtype,master,99,MPI_COMM_WORLD,&status);
}

編集値のマトリックス全体を送信するには、データの割り当て方法を変更する必要があります。ポインタを含む2次元配列の代わりに、行列全体を保持できる連続したメモリを割り当てます。

int *terima;
terima=(int*)malloc(baris*kolom*sizeof(int));

次に、terima [t] [m]を記述する代わりに、線形インデックスterima [t * kolom+m]を使用して配列をアドレス指定します。これで、を使用してマトリックス全体を送受信できます。

MPI_Recv(terima,baris,rowtype,x,99,MPI_COMM_WORLD,&status);
于 2012-09-04T18:35:24.293 に答える
1

malloc ステートメントに明らかな誤りがあります。

int **hasil;
hasil=(int**)malloc(baris*sizeof(int));

行を割り当てるときは、基本的にポインターを割り当てるため、ステートメントは次のようになります。

int **hasil;
hasil=(int**)malloc(baris*sizeof(int *));

割り当て中に同じ間違いが見られterimaます。

これで問題が解決するかどうかはわかりませんが、これは確実に修正する必要があります。これを試して、私に知らせてください。

于 2012-09-04T04:05:51.290 に答える