- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi all.
If I compile the following program with
ifort -m32 -heap-arrays test.f
the array in mytest2() is allocated on the heap, but the one in mytest() is not. According to the documentation, the -heap-arrays flag should put all automatic arrays on the heap. Am I misunderstanding the documentation? Is there a way to force the array in mytest to be allocated on the heap instead of on the stack or in static data?
Regards,
Mark
program test
implicit none
integer i,mytest,mytest2
i=mytest()
i=mytest2(100000)
stop
end
function mytest
implicit none
integer mytest
automatic bigarray
integer bigarray(100000)
integer i,j
do i=1,100000
bigarray(i)=i
enddo
do i=1,100000
j=j+bigarray(i)
enddo
mytest=j
return
end
function mytest2(isize)
implicit none
integer mytest2,isize
integer bigarray(isize)
integer i,j
do i=1,100000
bigarray(i)=i
enddo
do i=1,100000
j=j+bigarray(i)
enddo
mytest2=j
return
end
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
An interesting question.
The array in mytest is not an automatic array - not by the definition of the language. The AUTOMATIC statement you used is an extension and effectively means "non-static". I do see that, when compiled without optimization, this array is indeed put on the stack, even with -heap-arrays. With optimization, the compiler is able to compute the function value without creating the array at all.
The idea of -heap-arrays was to control allocation of temporaries and "automatic arrays" in the Fortran standard sense of local arrays whose bounds are determined by run-time expressions. I admit that the documentation isn't terribly clear on this and will discuss it with the development team.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I looked closer at the documentation and it does explain this behavior:
In Fortran, an automatic array gets its size from a run-time expression. For example: RECURSIVE SUBROUTINE F( N ) INTEGER :: N REAL :: X ( N ) ! an automatic array REAL :: Y ( 1000 ) ! an explicit-shape local array on the stack Array X in the example above is affected by the heap-array option; array Y is not.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ah, OK - I was assuming that the "automatic" keyword made an array automatic :).
So there is no way currently to ask that explicit-shape local arrays be allocated on the heap without doing it manually?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Correct. You would make the array ALLOCATABLE and allocate it. This is better than depending on compiler switches, anyway.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page