2013-10-21 55 views
1

這與「使用MPI_Send/Recv處理Fortran 90中的多灰數組的塊」上的較早線程相關。我的陣列是真實的,3調光說5 5 5,即X(1:5,1:5,1:5)如果我想給我的數組的下一部分說使用FORTRAN 90中的MPI_Type_Create_Subarray 90

x(2:3,2:5,4:5) 

到從0 PROC 1,我使用了以下測試程序

program mpi 
implicit none 
include "mpif.h" 

integer :: ierr,myid,nprocs,status(mpi_status_size),i,j,k,& 
&   starts(3),newsize(3),oldsize(3) 
real :: x(1:5,1:5,1:5),y(1:5,1:5,1:5),z(2:3,2:5,4:5) 
integer :: arr 

call mpi_init(ierr) 
call mpi_comm_rank(mpi_comm_world,myid,ierr) 
call mpi_comm_size(mpi_comm_world,nprocs,ierr) 

if(myid == 0) then 
    x = 0.0 
    call random_number(x) 
    starts = (/2,2,4/) 
    newsize = (/2,4,2/) 
    oldsize = (/5,5,5/) 
    call mpi_type_create_subarray(3,oldsize,newsize,starts,mpi_order_fortran, & 
    & mpi_real,arr,ierr) 
    call mpi_type_commit(arr,ierr) 
    call mpi_send(x,1,arr,1,1,mpi_comm_world,ierr) 
    do i = 2,3 
    do j = 2,5 
     do k = 4,5 
     print*,'#1',x(i,j,k) 
     enddo 
    enddo 
    enddo 
    print*,' ' 
else 
    y = 0.0 
    call mpi_recv(z,16,mpi_real,0,1,mpi_comm_world,status,ierr) 
    do i = 2,3 
    do j = 2,5 
     do k = 4,5 
     print*,'#2',z(i,j,k) 
     enddo 
    enddo 
    enddo 
endif 

call mpi_finalize(ierr) 

stop 
end 

我正在與該「開始」陣列運行時錯誤。它的元素必須是0或1.我在這裏錯過了什麼?這是什麼正確的形式?我無法找到使用此的FORTRAN示例。

回答

0

該標準規定array_of_starts(您的starts)開始索引爲零,而不是一個!因此,如果Fortran編號從1開始,則必須減去1。因此,您的starts陣列應該是(/ 1, 1, 3 /)

MPI 3.0 Standard, Ch. 4.1.3

給用戶的建議。在Fortran程序中,數組索引從1開始 ,如果 子數組的特定維度的起始座標爲N,則該維度的array_of_starts中的條目爲 n-1。 (向用戶建議結束)

+0

感謝您的信息。如果數組從一個負數索引開始,對於父數組x(-n:n,-m:m),我想發送數據塊x(-2:0,:)?現在應該是什麼開始數組? – Madhurjya

+1

@Madhurjya,'-2'與'-n'的偏移量是'(-2) - ( - n)= n-2'。對於第二維,偏移量爲「0」。 –

+0

謝謝Alexander和Hristo!討論對我有很大的幫助。 – Madhurjya