- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I report a bug with matmul using a pointer on an array of size >= 1024, and if you add two matmul the limit size is 724 ! ifort v12.1
Pat!
Here is the example:
[fortran]program test implicit none double precision,dimension(:,:),allocatable :: mat double precision,dimension(:),allocatable,target :: tp double precision,dimension(:,:),pointer :: tp1 integer:: n do n=1,10000 allocate(mat(n,n),tp(n)) call random_number(tp) tp1(1:n,1:1)=>tp(1:n) mat=matmul(tp1,transpose(tp1)) ! segfault at n=1024 mat=matmul(tp1,transpose(tp1))+matmul(tp1,transpose(tp1)) ! segfault at n=724 deallocate(mat,tp) print *,'n',n end do end program test [/fortran]
Link Copied
4 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Enable heap arrays .OR. increase your stack size.
The compiler (as you have configured) is producing code that creates temporary objects (arrays) on the stack. With the heap arrays option you can specify a size threashold where temp objects larger than the threashold are allocated from heap as opposed to stack.
Jim Dempsey
The compiler (as you have configured) is producing code that creates temporary objects (arrays) on the stack. With the heap arrays option you can specify a size threashold where temp objects larger than the threashold are allocated from heap as opposed to stack.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok thanks, i forgot to check that.
But i'm confused, when i compile with the check all option, the compiler doesn't throw any warning that he creates temporary arrays, is that normal ? I suppose it's the pointer that creates the temp array ?
Is there any way to code that, in a way it doesn't create temp array ?
Thanks
Pat
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If the compiler threw warnings for every statement that caused it to generate temporaries, the output would be voluminous with large input source codes.
It is not the use of a pointer that induces creation of temporaries, but expressions such as
matmul(tp1,transpose(tp1))
Space for the transpose and space for the product may be needed, although the compiler-optimizer can analyze the situation and decide if one or more temporary arrays can be dispensed with.
It is not the use of a pointer that induces creation of temporaries, but expressions such as
matmul(tp1,transpose(tp1))
Space for the transpose and space for the product may be needed, although the compiler-optimizer can analyze the situation and decide if one or more temporary arrays can be dispensed with.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I don't agree with you , doing a matmul with two large 2D array don't exceed stack limit .But when using a pointer to that array it does, which mean when you pass a pointer it create a temporary array (only with allocatable),is that a good behavior ? why not using the pointer directly ? If you use the transpose intrisic ,it will create the temp array to store the result , that i understand.So using a pointer for matmul and result from function not store into variable create temp array in matmul
Pat
[fortran]program test implicit none double precision,dimension(:,:),allocatable,target :: mat,mat2,mat3 double precision,dimension(:,:),pointer :: tp1 integer:: n n=1024 allocate(mat(n,n),tp(n),mat2(n,n),mat3(n,n) ) call random_number(mat2) call random_number(mat3) tp1=>mat3 mat=matmul(mat2,tp1) ! segfault at n=1024 deallocate(mat,tp,mat2,mat3) print *,'n',n end program test[/fortran]

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page