Diagnostic 15520: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria

ID 标签 689755
已更新 5/2/2018
版本 Latest
公共

This diagnostic message is emitted from Intel(R) C++ Compiler 15.0 and above

remark #15520: loop was not vectorized: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria

Cause:

More than one exit point in the loop. In most cases, a loop must have a single entry and a single exit point in order to be auto-vectorized. 

Example:

int no_vec(float a[], float b[], float c[]) { int i = 0.; while (i < 100) { a[i] = b[i] * c[i]; // this is a data-dependent exit condition: if (a[i] < 0.0) break; ++i; } return i; }

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15520.c
...
LOOP BEGIN at d15520.c(4,9)
   remark #15520: loop was not vectorized: loop with multiple exits cannot be vectorized unless it meets search loop idiom criteria   [ d15520.c(7,11) ]
LOOP END
===========================================================================

Workarounds:

Simple search loops are recognized by the compiler and can be vectorized if they are written as a "for" loop, e.g.:

int foo(float *a, int n){ int i; for (i=0;i<n;i++){ if (a[i] == 0){ break; } } return i; }

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15524.c
...
LOOP BEGIN at d15524.c(3,3)
   remark #15300: LOOP WAS VECTORIZED
LOOP END  

More complicated loops such as the original example can be vectorized using a "for" loop preceded by an OpenMP SIMD directive along with an early_exit clause:

int no_vec(float a[], float b[], float c[]) { int i; #pragma omp simd early_exit for(i=0; i<100; i++) { a[i] = b[i] * c[i]; // this is a data-dependent exit condition: if (a[i] < 0.0) break; } return i; }

$   icc -c -qopt-report-file=stderr -qopt-report-phase=vec d15520_b.c
...
LOOP BEGIN at d15520_b.c(5,13)
   remark #15301: OpenMP SIMD LOOP WAS VECTORIZED
LOOP END

"