나는 여러 프로세스에 의해 병렬로 조작되는 2D 배정 밀도 배열을 가지고 있습니다. 각 프로세스는 배열의 일부를 조작하고 모든 반복이 끝날 때마다 모든 프로세스에 2D 배열의 동일한 복사본이 있는지 확인해야합니다.MPI 브로드 캐스트 2D 배열
크기 10 * 10 및 2 개의 프로세스 (또는 프로세서)의 배열을 가정합니다. 프로세스 1 (P1)은 2D 행의 첫 번째 5 개 행 (5 * 10 = 50 개 요소)을 조작하고 P2는 마지막 5 개 행 (총 50 개 요소)을 조작합니다. 그리고 각 반복 끝에 P1이 있어야합니다. (ITS 고유의 처음 5 행 + P2의 마지막 5 행). P2는 (P1의 첫 번째 5 행 + 마지막 5 행의 길이) 있어야합니다. 시나리오가 명확하길 바란다.
아래 주어진 코드를 사용하여 브로드 캐스트하려고합니다. 그러나 내 프로그램은이 오류로 종료됩니다 : "응용 프로그램이 종료 된 문자열로 종료되었습니다 : 응답 (신호 1)".
Jonathan의 MPI_Bcast a dynamic 2d array은 이미 여기에 지적한 바와 같이 인접한 2D 메모리 할당자를 사용하고 있습니다. 하지만 여전히 같은 오류가 발생합니다.
누군가 나를 도울 수 있습니까?
내 코드 :
double **grid, **oldgrid;
int gridsize; // size of grid
int rank, size; // rank of current process and no. of processes
int rowsforeachprocess, offset; // to keep track of rows that need to be handled by each process
/* allocation, MPI_Init, and lots of other stuff */
rowsforeachprocess = ceil((float)gridsize/size);
offset = rank*rowsforeachprocess;
/* Each process is handling "rowsforeachprocess" #rows.
* Lots of work done here
* Now I need to broadcast these rows to all other processes.
*/
for(i=0; i<gridsize; i++){
MPI_Bcast(&(oldgrid[i]), gridsize-2, MPI_DOUBLE, (i/rowsforeachprocess), MPI_COMM_WORLD);
}
제 2 부 : 위의 코드는 1D 분해를 사용하여 라플라스 방정식에 대한 병렬 솔버의 일부이며 나는 마스터 노동자 모델을 사용하지 않았다. 마스터 - 작업자 모델을 사용하면 코드가 더 쉬워 집니까?
: 같은
이 보일 것이다. :) 하지만 Allgather 명령을 가르쳐 주셔서 감사합니다. 또한 이웃 한 프로세스에서 단 하나의 행만 필요로하는 모든 프로세스에 대해 여러분이 말하는 것은 많은 의미가 있습니다! 나는 그것을 시도 할 것이다. – Neo