xref: /llvm-project/openmp/runtime/test/worksharing/for/omp_doacross.c (revision aa5cdafa405e32956226dcc1cacd86430ac9ad1a)
182164922SJonathan Peyton // RUN: %libomp-compile-and-run
282164922SJonathan Peyton // XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16
382164922SJonathan Peyton #include <stdio.h>
482164922SJonathan Peyton #include <stdlib.h>
582164922SJonathan Peyton #include "omp_testsuite.h"
682164922SJonathan Peyton 
782164922SJonathan Peyton #ifndef N
882164922SJonathan Peyton #define N 750
982164922SJonathan Peyton #endif
1082164922SJonathan Peyton 
test_doacross()1182164922SJonathan Peyton int test_doacross() {
1282164922SJonathan Peyton   int i, j;
1382164922SJonathan Peyton   // Allocate and zero out the matrix
1482164922SJonathan Peyton   int *m = (int *)malloc(sizeof(int) * N * N);
1582164922SJonathan Peyton   for (i = 0; i < N; ++i) {
1682164922SJonathan Peyton     for (j = 0; j < N; ++j) {
1782164922SJonathan Peyton       m[i * N + j] = 0;
1882164922SJonathan Peyton     }
1982164922SJonathan Peyton   }
2082164922SJonathan Peyton   // Have first row and column be 0, 1, 2, 3, etc.
2182164922SJonathan Peyton   for (i = 0; i < N; ++i)
2282164922SJonathan Peyton     m[i * N] = i;
2382164922SJonathan Peyton   for (j = 0; j < N; ++j)
2482164922SJonathan Peyton     m[j] = j;
2582164922SJonathan Peyton   // Perform wavefront which results in matrix:
2682164922SJonathan Peyton   // 0 1 2 3 4
2782164922SJonathan Peyton   // 1 2 3 4 5
2882164922SJonathan Peyton   // 2 3 4 5 6
2982164922SJonathan Peyton   // 3 4 5 6 7
3082164922SJonathan Peyton   // 4 5 6 7 8
3182164922SJonathan Peyton   #pragma omp parallel shared(m)
3282164922SJonathan Peyton   {
3382164922SJonathan Peyton     int row, col;
3482164922SJonathan Peyton     #pragma omp for ordered(2)
3582164922SJonathan Peyton     for (row = 1; row < N; ++row) {
3682164922SJonathan Peyton       for (col = 1; col < N; ++col) {
3782164922SJonathan Peyton         #pragma omp ordered depend(sink : row - 1, col) depend(sink : row, col - 1)
3882164922SJonathan Peyton         m[row * N + col] = m[(row - 1) * N + col] + m[row * N + (col - 1)] -
3982164922SJonathan Peyton                            m[(row - 1) * N + (col - 1)];
4082164922SJonathan Peyton         #pragma omp ordered depend(source)
4182164922SJonathan Peyton       }
4282164922SJonathan Peyton     }
4382164922SJonathan Peyton   }
4482164922SJonathan Peyton 
4582164922SJonathan Peyton   // Check the bottom right element to see if iteration dependencies were held
4682164922SJonathan Peyton   int retval = (m[(N - 1) * N + N - 1] == 2 * (N - 1));
4782164922SJonathan Peyton   free(m);
4882164922SJonathan Peyton   return retval;
4982164922SJonathan Peyton }
5082164922SJonathan Peyton 
main(int argc,char ** argv)5182164922SJonathan Peyton int main(int argc, char **argv) {
5282164922SJonathan Peyton   int i;
5382164922SJonathan Peyton   int num_failed = 0;
54*74f98554SAndrey Churbanov   if (omp_get_max_threads() < 2)
55*74f98554SAndrey Churbanov     omp_set_num_threads(4);
5682164922SJonathan Peyton   for (i = 0; i < REPETITIONS; i++) {
5782164922SJonathan Peyton     if (!test_doacross()) {
5882164922SJonathan Peyton       num_failed++;
5982164922SJonathan Peyton     }
6082164922SJonathan Peyton   }
6182164922SJonathan Peyton   return num_failed;
6282164922SJonathan Peyton }
63