Hi Anton,
The problematic statement is
allocate (c[*], source=b)
The syntax for a coarray reference that includes [ ] is required to
include the ( ) part of the syntax as well if the object is an array.
There is no syntax defined for C[*] where C is an array. This has the
side effect of not allowing the "get the shape from the source= array"
mode of allocate for allocating a coarray. It would be possible to
extend the standard to allow something like that if additional syntax
were defined and rules were added to make sure that the shape of the
source= array was the same on all images.
Another compiler gives this error for the code:
allocate (c[*], source=b)
^
ftn-402 crayftn: ERROR $MAIN, File = test.f90, Line = 12, Column = 13
The number of extents specified for this allocate object does not
match the declared rank.
It is possible (though this is just speculation) that the Intel compiler
treated C as a scalar here and the part that involved copying the values
from B caused the segfault.
Note that if you opted for this statement instead:
allocate (c(0:11,3)[*], source=b)
then there is no error at execution. The part of the allocate that
involves copying the value of the source to the allocated object is
purely local, so it does not matter that the allocated object is a coarray.
Cheers,
Bill
On 12/3/13 6:01 AM, Anton Shterenlikht wrote:
> I've asked in comp.lang.fortran usenet group,
> but got no answer, so am trying here.
> Is sourced allocation allowed for coarrays
> but the standard?
>
> This program:
>
> 1 integer, allocatable :: a(:,:)[:], b(:,:)[:], c(:,:)[:]
> 2
> 3 allocate (a(10,10)[*], source=0)
> 4
> 5 a = 0
> 6 if (this_image() .eq. 1) a=1
> 7
> 8 sync all
> 9
> 10 allocate (b(0:11,3)[*], source=0)
> 11 !allocate (c(0:11,3)[*], source=b)
> 12 allocate (c[*], source=b)
> 13
> 14 b(1:10,1:3) = a(1:10,1:3) [1]
> 15 c(1:10,1:3) = a(1:10,4:6) [1]
> 16
> 17 sync all
> 18
> 19 if ( this_image() .gt. 1) b(0,:) = c(10,:) [this_image()-1]
> 20
> 21 end
>
> compiled with ifort 14, and run with shared
> memory gives segfault:
>
> $ ./a.out
> forrtl: severe (174): SIGSEGV, segmentation fault occurred
> In coarray image 2
> Image PC Routine Line Source
> a.out 000000000046B199 Unknown Unknown Unknown
> a.out 0000000000469B10 Unknown Unknown Unknown
> a.out 00000000004392E2 Unknown Unknown Unknown
> a.out 000000000041F813 Unknown Unknown Unknown
> a.out 000000000040730B Unknown Unknown Unknown
> libpthread.so.0 00002AAAAB1B7500 Unknown Unknown Unknown
> libicaf.so 00002AAAAACD026D Unknown Unknown Unknown
> a.out 0000000000406866 Unknown Unknown Unknown
> a.out 00000000004038C6 Unknown Unknown Unknown
> libc.so.6 00002AAAAB3E4CDD Unknown Unknown Unknown
> a.out 00000000004037B9 Unknown Unknown Unknown
>
> application called MPI_Abort(comm=0x84000000, 3) - process 1
> rank 1 in job 1 newblue4_35267 caused collective abort of all ranks
> exit status of rank 1: return code 3
> $
>
> However, when line 12 is commente out
> and line 11 is used instead, the program
> runs fine.
>
> AS far as I understand the standard, the
> meaning of the two statements:
>
> allocate (c(0:11,3)[*], source=b)
> allocate (c[*], source=b)
>
> is identical. Is that not so?
>
> Is the segfault expected?
>
> Thanks
>
> Anton
>
--
Bill Long [log in to unmask]
Fortran Technical Support & voice: 651-605-9024
Bioinformatics Software Development fax: 651-605-9142
Cray Inc./Cray Plaza, Suite 210/380 Jackson St./St. Paul, MN 55101
|