xref: /llvm-project/offload/test/offloading/parallel_target_teams_reduction_max.cpp (revision 8823448807f3b1a1362d1417e062d763734e02f5)
1 // RUN: %libomptarget-compilexx-and-run-generic
2 // RUN: %libomptarget-compileoptxx-and-run-generic
3 
4 // FIXME: This is a bug in host offload, this should run fine.
5 // REQUIRES: gpu
6 
7 // This test validates that the OpenMP target reductions to find a maximum work
8 // as indended for a few common data types.
9 
10 #include <algorithm>
11 #include <cassert>
12 #include <limits>
13 #include <vector>
14 
test_max_idx_reduction()15 template <class Tp> void test_max_idx_reduction() {
16   const Tp length = 1000;
17   const Tp nmaximas = 8;
18   std::vector<float> a(length, 3.0f);
19   const Tp step = length / nmaximas;
20   for (Tp i = 0; i < nmaximas; i++) {
21     a[i * step] += 1.0f;
22   }
23   for (Tp i = nmaximas; i > 0; i--) {
24     Tp idx = 0;
25     float *b = a.data();
26 #pragma omp target teams distribute parallel for reduction(max : idx)          \
27     map(always, to : b[0 : length])
28     for (Tp j = 0; j < length - 1; j++) {
29       if (b[j] > b[j + 1]) {
30         idx = std::max(idx, j);
31       }
32     }
33     assert(idx == (i - 1) * step &&
34            "#pragma omp target teams distribute parallel for "
35            "reduction(max:<identifier list>) does not work as intended.");
36     a[idx] -= 1.0f;
37   }
38 }
39 
test_max_val_reduction()40 template <class Tp> void test_max_val_reduction() {
41   const int length = 1000;
42   const int half = length / 2;
43   std::vector<Tp> a(length, (Tp)3);
44   a[half] += (Tp)1;
45   Tp max_val = std::numeric_limits<Tp>::lowest();
46   Tp *b = a.data();
47 #pragma omp target teams distribute parallel for reduction(max : max_val)      \
48     map(always, to : b[0 : length])
49   for (int i = 0; i < length; i++) {
50     max_val = std::max(max_val, b[i]);
51   }
52   assert(std::abs(((double)a[half + 1]) - ((double)max_val) + 1.0) < 1e-6 &&
53          "#pragma omp target teams distribute parallel for "
54          "reduction(max:<identifier list>) does not work as intended.");
55 }
56 
main()57 int main() {
58   // Reducing over indices
59   test_max_idx_reduction<int>();
60   test_max_idx_reduction<unsigned int>();
61   test_max_idx_reduction<long>();
62 
63   // Reducing over values
64   test_max_val_reduction<int>();
65   test_max_val_reduction<unsigned int>();
66   test_max_val_reduction<long>();
67   test_max_val_reduction<float>();
68   test_max_val_reduction<double>();
69   return 0;
70 }
71