Diagnostic 15541: Loop was not vectorized: outer loop was not auto-vectorized: consider using SIMD directive.

Product Version: Intel® Visual Fortran Compiler XE 15.0 or a later version

Cause:

The vectorization report generated when using Visual Fortran Compiler's optimization options ( /O2 /Qopt-report:2 /Qopt-report-phase:vec ) states that loop was not vectorized due to vector dependence - outer loop depends on inner loop.

Example:

An example below will generate the following remark in optimization report:

subroutine foo(a, n1, n)
        implicit none
        integer :: n, n1
        integer :: i, j
	real :: a(n,n1)
      
        do i=1,n
            a(j,i) = a(j-1,i)+1 
			  
            do j=1,n
                a(j,i) = a(j-1,i)+1       
            end do
        end do
end subroutine foo

ifort -c /O2 /Qopt-report:2 /Qopt-report-phase:vec /Qopt-report-file:stdout f15541.f90

(ifort -c -O2 -qopt-report2  f15541.f90 for Linux)

Begin optimization report for: FOO

    Report from: Interprocedural optimizations [ipo]

INLINE REPORT: (FOO) [1] f15541.f90(1,12)

    Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par]

LOOP BEGIN at f15541.f90(7,9)
   remark #15541: outer loop was not auto-vectorized: consider using SIMD directive

   LOOP BEGIN at f15541.f90(10,13)
   <Multiversioned v1>
      remark #25228: Loop multiversioned for Data Dependence
      remark #15344: loop was not vectorized: vector dependence prevents vectorization. First dependence is shown below. Use level 5 report for details
      remark #15346: vector dependence: assumed FLOW dependence between  line 11 and  line 11
      remark #25439: unrolled with remainder by 2
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 3
   LOOP END

   LOOP BEGIN at f15541.f90(10,13)
   <Remainder, Multiversioned v1>
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 1
   LOOP END

   LOOP BEGIN at f15541.f90(10,13)
   <Multiversioned v2>
      remark #15304: loop was not vectorized: non-vectorizable loop instance from multiversioning
      remark #25439: unrolled with remainder by 2
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 3
   LOOP END

   LOOP BEGIN at f15541.f90(10,13)
   <Remainder, Multiversioned v2>
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 1
   LOOP END
LOOP END

 

Resolution:

Using !DIR$ SIMD directive results in outer loop being vectorized, as shown:

subroutine foo(a, n1, n)
        implicit none
        integer :: n, n1
        integer :: i, j
	real :: a(n,n1)
      !DIR$ SIMD  
        do i=1,n
	  a(j,i) = a(j-1,i)+1 
			  
            do j=1,n
                a(j,i) = a(j-1,i)+1       
            end do
        end do
end subroutine foo

ifort -c /O2 /Qopt-report:2 /Qopt-report-phase:vec /Qopt-report-file:stdout f15541.f90
(ifort -c -O2 -qopt-report2  f15541.f90 for Linux)

Begin optimization report for: FOO

    Report from: Interprocedural optimizations [ipo]

INLINE REPORT: (FOO) [1] f15541.f90(1,12)


    Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par]


LOOP BEGIN at f15541.f90(7,9)
   remark #15301: SIMD LOOP WAS VECTORIZED

   LOOP BEGIN at f15541.f90(10,13)
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 1
   LOOP END
LOOP END

LOOP BEGIN at f15541.f90(7,9)
<Remainder loop for vectorization>

   LOOP BEGIN at f15541.f90(10,13)
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 2
   LOOP END
LOOP END

 

See also:

Requirements for Vectorizable Loops

Vectorization Essentials

Vectorization and Optimization Reports

Back to the list of vectorization diagnostics for Intel® Fortran

For more complete information about compiler optimizations, see our Optimization Notice.