MPIを使用して行列と行列(A * B)を乗算しようとしています。行列Bを列B = [b1、... bn]に分割し、一連の乗算ci = A * biを実行します。問題は、結果の列を収集しているときに、順序が間違っているように見える場合があることです。したがって、[c1、... cn]の代わりに、たとえば[c2、c1、c4、..]を取得します。
MPI_Scatter(matrix,MM,MPI_INT,part_of_matrix,MM,MPI_INT,0,MPI_COMM_WORLD);
for (i=0; i<n; i++) {
get_block_of_matrix(block,part_of_matrix,M,n,i);
matvect(tmp,val,I,J,M,nnz,block);
for (j=0; j<M; j++)
result[M*i+j]=tmp[j];
}
MPI_Gather(result, MM, MPI_INT, res, MM, MPI_INT, 0, MPI_COMM_WORLD);
上記のコードスニペットからは問題は明らかではありません。完全なソースコードを見ると、関数にたどり着きますtakevect
。内部のインデックス作成が間違っています。次のようになります。
void takevect(int *temp,int *matr, int size1, int size2, int i) {
int j;
for (j=0; j<size1; j++) temp[j]=matr[size1*i+j];
}
size1
等しいsize2
(そしてmatr
対称的である)ので、1つのプロセスを使用するときは幸運です。ご覧のとおり、size2
もう必要ありません。
さらに、この関数を完全に削除して、次のように短縮することができます。
MPI_Scatter(S,MM,MPI_INT,buf_S,MM,MPI_INT,0,MPI_COMM_WORLD);
for (i=0; i<local_n; i++)
matvect(buf_res+i*M,val,I,J,M,nnz,buf_S+i*M);
MPI_Gather(buf_res, MM, MPI_INT, res, MM, MPI_INT, 0, MPI_COMM_WORLD);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加