xref: /llvm-project/openmp/runtime/test/tasking/omp_task_depend_iterator.cpp (revision 578b2a36b6756f91e3e22d967f98efb5ff090d25)
1*578b2a36SAnimesh Kumar // RUN: %libomp-cxx-compile-and-run
2*578b2a36SAnimesh Kumar 
3*578b2a36SAnimesh Kumar /*
4*578b2a36SAnimesh Kumar 
5*578b2a36SAnimesh Kumar This test is imported from SOLLVE: 5.0/task/test_task_depend_iterator.cpp
6*578b2a36SAnimesh Kumar SOLLVE page: https://github.com/SOLLVE/sollve_vv
7*578b2a36SAnimesh Kumar 
8*578b2a36SAnimesh Kumar OpenMP API Version 5.0 Nov 2020
9*578b2a36SAnimesh Kumar 
10*578b2a36SAnimesh Kumar This test is for the iterator modifier when used with the task depend
11*578b2a36SAnimesh Kumar clause. This modifier should create an iterator that expands to multiple values
12*578b2a36SAnimesh Kumar inside the clause they appear. In this particular test case the iterator expands into
13*578b2a36SAnimesh Kumar several values creating several dependencies at the same time.
14*578b2a36SAnimesh Kumar 
15*578b2a36SAnimesh Kumar */
16*578b2a36SAnimesh Kumar 
17*578b2a36SAnimesh Kumar #include <omp.h>
18*578b2a36SAnimesh Kumar #include <algorithm>
19*578b2a36SAnimesh Kumar #include <cstdlib>
20*578b2a36SAnimesh Kumar #include <iostream>
21*578b2a36SAnimesh Kumar #include <thread>
22*578b2a36SAnimesh Kumar #include <vector>
23*578b2a36SAnimesh Kumar #include "omp_testsuite.h"
24*578b2a36SAnimesh Kumar 
25*578b2a36SAnimesh Kumar #define N 1024
26*578b2a36SAnimesh Kumar #define FROM 64
27*578b2a36SAnimesh Kumar #define LENGTH 128
28*578b2a36SAnimesh Kumar 
test_omp_task_depend_iterator()29*578b2a36SAnimesh Kumar int test_omp_task_depend_iterator() {
30*578b2a36SAnimesh Kumar   int ptr[] = {0, 4, 5, 6, 7, 8, 9, 10, 11};
31*578b2a36SAnimesh Kumar   int cols[] = {1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8};
32*578b2a36SAnimesh Kumar   std::vector<int> threadOrder;
33*578b2a36SAnimesh Kumar   bool threadOrderError = false;
34*578b2a36SAnimesh Kumar #pragma omp parallel num_threads(8)
35*578b2a36SAnimesh Kumar   {
36*578b2a36SAnimesh Kumar #pragma omp single
37*578b2a36SAnimesh Kumar     {
38*578b2a36SAnimesh Kumar       for (int i = 0; i < 8; ++i) {
39*578b2a36SAnimesh Kumar         int pos = ptr[i], size = ptr[i + 1] - ptr[i];
40*578b2a36SAnimesh Kumar #pragma omp task depend(iterator(it = 0 : size), in : ptr[cols[pos + it]]) depend(out : ptr[i])
41*578b2a36SAnimesh Kumar         {
42*578b2a36SAnimesh Kumar #pragma omp critical
43*578b2a36SAnimesh Kumar           {
44*578b2a36SAnimesh Kumar             threadOrder.push_back(i);
45*578b2a36SAnimesh Kumar           } // end critical section
46*578b2a36SAnimesh Kumar         } // end task depend
47*578b2a36SAnimesh Kumar       }
48*578b2a36SAnimesh Kumar     } // end single
49*578b2a36SAnimesh Kumar   } // end parallel
50*578b2a36SAnimesh Kumar 
51*578b2a36SAnimesh Kumar   // store the indices of the execution order of generated tasks in idx[]
52*578b2a36SAnimesh Kumar   std::vector<int>::iterator idx[8];
53*578b2a36SAnimesh Kumar   for (int i = 0; i < 8; ++i)
54*578b2a36SAnimesh Kumar     idx[i] = std::find (threadOrder.begin(), threadOrder.end(), i);
55*578b2a36SAnimesh Kumar 
56*578b2a36SAnimesh Kumar   // verify that dependencies are met in the order
57*578b2a36SAnimesh Kumar   if (idx[0] != threadOrder.begin())
58*578b2a36SAnimesh Kumar     threadOrderError |= true;
59*578b2a36SAnimesh Kumar   if (idx[1] > idx[5] || idx[2] > idx[5])
60*578b2a36SAnimesh Kumar     threadOrderError |= true;
61*578b2a36SAnimesh Kumar   if (idx[3] > idx[6] || idx[4] > idx[6])
62*578b2a36SAnimesh Kumar     threadOrderError |= true;
63*578b2a36SAnimesh Kumar   if (idx[5] > idx[7] || idx[6] > idx[7])
64*578b2a36SAnimesh Kumar     threadOrderError |= true;
65*578b2a36SAnimesh Kumar 
66*578b2a36SAnimesh Kumar   std::sort(threadOrder.begin(), threadOrder.end());
67*578b2a36SAnimesh Kumar   for(int i = 0; i < 8; ++i)
68*578b2a36SAnimesh Kumar     threadOrderError = (threadOrder[i] != i) || threadOrderError;
69*578b2a36SAnimesh Kumar 
70*578b2a36SAnimesh Kumar   // FALSE If dependencies between tasks were not enforced in the correct order.
71*578b2a36SAnimesh Kumar   return !threadOrderError;
72*578b2a36SAnimesh Kumar }
73*578b2a36SAnimesh Kumar 
74*578b2a36SAnimesh Kumar 
75*578b2a36SAnimesh Kumar 
main()76*578b2a36SAnimesh Kumar int main() {
77*578b2a36SAnimesh Kumar   int i;
78*578b2a36SAnimesh Kumar   int num_failed=0;
79*578b2a36SAnimesh Kumar 
80*578b2a36SAnimesh Kumar   for(i = 0; i < REPETITIONS; i++) {
81*578b2a36SAnimesh Kumar     if(!test_omp_task_depend_iterator()) {
82*578b2a36SAnimesh Kumar       num_failed++;
83*578b2a36SAnimesh Kumar     }
84*578b2a36SAnimesh Kumar   }
85*578b2a36SAnimesh Kumar   return num_failed;
86*578b2a36SAnimesh Kumar }
87