並列処理に MPI を利用すると、特に大規模な行列を含む計算の場合、パフォーマンスに大きな利点が得られます。このようなシナリオでは、行列を複数のノードに分割すると、プロセスを大幅に最適化できます。
エッジ値共有の実装
提供されたシナリオでは、各ノードはエッジ値を共有する必要があります。その隣人たち。 MPI を使用してこれを実現するための推奨スキームは次のとおりです。
if (myrank == 0) { for (i = 0 to x) { for (y = 0 to y) { C++ CODE IMPLEMENTATION MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1...) MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1...) } } if (myrank == 1) { for (i = x+1 to xx) { for (y = 0 to y) { C++ CODE IMPLEMENTATION MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0...) MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1...) } } }
配列割り当ての最適化
メモリ管理と MPI 通信を簡素化するには、連続した要素を持つ配列を割り当てることを検討してください。 C の「多次元配列」の代わりに。これは、次のような関数を使用して実現できます。
int **alloc_2d_int(int rows, int cols) { int *data = (int *)malloc(rows*cols*sizeof(int)); int **array= (int **)malloc(rows*sizeof(int*)); for (int i=0; i<rows; i++) array[i] = &(data[cols*i]); return array; } int **A; A = alloc_2d_init(N,M);
MPI Send/Receive
配列が連続して割り当てられると、N x M 配列全体の送受信が簡単になります。 :
MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);
バリアと送受信のブロッキング
MPI は、ブロッキング (MPI_Send など) や非ブロッキング (MPI_Send など) を含む通信用の複数の機能を提供します。 MPI_Isend)。通信が本質的に同期しているため、ブロック操作の場合、バリアは不要です。
その他の MPI 関数
MPI_Send と MPI_Receive に加えて、より柔軟な通信を行うには MPI_Sendrecv の使用を検討してください。通信と計算をオーバーラップする MPI_Isend や MPI_Irecv などのノンブロッキング操作。
以上がMPI を使用してノード間で 2D 配列を効率的に送受信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。