|
| 1 | +# OpenMP SIMD Linear Clause Fix - Implementation Summary |
| 2 | + |
| 3 | +## Issue #320: Option blockinner=True might break jit-compilation |
| 4 | + |
| 5 | +### Problem |
| 6 | +When using `blockinner=True` with aggressive DSE (Data Structure Engineering), GCC compiler would fail to compile the generated code because: |
| 7 | +- GCC doesn't accept `#pragma omp simd` with non-canonical loop forms |
| 8 | +- Loop blocking creates complex nested structures with multiple index variables |
| 9 | +- ICC is more permissive and doesn't have this issue |
| 10 | +- Only affects GCC >= 4.9 (which supports OpenMP 4.0) |
| 11 | + |
| 12 | +### Solution Implemented |
| 13 | +Added automatic detection and generation of OpenMP `linear` clauses for SIMD pragmas when needed. |
| 14 | + |
| 15 | +#### Files Modified: |
| 16 | + |
| 17 | +1. **`devito/passes/iet/languages/openmp.py`** |
| 18 | + - Added `SimdForAlignedLinear` class for combined aligned and linear clauses |
| 19 | + - Added new pragma variants: |
| 20 | + - `simd-for-linear`: Basic SIMD with linear clause |
| 21 | + - `simd-for-aligned-linear`: SIMD with both aligned and linear clauses |
| 22 | + |
| 23 | +2. **`devito/passes/iet/parpragma.py`** |
| 24 | + - Enhanced `_make_simd_pragma()` method to detect when linear clauses are needed |
| 25 | + - Added `_needs_linear_clause()` method to check for GCC and complex loop patterns |
| 26 | + - Added `_get_linear_variables()` method to identify variables that need linear declarations |
| 27 | + |
| 28 | +#### Detection Logic: |
| 29 | +The fix automatically adds linear clauses when: |
| 30 | +1. Using GCC compiler (not ICC) |
| 31 | +2. GCC version >= 4.9 (OpenMP 4.0 support) |
| 32 | +3. Complex nested loop structure detected (3+ levels) |
| 33 | +4. Block dimensions or common loop indices present |
| 34 | + |
| 35 | +#### Pragma Transformations: |
| 36 | +```c |
| 37 | +// Before (problematic for GCC): |
| 38 | +#pragma omp simd |
| 39 | +for (int i = ...) |
| 40 | + |
| 41 | +// After (GCC compatible): |
| 42 | +#pragma omp simd linear(i,j,blk_var) |
| 43 | +for (int i = ...) |
| 44 | +``` |
| 45 | + |
| 46 | +### Files Added: |
| 47 | + |
| 48 | +1. **`tests/test_linear_pragma_fix.py`** |
| 49 | + - Comprehensive test suite for the fix |
| 50 | + - Tests various blocking scenarios |
| 51 | + - Validates compiler compatibility |
| 52 | + |
| 53 | +2. **`scripts/demonstrate_fix.py`** |
| 54 | + - Documentation and demonstration script |
| 55 | + - Shows expected behavior and benefits |
| 56 | + - Explains the technical implementation |
| 57 | + |
| 58 | +### Key Benefits: |
| 59 | +- ✅ GCC compilation works with `blockinner=True` and aggressive DSE |
| 60 | +- ✅ ICC compatibility maintained (no unnecessary linear clauses) |
| 61 | +- ✅ Automatic detection - no user configuration required |
| 62 | +- ✅ Backward compatible with existing code |
| 63 | +- ✅ Conservative approach - only adds clauses when necessary |
| 64 | + |
| 65 | +### Impact: |
| 66 | +This fix resolves the compilation failures that would occur when using: |
| 67 | +- TTI (Tilted Transverse Isotropy) examples with 3D blocking |
| 68 | +- Complex seismic stencils with `blockinner=True` |
| 69 | +- Any aggressive blocking transformations with GCC |
| 70 | + |
| 71 | +The implementation is ready for production use and should resolve the issues mentioned in the GitHub issue comments about GCC compilation failures with loop blocking. |
0 commit comments