Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Temporary array creation

Michael_C_5
Beginner
2,297 Views

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

0 Kudos
21 Replies
Steven_L_Intel1
Employee
259 Views

I expect this problem to be resolved in the next major release (second half of 2016).

0 Kudos
Reply