#define N 30 #define M 3 int a[N][M], b[N][M], c[N][M]; int main() { int x, y, shift; int j = 0; for (int i = 0; i < N; i++) { a[i][0] = (i+1)*32; a[i][1] = (i+1)*17; a[i][2] = (i+1)*11; b[i][0] = (i+1)*7; b[i][1] = (i+1)*5; b[i][2] = (i+1)*3; } x = 0; #pragma omp parallel for simd collapse(2) reduction(inscan,+: x) private(shift) for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { x += a[i][j]; x += b[i][j]; #pragma omp scan inclusive(x) shift = i + 29*j; c[i][j] = x + shift; } y = 0; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { y += a[i][j] + b[i][j]; if (c[i][j] != y + i + 29*j) __builtin_abort (); } if (x != y) __builtin_abort (); x = 0; #pragma omp parallel for simd collapse(2) reduction(inscan,+: x) private(shift) for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { shift = i + 29*j; c[i][j] = x + shift; #pragma omp scan exclusive(x) x += a[i][j]; x += b[i][j]; } y = 0; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { if (c[i][j] != y + i + 29*j) __builtin_abort (); y += a[i][j] + b[i][j]; } if (x != y) __builtin_abort (); return 0; }