병렬 처리에 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 보내기/수신
어레이가 연속적으로 할당되면 전체 N x M 어레이를 보내고 받는 것이 간단해집니다. :
MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);
장벽 vs 차단 보내기/받기
MPI는 차단(예: MPI_Send) 및 비차단(예: MPI_Isend)을 포함하여 다양한 통신 기능을 제공합니다. 차단 작업의 경우 통신이 본질적으로 동기화되므로 장벽이 필요하지 않습니다.
기타 MPI 기능
MPI_Send 및 MPI_Receive 외에도 보다 유연한 통신을 위해 MPI_Sendrecv를 사용하는 것이 좋습니다. 통신과 중복을 위한 MPI_Isend 및 MPI_Irecv와 같은 비차단 작업 계산합니다.
위 내용은 MPI를 사용하여 노드 간에 2D 배열을 효율적으로 보내고 받을 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!