5d183d1740
OpenACC (cf. OpenACC 2.7, section 2.9.11. "reduction clause"; this was first clarified by OpenACC 2.6) requires that, if a variable is used in reduction clauses on two nested loops, then there must be reduction clauses for that variable on all loops that are nested in between the two loops and all these reduction clauses must use the same operator. This commit introduces a check for that property which reports warnings if it is violated. 2019-11-06 Gergö Barany <gergo@codesourcery.com> Frederik Harwath <frederik@codesourcery.com> Thomas Schwinge <thomas@codesourcery.com> gcc/ * omp-low.c (struct omp_context): New fields local_reduction_clauses, outer_reduction_clauses. (new_omp_context): Initialize these. (scan_sharing_clauses): Record reduction clauses on OpenACC constructs. (scan_omp_for): Check reduction clauses for incorrect nesting. gcc/testsuite/ * c-c++-common/goacc/nested-reductions-warn.c: New test. * c-c++-common/goacc/nested-reductions.c: New test. * gfortran.dg/goacc/nested-reductions-warn.f90: New test. * gfortran.dg/goacc/nested-reductions.f90: New test. libgomp/ * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-1.c: Add expected warnings about missing reduction clauses. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-3.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/par-loop-comb-reduction-4.c: Likewise. Reviewed-by: Thomas Schwinge <thomas@codesourcery.com> From-SVN: r277875
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
#include <assert.h>
|
|
|
|
/* Test of reduction on both parallel and loop directives (workers and vectors
|
|
together in gang-partitioned mode, float type, multiple reductions). */
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
int i, j;
|
|
float arr[32768];
|
|
float res = 0, mres = 0, hres = 0, hmres = 0;
|
|
|
|
for (i = 0; i < 32768; i++)
|
|
arr[i] = i % (32768 / 64);
|
|
|
|
#pragma acc parallel num_gangs(32) num_workers(32) vector_length(32) \
|
|
reduction(+:res) reduction(max:mres) copy(res, mres)
|
|
{
|
|
#pragma acc loop gang /* { dg-warning "nested loop in reduction needs reduction clause for 'm\?res'" "TODO" } */
|
|
for (j = 0; j < 32; j++)
|
|
{
|
|
#pragma acc loop worker vector reduction(+:res) reduction(max:mres)
|
|
for (i = 0; i < 1024; i++)
|
|
{
|
|
res += arr[j * 1024 + i];
|
|
if (arr[j * 1024 + i] > mres)
|
|
mres = arr[j * 1024 + i];
|
|
}
|
|
|
|
#pragma acc loop worker vector reduction(+:res) reduction(max:mres)
|
|
for (i = 0; i < 1024; i++)
|
|
{
|
|
res += arr[j * 1024 + (1023 - i)];
|
|
if (arr[j * 1024 + (1023 - i)] > mres)
|
|
mres = arr[j * 1024 + (1023 - i)];
|
|
}
|
|
}
|
|
}
|
|
|
|
for (j = 0; j < 32; j++)
|
|
for (i = 0; i < 1024; i++)
|
|
{
|
|
hres += arr[j * 1024 + i];
|
|
hres += arr[j * 1024 + (1023 - i)];
|
|
if (arr[j * 1024 + i] > hmres)
|
|
hmres = arr[j * 1024 + i];
|
|
if (arr[j * 1024 + (1023 - i)] > hmres)
|
|
hmres = arr[j * 1024 + (1023 - i)];
|
|
}
|
|
|
|
assert (hres <= 16777216);
|
|
assert (res == hres);
|
|
|
|
assert (hmres <= 16777216);
|
|
assert (mres == hmres);
|
|
|
|
return 0;
|
|
}
|