Bug 49792 - OpenMP workshare: Wrong result with array assignment
Summary: OpenMP workshare: Wrong result with array assignment
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.7.0
: P3 normal
Target Milestone: ---
Assignee: Jakub Jelinek
URL:
Keywords: openmp, wrong-code
Depends on:
Blocks:
 
Reported: 2011-07-20 09:50 UTC by Tobias Burnus
Modified: 2016-08-18 08:42 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2011-08-19 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tobias Burnus 2011-07-20 09:50:01 UTC
Based on the thread at http://gcc.gnu.org/ml/fortran/2011-07/msg00194.html

OpenMP 3.1 has in "2.5.4 workshare Construct" (normative text):

"An implementation of the workshare construct must insert any synchronization that is required to maintain standard Fortran semantics. For example, the effects of one statement within the structured block must appear to occur before the execution of succeeding statements, and the evaluation of the right hand side of an assignment must appear to complete prior to the effects of assigning to the left hand side."


That seems to fail for:

!$omp parallel workshare
    a(:) = a(n:1:-1)
!$omp end parallel workshare

which cannot be run in parallel as the element access on the RHS cannot be done in arbitrary order.

Possible solution: Make use of gfortran's dependency.c machinery but only look for GFC_DEP_EQUAL and GFC_DEP_NODEP - and ignore, e.g., GFC_DEP_BACKWARD or GFC_DEP_FORWARD, which indicate that the loop order is important.
Comment 1 Jakub Jelinek 2011-08-19 13:25:26 UTC
Author: jakub
Date: Fri Aug 19 13:25:22 2011
New Revision: 177898

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=177898
Log:
	PR fortran/49792
	* trans-expr.c (gfc_trans_assignment_1): Set OMPWS_SCALARIZER_WS
	bit in ompws_flags only if loop.temp_ss is NULL, and clear it if
	lhs needs reallocation.
	* trans-openmp.c (gfc_trans_omp_workshare): Don't return early if
	code is NULL, emit a barrier if workshare emitted no code at all
	and NOWAIT clause isn't present.

	* testsuite/libgomp.fortran/pr49792-1.f90: New test.
	* testsuite/libgomp.fortran/pr49792-2.f90: New test.

Added:
    trunk/libgomp/testsuite/libgomp.fortran/pr49792-1.f90
    trunk/libgomp/testsuite/libgomp.fortran/pr49792-2.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/trans-expr.c
    trunk/gcc/fortran/trans-openmp.c
    trunk/libgomp/ChangeLog
Comment 2 Jakub Jelinek 2011-08-19 13:26:54 UTC
Author: jakub
Date: Fri Aug 19 13:26:50 2011
New Revision: 177900

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=177900
Log:
	PR fortran/49792
	* trans-expr.c (gfc_trans_assignment_1): Set OMPWS_SCALARIZER_WS
	bit in ompws_flags only if loop.temp_ss is NULL, and clear it if
	lhs needs reallocation.
	* trans-openmp.c (gfc_trans_omp_workshare): Don't return early if
	code is NULL, emit a barrier if workshare emitted no code at all
	and NOWAIT clause isn't present.

	* testsuite/libgomp.fortran/pr49792-1.f90: New test.
	* testsuite/libgomp.fortran/pr49792-2.f90: New test.

Added:
    branches/gcc-4_6-branch/libgomp/testsuite/libgomp.fortran/pr49792-1.f90
    branches/gcc-4_6-branch/libgomp/testsuite/libgomp.fortran/pr49792-2.f90
Modified:
    branches/gcc-4_6-branch/gcc/fortran/ChangeLog
    branches/gcc-4_6-branch/gcc/fortran/trans-expr.c
    branches/gcc-4_6-branch/gcc/fortran/trans-openmp.c
    branches/gcc-4_6-branch/libgomp/ChangeLog
Comment 3 Jakub Jelinek 2011-08-19 13:35:46 UTC
Fixed for 4.6+ so far.
Comment 4 Dominique d'Humieres 2015-10-29 14:47:48 UTC
> Fixed for 4.6+ so far.

Any reason why this PR is not closed as FIXED?
Comment 5 Jakub Jelinek 2016-08-18 08:42:24 UTC
.