Hi All,
Just started playing with coarrays, and have this simple program
! This looks at a simple coarray version of doing a numerical gradient program CoarrayTest2 implicit none real(8), allocatable:: cntl(:), grad(:)[:], gradF77(:) real(8) fcn integer n[*] character (len=10) junk if (this_image() == 1 ) then write(*,*) 'Number of images: ', num_images() write(*,'(a,$)') 'Enter size of vector: ' read(*,*) n end if sync all n = n[1] ! pass n to all images allocate ( cntl(n), grad(n)[*], gradF77(n) ) cntl = 0. ! initialize vector call fcnAndGrad (n, cntl, fcn, grad) gradF77 = grad write(*,*) 'grad(', this_image(), ') = ', gradF77 stop end program CoarrayTest2 subroutine fcnAndGrad (n, cntl, fcn, grad) implicit none integer n ! it appears that you don't have to define n as coarray in subprogram if not using? real(8) cntl(n) real(8) fcn real(8) grad(n)[*] ! local declarations real(8) delA, fcnDel, aHold integer i, myImg, noImg myImg = this_image() noImg = num_images() call fcnValue (n, cntl, fcn) ! get the value of fcn for nominal a do i=myImg, n, noImg delA = real(i) aHold = cntl(i) cntl(i) = cntl(i) + delA ! perturb a vector element call fcnValue (n, cntl, fcnDel) grad(i)[1] = (fcnDel - fcn)/delA ! only modify grad on image 1 cntl(i) = aHold end do sync all ! wait for all images to finish grad = grad[1] ! broadcast completed gradient to all images return end subroutine fcnAndGrad subroutine fcnValue (n, cntl, fcn) implicit none integer n real(8) cntl(n), fcn fcn = sum(cntl)**2 return end subroutine fcnValue
This compiles and runs fine under Parallel Studio XE 2016 Update 2 under Windows, and it compiles fine under same version of PSXE for Linux, but when I run it (Centos 7, 3.10.0-229.4.2.el7.x86_64), it produces segment faults, suc as:
Number of images: 8 Enter size of vector: 1 forrtl: severe (174): SIGSEGV, segmentation fault occurred In coarray image 1 Image PC Routine Line Source a.out 0000000000480D85 Unknown Unknown Unknown a.out 000000000047E9A7 Unknown Unknown Unknown a.out 0000000000455354 Unknown Unknown Unknown a.out 0000000000455166 Unknown Unknown Unknown a.out 0000000000435276 Unknown Unknown Unknown a.out 00000000004051E0 Unknown Unknown Unknown libpthread.so.0 00007FE3F0099100 Unknown Unknown Unknown libicaf.so 00007FE3F05AC554 Unknown Unknown Unknown a.out 00000000004041D9 Unknown Unknown Unknown a.out 000000000040399E Unknown Unknown Unknown libc.so.6 00007FE3EFCEAB15 Unknown Unknown Unknown a.out 00000000004038A9 Unknown Unknown Unknown application called MPI_Abort(comm=0x84000000, 3) - process 0 Fatal error in MPI_Win_lock: Wrong synchronization of RMA calls , error stack: MPI_Win_lock(167)...: MPI_Win_lock(lock_type=235, rank=4, assert=0, win=0xa0000000) failed MPIDI_Win_lock(3068): Wrong synchronization of RMA calls forrtl: error (69): process interrupted (SIGINT) In coarray image 4 Image PC Routine Line Source a.out 0000000000480D85 Unknown Unknown Unknown a.out 000000000047E9A7 Unknown Unknown Unknown a.out 0000000000455354 Unknown Unknown Unknown a.out 0000000000455166 Unknown Unknown Unknown a.out 0000000000435276 Unknown Unknown Unknown a.out 0000000000405A2E Unknown Unknown Unknown libpthread.so.0 00007FAD7567B100 Unknown Unknown Unknown libpthread.so.0 00007FAD756776D3 Unknown Unknown Unknown libmpi_mt.so.4 00007FAD74982585 Unknown Unknown Unknown libmpi_mt.so.4 00007FAD747DC7FB Unknown Unknown Unknown libmpi_mt.so.4 00007FAD74800751 Unknown Unknown Unknown libmpi_mt.so.4 00007FAD74AA2316 Unknown Unknown Unknown libicaf.so 00007FAD75B91F45 Unknown Unknown Unknown libicaf.so 00007FAD75B8F0FB Unknown Unknown Unknown a.out 000000000040429A Unknown Unknown Unknown a.out 000000000040399E Unknown Unknown Unknown libc.so.6 00007FAD752CCB15 Unknown Unknown Unknown a.out 00000000004038A9 Unknown Unknown Unknown application called MPI_Abort(comm=0x84000000, 3) - process 3 Fatal error in MPI_Win_lock: Wrong synchronization of RMA calls , error stack: MPI_Win_lock(167)...: MPI_Win_lock(lock_type=235, rank=5, assert=0, win=0xa0000000) failed MPIDI_Win_lock(3068): Wrong synchronization of RMA calls
Completely trivial coarray programs do compile and run under the linux, just not the one above. I suspect I have violated some coarray standard, but I can't see it yet, and I'm not sure why it runs fine under Windows 10 version of PSXE 2016.
thanks!