https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120173
Bug ID: 120173
Summary: [OpenACC][gcn-offload] wrong 'firstprivate' with 'acc
parallel async' [modified
libgomp.oacc-fortran/lib-13.f90]
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: openacc, wrong-code
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: burnus at gcc dot gnu.org
CC: ams at gcc dot gnu.org, sandra at gcc dot gnu.org,
tschwinge at gcc dot gnu.org
Target Milestone: ---
Created attachment 61366
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61366&action=edit
Full test case (i.e. patch applied to libgomp.oacc-fortran/lib-13.f90)
The following is a modified version of
libgomp.oacc-fortran/lib-13.f90
which looks as follows (current version, might have changed by the time you
look at it):
https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgomp/testsuite/libgomp.oacc-fortran/lib-13.f90
I decided to check the value of the 'k' variable:
k(:) = 7
...
! print *, k
if (any (k /= [(7 + N, i = 1, nprocs)])) stop 4
And that fails with GCN but not with Nvptx. Namely:
1000007 1000007 ! nvptx
vs.
7 1005444 ! gcn
7 2000007 ! gcn with '!$acc atomic update'
* * *
In particular, I do not understand why k(j==1) is not increment at all while
k(j==2) is too much incremented.
* * *
Changes to that program - in an attempt to fix the issue:
(A) Use atomic update:
!$acc atomic update
k(j) = k(j) + 1
→ Yields consistent results → 7 2000007
(B) Use explicit clauses:
!$acc parallel firstprivate(j) private(i) async (j)
→ no effect, unsurprisingly as 'firstprivate' is the default.
BTW: If I look at the dump, I see:
j.16 = j;
.omp_data_arr.13.j = &j.16;
#pragma omp target oacc_parallel private(i) firstprivate(j)
D.4787 = .omp_data_i->j;
j = *D.4787;
[I wonder whether the address of 'j.16' gets too quickly reused?]
* * *
Otherwise:
!$acc end data
should probably be moved after 'call acc_wait' to avoid races, even though
I failed to observe any issues for those.
See OG14 commit https://gcc.gnu.org/g:8998cc60c1cbbdef603090eab63e5835bf071d41
8998cc60c1c Fix libgomp.oacc-fortran/lib-13.f90 async bug
* * *
The changed testcase (added atomic update, value check for 'k', moved 'end
data'):
--- a/libgomp/testsuite/libgomp.oacc-fortran/lib-13.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/lib-13.f90
@@ -11,3 +11,3 @@ program main
- k(:) = 0
+ k(:) = 7
@@ -17,2 +17,3 @@ program main
do i = 1, N
+ !$acc atomic update
k(j) = k(j) + 1
@@ -21,7 +22,6 @@ program main
end do
- !$acc end data
call acc_wait_all_async (nprocs + 1)
-
call acc_wait (nprocs + 1)
+ !$acc end data
@@ -30,2 +30,3 @@ program main
if (acc_async_test (nprocs + 1) .neqv. .TRUE.) stop 3
+ if (any (k /= [(7 + N, i = 1, nprocs)])) stop 4