- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I get a SIGSEGV when running the following code
[fortran]
type t
real, allocatable :: a(:)
end type t
type(t) :: data
allocate(data%a(0))
print*, size(data[1]%a)
end program
[/fortran]
If, instead of the last line I put
[fortran]
print*, size(data%a)
[/fortran]
it runs successfully by printing 0 for each image. In principle I could work out the problem by using 'allocated' statements, but
[fortran]
allocated(data[1]%a)
[/fortran]
produces
[plain]
The argument to the ALLOCATED intrinsic cannot be a coindexed object.
[/plain]
On the other hand, using 'allocated(data%a)' correctly prints T for each image, but I specifically need to use the square brackets with either 'size' or 'allocated' in my code.
Thanks
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, Raul
I have checked your problem and reproduced it.
Do you really need to allocate with length zero? If I modify to length 1, there is no error for size(data[1]%a).
Seems the zero size allocated array cannot be accessed by other image, but only by local image, since there is no actual memory associated it.
I checked the Fortran 2008 standard and cannot find a specific rule for zero length allocation, so I want to understand whether your usage is reasonable and if compiler should support this.
Thank you
Yolanda
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Generally it would not be a problem, but it can happen that I have less data points than the number of cpus. The code tries to distribute the input data equally over all images but then some images will get no data. The problem arises at the end of my program, where the first image gathers the results from all images and writes to a file (one resulting number per input data point). I agree that creating a zero length array is suspicious. Instead, I could simply leave it deallocated. But what does the standard say about statements such as 'allocated
(
data
[1]%a)
', which also fails?
In the end it's not a major issue and I have already written a workaround. Still, I would like to keep the code as clean as possible.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Raul
Thank you for the explaining.
I have confirmed that the standard does support zero length allocated array. I'm going to enter it in our problem tracking system. I will let you know when I have an update on this issue.
For allocated itrinsics, the standard does not require the argument to be an indexed object. Supported arguments are an allocatable array or scalar.
Thanks,
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
some comments:
- Your code is not conforming in that you need to insert a synchronization statement (SYNC ALL) after the ALLOCATE statement. Otherwise there will be a race condition, because the SIZE query on a different image may execute before image 1 allocates the object (to whatever size). Unfortunately even with the additional statement the crash persists, so I agree that there is a bug in the compiler, because zero size is permitted for arrays.
- Using the ALLOCATED intrinsic on a coindexed object is indeed not possible. The standard says that the argument of ALLOCATED must be allocatable, but remote allocation is not supported in the language.
Regards
Reinhold
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for the comments.
In my actual code I believe all the necessary sync alls are present so that does not seem to be a problem. Also, if I use an auxiliary variable like this
[fortran]
type t
real, allocatable :: a(:)
end type t
type(t) :: data
allocate(data%a(0))
tmp = data[1]
print*, size(tmp%a)
end program
[/fortran]
then it works but now it fails with any nonzero length array.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, Raul
This has been fixed in Intel(R) Parallel Studio XE Composer Edition for Fortran Linux* 2015.
'allocated(data[1]%a)' statement should work as well.
However I will still get an MPI error for getting size(data[1]%a) :
$ ifort -coarray=shared test.f90
$ ./a.out
Internal ICAF error: The indirect put/get memory address is out of range for the mpi window.
application called MPI_Abort(comm=0x84000000, 3) - process 2
Thank you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
With ifort 15.0.1 I still get an error with all three cases: using allocated(data[1]%a), size(data[1]%a), and using an auxiliary variable. Perhaps in some newer version this behavior will be changed.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page