과정 작업을 실현하는 동안 PDE 연속체 역학을 해결하기 위해 MPI 프로그램을 작성해야합니다. 다음MPI 집단 출력 특수한 형태의 인접하지 않은 3D 배열
병렬 프로그램의do i=1,XX
do j=1,YY
do k=1,ZZ
write(ifile) R(i,j,k)
write(ifile) U(i,j,k)
write(ifile) V(i,j,k)
write(ifile) W(i,j,k)
write(ifile) P(i,j,k)
end do
end do
end do
, I는 동일한 물품 : /병렬은 축 X/
따라 일어나는 다음 시퀀스 프로그램 파일 (FORTRAN)는 기입
call MPI_TYPE_CREATE_SUBARRAY(4, [INT(5), INT(ZZ),INT(YY), INT(XX)], [5,ZZ,YY,PDB(iam).Xelements], [0, 0, 0, PDB(iam).Xoffset], MPI_ORDER_FORTRAN, MPI_FLOAT, slice, ierr)
call MPI_TYPE_COMMIT(slice, ierr)
call MPI_FILE_OPEN(MPI_COMM_WORLD, cFileName, IOR(MPI_MODE_CREATE, MPI_MODE_WRONLY), MPI_INFO_NULL, ifile, ierr)
do i = 1,PDB(iam).Xelements
do j = 1,YY
do k = 1,ZZ
dataTmp(1,k,j,i) = R(i,j,k)
dataTmp(2,k,j,i) = U(i,j,k)
dataTmp(3,k,j,i) = V(i,j,k)
dataTmp(4,k,j,i) = W(i,j,k)
dataTmp(5,k,j,i) = P(i,j,k)
end do
end do
end do
call MPI_FILE_SET_VIEW(ifile, offset, MPI_FLOAT, slice, 'native', MPI_INFO_NULL, ierr)
call MPI_FILE_WRITE_ALL(ifile, dataTmp, 5*PDB(iam).Xelements*YY*ZZ, MPI_FLOAT, wstatus, ierr)
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
잘 작동합니다. 하지만 배열 dataTmp 사용에 대해 잘 모르겠습니다. 어떤 솔루션이 더 빠르고 정확합니까? 전체 프로그램에서 dataTmp와 같은 4D 배열을 사용하는 것은 어떻습니까? 아니면 다른 displacemet을 사용하여 5 개의 특수 mpi_type을 만들어야합니다.
대답 해 주셔서 감사합니다. 하지만 불행히도 파일 형식을 변경할 수 없습니다. 나는이 형식이 불편하다는 것을 분명히 이해하고 있지만 나는 할 수 없다. 저는 MPI에서 newbee입니다. 당신이 묘사 한 것에 대한 간단한 예를 보여줄 수 있습니까? (개별 데이터 타입 등) – Vasiliy
제 대답을 올렸을 때, @ Jonathan Dursi가 아직 답을 제공하지 않은 이유가 궁금합니다. 분명히 그는 StackOverflow의 King이라는 타이틀을 유지하기 위해 약간의 노력을 기울이고있었습니다. –
@Vasiliy, 아마도 사전 처리 및 사후 처리를 고려하여 파일을 원하는 형식으로 가져와 성능을 향상시킬 수 있습니까? 물론 변환 단계는 신속하게 이루어질 수 있지만, 충분히 큰 데이터 세트의 경우 연속되는 사전 또는 사후 변환이 불가능한 지점이 있습니다. –