Visible to Intel only — GUID: GUID-51106FD5-C4C9-43C3-BCE4-59B020559609
Visible to Intel only — GUID: GUID-51106FD5-C4C9-43C3-BCE4-59B020559609
omp simd early_exit
Extends #pragma omp simd, allowing vectorization of multiple exit loops.
Syntax
#pragma omp simd early_exit |
Description
Extends #pragma omp simd allowing vectorization of multiple exit loops. When this clause is specified:
- Each operation before last lexical early exit of the loop may be executed as if early exit were not triggered within the SIMD chunk.
- After the last lexical early exit of the loop, all operations are executed as if the last iteration of the loop was found.
- Each list item specified in the linear clause is computed based on the last iteration number upon exiting the loop.
- The last value for linear clauses and conditional lastprivates clauses are preserved with respect to scalar execution.
- The last value for reductions clauses are computed as if the last iteration in the last SIMD chunk was executed up on exiting the loop.
- The shared memory state may not be preserved with regard to scalar execution.
- Exceptions are not allowed.
Examples
The following example demonstrates how to use this pragma.
In the following example, the pragma specifies that the vector execution of the for loop is safe even though the loop may exit before the loop upper bound condition j < ub becomes false. Suppose j1 is the smallest j, between lb and ub, such that j satisfies b[j] <= 0 . If j1 and j1+1, j1+2, … are within the same (last) SIMD chunk, read of b[j1], b[j1+1], b[j1+2], … and the subsequent evaluation of <= 0 will happen unconditionally, unlike the scalar execution of the same loop. Safety of such vector evaluation is programmer's responsibility. If necessary, simdlen() clause can be used to control the SIMD chunk size.
void foo(int lb, int ub) {
float a = 0;
#pragma omp simd early_exit reduction(+:a)
for(j=lb; j<ub; j++) {
if (b[j] <= 0 )
break;
a += b[j];
}
}