我想通过MPI3-RMA构建一个计数器并编写这个代码,其中变量a除了第一个等级之外增加:
PROGRAM fetchAndOpTest
USE mpi
IMPLICIT NONE
INTEGER, PARAMETER :: masterRank = 0
INTEGER, PARAMETER :: ONE = 1
INTEGER :: myRank = 0
INTEGER :: numProcs = 1
INTEGER :: win, ierror
INTEGER :: a
INTEGER (KIND=MPI_ADDRESS_KIND) &
:: lowerbound, sizeofint
CALL MPI_INIT(ierror)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, myRank,ierror)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,numProcs, ierror)
CALL MPI_TYPE_GET_EXTENT(MPI_INTEGER, lowerbound,sizeofint, ierror)
CALL MPI_WIN_CREATE(a,sizeofint,sizeofint,MPI_INFO_NULL,MPI_COMM_WORLD,win,ierror)
a = 0
WRITE(*,*) "Rank ",myRank,"meldet a = ",a
CALL MPI_WIN_FENCE(0,win,ierror)
IF(myRank .NE. masterRank) THEN
CALL MPI_Fetch_and_op(ONE,a,MPI_INTEGER,masterRank,0, MPI_SUM,win,ierror)
END IF
CALL MPI_WIN_FENCE(0,win,ierror)
WRITE(*,*) "Rank ",myRank,"meldet a = ",a
CALL MPI_WIN_FREE(win,ierror)
CALL MPI_FINALIZE(ierror)
END PROGRAM fetchAndOpTest
因此,在fetch_and_op-operation之后,主等级0应该是 a == numProcs-1
. 但是 CALL MPI_Fetch_and_op(ONE,a,MPI_INTEGER, masterRank,0, MPI_SUM,win,ierror)
行会导致分段错误:
> mpirun -np 2 ./fetchAndOpTestF90.x
Rank 0 meldet a = 0
Rank 1 meldet a = 0
forrtl: severe (174): SIGSEGV, segmentation fault occurred
[...]
很难找到Fortran的RMA示例代码,但我试图擅长https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/593485的代码来解决我的问题 . 和以前一样的问题 .
使用的编译器:mpiifort