Mercurial > hg > CbC > CbC_gcc
view libgomp/testsuite/libgomp.oacc-c++/template-reduction.C @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
const int n = 100; // Check explicit template copy map template<typename T> T sum (T array[]) { T s = 0; #pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy (array[0:n]) for (int i = 0; i < n; i++) s += array[i]; return s; } // Check implicit template copy map template<typename T> T sum () { T s = 0; T array[n]; for (int i = 0; i < n; i++) array[i] = i+1; #pragma acc parallel loop num_gangs (10) gang reduction (+:s) for (int i = 0; i < n; i++) s += array[i]; return s; } // Check template with default (present) template<typename T> T sum_default_present () { T s = 0; T array[n]; for (int i = 0; i < n; i++) array[i] = i+1; #pragma acc enter data copyin (array) #pragma acc parallel loop num_gangs (10) gang reduction (+:s) default (present) for (int i = 0; i < n; i++) s += array[i]; #pragma acc exit data delete (array) return s; } // Check present and async template<typename T> T async_sum (T array[]) { T s = 0; #pragma acc parallel loop num_gangs (10) gang async (1) present (array[0:n]) for (int i = 0; i < n; i++) array[i] = i+1; #pragma acc parallel loop num_gangs (10) gang reduction (+:s) present (array[0:n]) async wait (1) for (int i = 0; i < n; i++) s += array[i]; #pragma acc wait return s; } // Check present and async and an explicit firstprivate template<typename T> T async_sum (int c) { T s = 0; #pragma acc parallel loop num_gangs (10) gang reduction (+:s) firstprivate (c) async wait (1) for (int i = 0; i < n; i++) s += i+c; #pragma acc wait return s; } int main() { int a[n]; int result = 0; for (int i = 0; i < n; i++) { a[i] = i+1; result += i+1; } if (sum (a) != result) __builtin_abort (); if (sum<int> () != result) __builtin_abort (); if (sum_default_present<int> () != result) __builtin_abort (); #pragma acc enter data copyin (a) if (async_sum (a) != result) __builtin_abort (); if (async_sum<int> (1) != result) __builtin_abort (); #pragma acc exit data delete (a) return 0; }