Quantcast
Channel: Intel® Fortran Compiler
Viewing all articles
Browse latest Browse all 3270

Temporary array creation

$
0
0

I'm getting the famous warning of a temporary array created, forrtl: warning (406): fort: (1): In call to XXXX, an array temporary was created for argument #N. However, I create simple code to mimic the larger code, and I don't get the same warning. See code below. Essentially I'm passing in a subset array into subroutine XXXX, and indexing on the last index, which should give me a contiguous memory chunk. What else could cause this temporary array creation? ifort version 16.0.0

Code:

program testArrayPassSubroutine
        integer :: sze,i
        real, dimension(3,3,2) :: arr
        real, dimension(2,3,3) :: arr2

        !do k=1,2
        !       do j=1,3
        !               do i=1,3
        !                       arr(i,j,k) = (k-1)*9 + (j-1)*3 + i
        !               enddo
        !       enddo
        !enddo

        !do k=1,3
        !        do j=1,3
        !                do i=1,2
        !                        arr2(i,j,k) = (k-1)*9 + (j-1)*3 + i
        !                enddo
        !        enddo
        !enddo

        !This is like the original code, which throws the warning(406):...temporary array creation
        write(*,*) "Test1 start"
        call test(arr(:,:,1))
        write(*,*) "Test1 done"

        !This is where I would expect a warning(406), and indeed see it
        write(*,*) "Test2 start"
        call test(arr2(1,:,:))
        write(*,*) "Test2 done"

        contains
        subroutine test(a)
        integer :: i,j
        real, dimension(3,3) :: a

        do i=1,3
                do j=1,3
                        a(j,i) = j*i
                enddo
        enddo

        write(*,*) "Array",(a)
        write(*,*) ""
        end subroutine test
end program testArrayPassSubroutine

Output:

Test1 start

 Array   1.000000       2.000000       3.000000       2.000000
   4.000000       6.000000       3.000000       6.000000       9.000000

 Test1 done
 Test2 start
forrtl: warning (406): fort: (1): In call to TEST, an array temporary was created for argument #1

Image              PC                Routine            Line        Source
a.out              0000000000403876  Unknown               Unknown  Unknown
a.out              0000000000400689  MAIN__                     29  testArrayPassSubroutine.F90
a.out              00000000004004AE  Unknown               Unknown  Unknown
a.out              000000000048D9F1  Unknown               Unknown  Unknown
a.out              0000000000400389  Unknown               Unknown  Unknown
 Array   1.000000       2.000000       3.000000       2.000000
   4.000000       6.000000       3.000000       6.000000       9.000000

 Test2 done


Viewing all articles
Browse latest Browse all 3270

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>