program testFence ! attempt to mimic how far 'occam' code gets before hanging use mpi implicit none integer, parameter:: arraySize=1000, maxFence=12 integer:: array1(1:arraySize), array2(1:arraySize), temp1, temp2, temp3 integer(kind=MPI_ADDRESS_KIND):: winSize, iDisp, mDisp integer:: iLoop, mLoop, myRank, mpierror, win_1, win_2, bytes, numPEs integer:: out, remain ! for how many loops integer, parameter:: iLoop0 = 100, mLoop0=1, iLoop1 = 50, mLoop1=900 call MPI_INIT(MPIerror) call mpi_comm_size(mpi_comm_world, numPEs, MPIerror) call MPI_COMM_RANK(MPI_COMM_WORLD, myRank, MPIerror) ! set where to write output to out = 6 ! create windows call mpi_type_size(mpi_integer, bytes, mpierror) winSize = size(array1) * bytes call mpi_win_create(array1, winSize, bytes, mpi_info_null, mpi_comm_world, win_1, mpierror) call mpi_win_create(array2, winSize, bytes, mpi_info_null, mpi_comm_world, win_2, mpierror) call mpi_win_fence(0, win_1, mpierror) call mpi_win_fence(0, win_2, mpierror) if (myRank.EQ.0) then iDisp = 0 do iLoop = 1, iLoop0 write(*,*) 'iDisp=', iDisp call flush(101) call mpi_get(temp1, 1, mpi_integer, 1, iDisp, 1, mpi_integer, win_1, mpierror) call mpi_win_fence(0, win_1, mpierror) mDisp = 0 do mLoop =1, mLoop0 write(*,*) 'mDisp=', mDisp call mpi_get(temp2, 1, mpi_integer, 1, mDisp, 1, mpi_integer, win_2, mpierror) call mpi_win_fence(0, win_2, mpierror) mDisp = mDisp + 1 end do iDisp = iDisp + 1 end do write(*,*) 'done all gets: need to balance Fences' do remain = 1, (iLoop1-iLoop0) call mpi_win_fence(0, win_1, mpierror) end do do remain = 1, (iLoop1*mLoop1 - iLoop0*mLoop0) call mpi_win_fence(0, win_2, mpierror) end do elseif (myRank.EQ.1) then iDisp = 0 do iLoop = 1, iLoop1 write(*,*) 'iDisp=', iDisp call flush(101) call mpi_get(temp1, 1, mpi_integer, 1, iDisp, 0, mpi_integer, win_1, mpierror) call mpi_win_fence(0, win_1, mpierror) mDisp = 0 do mLoop =1, mLoop1 write(*,*) 'mDisp=', mDisp call mpi_get(temp2, 1, mpi_integer, 1, mDisp, 0, mpi_integer, win_2, mpierror) call mpi_win_fence(0, win_2, mpierror) mDisp = mDisp + 1 end do iDisp = iDisp + 1 end do write(*,*) 'done all gets: need to balance Fences' do remain = 1, (iLoop0-iLoop1) call mpi_win_fence(0, win_1, mpierror) end do do remain = 1, (iLoop0*mLoop0 - iLoop1*mLoop1) call mpi_win_fence(0, win_2, mpierror) end do end if ! free windows call mpi_win_free(win_1, mpierror) call mpi_win_free(win_2, mpierror) call mpi_finalize(mpierror) end program testFence