我开辟了一片共享内存,然后有多个进程对这篇内存进行写操作,为了保证每个进程的数据保持一致,我使用了一对儿MPI_WIN_FENCE()函数来保证其一致性,但是测试发现,MPI_WIN_FENCE()并不能保证数据一致性,在这片共享内存中有些数据会随机变化,然后我又使用了MPI_WIN_LOCK_ALL与MPI_WIN_UNLOCK_ALL函数,结果仍然会出现随机数。有人知道是什么原因嘛?
伪代码如下:
CALL MPI_Win_allocate_shared(windowsize, disp_unit, MPI_INFO_NULL, MPI_COMM_WORLD, baseptr, win_Zmn, ierr)
if (ActiveRank /= 0) then
CALL MPI_Win_shared_query( win_Zmn, 0, windowsize, disp_unit, baseptr, ierr )
end if
CALL C_F_POINTER(baseptr,NF_group_pair_1d ,[array_size] )
!以上是开辟共享内存的操作,窗口名为win_Zmn
CALL MPI_WIN_FENCE(0, win_Zmn, ierr)
!此处就是对这篇共享内存进行累加的操作,将各个进程中tmp数组中的值累加到shm_array中
shm_array(1:5000) = shm_array(1:5000) + tmp(1:5000)
CALL MPI_WIN_FENCE(0, win_Zmn, ierr)
!重复执行以上操作后会发现,shm_array数组中会有一小部分的值随机变化