| // RUN: %libomp-compile-and-run |
| // XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16 |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "omp_testsuite.h" |
| |
| #ifndef N |
| #define N 750 |
| #endif |
| |
| int test_doacross() { |
| int i, j; |
| // Allocate and zero out the matrix |
| int *m = (int *)malloc(sizeof(int) * N * N); |
| for (i = 0; i < N; ++i) { |
| for (j = 0; j < N; ++j) { |
| m[i * N + j] = 0; |
| } |
| } |
| // Have first row and column be 0, 1, 2, 3, etc. |
| for (i = 0; i < N; ++i) |
| m[i * N] = i; |
| for (j = 0; j < N; ++j) |
| m[j] = j; |
| // Perform wavefront which results in matrix: |
| // 0 1 2 3 4 |
| // 1 2 3 4 5 |
| // 2 3 4 5 6 |
| // 3 4 5 6 7 |
| // 4 5 6 7 8 |
| #pragma omp parallel shared(m) |
| { |
| int row, col; |
| #pragma omp for ordered(2) |
| for (row = 1; row < N; ++row) { |
| for (col = 1; col < N; ++col) { |
| #pragma omp ordered depend(sink : row - 1, col) depend(sink : row, col - 1) |
| m[row * N + col] = m[(row - 1) * N + col] + m[row * N + (col - 1)] - |
| m[(row - 1) * N + (col - 1)]; |
| #pragma omp ordered depend(source) |
| } |
| } |
| } |
| |
| // Check the bottom right element to see if iteration dependencies were held |
| int retval = (m[(N - 1) * N + N - 1] == 2 * (N - 1)); |
| free(m); |
| return retval; |
| } |
| |
| int main(int argc, char **argv) { |
| int i; |
| int num_failed = 0; |
| for (i = 0; i < REPETITIONS; i++) { |
| if (!test_doacross()) { |
| num_failed++; |
| } |
| } |
| return num_failed; |
| } |