This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [OpenACC] Update OpenACC data clause semantics to the 2.5 behavior


Ping.

To make this patch easier to review, I'll split it into individual
patches for each major component in follow up emails.

Cesar

On 05/25/2018 01:01 PM, Cesar Philippidis wrote:
> This patch updates GCC's to support OpenACC 2.5's data clause semantics. 
> In OpenACC 2.5, copy, copyin and copyout all behave like their 
> present_or_* counterparts in OpenACC 2.0. The patch also adds support 
> for the new finalize and if_present data clauses introduced in OpenACC 
> 2.5. The finalize clause introduced some new reference counting behavior 
> in the runtime; whereas 'acc exit data copyout' decrements the reference 
> count of a variable, 'acc exit data finalize' actually removes it from 
> the accelerator regardless of there are any pending references to it.
> 
> Due to the size of this patch, I had to compress it. However, despite 
> the size of the patch, which is mainly due to the augmented test cases, 
> it fairly noninvasive. I was originally going to include support for 
> declare allocate and deallocate, but those require more extensive 
> modifications to the fortran FE.
> 
> Is this patch OK for trunk? I tested with x86_64-linux with nvptx 
> acceleration.
> 
> Thanks,
> Cesar
> 
> 2018-05-25  Chung-Lin Tang <cltang@codesourcery.com>
> 	    Thomas Schwinge <thomas@codesourcery.com>
> 	    Cesar Philippidis  <cesar@codesourcery.com>
> 
> 	gcc/c-family/
> 	* c-pragma.h (enum pragma_omp_clause): Add
> 	PRAGMA_OACC_CLAUSE_{FINALIZE,IF_PRESENT}. Remove
> 	PRAGMA_OACC_CLAUSE_PRESENT_OR_{COPY,COPYIN,COPYOUT,CREATE}.
> 
> 	gcc/c/
> 	* c-parser.c (c_parser_omp_clause_name): Add support for finalize
> 	and if_present. Make present_or_{copy,copyin,copyout,create} aliases
> 	to their non-present_or_* counterparts. Make 'self' an alias to
> 	PRAGMA_OACC_CLAUSE_HOST.
> 	(c_parser_oacc_data_clause): Update GOMP mappings for
> 	PRAGMA_OACC_CLAUSE_{COPY,COPYIN,COPYOUT,CREATE,DELETE}. Remove
> 	PRAGMA_OACC_CLAUSE_{SELF,PRESENT_OR_*}.
> 	(c_parser_oacc_all_clauses): Handle finalize and if_present clauses.
> 	Remove support for present_or_* clauses.
> 	(OACC_KERNELS_CLAUSE_MASK): Remove PRESENT_OR_* clauses.
> 	(OACC_PARALLEL_CLAUSE_MASK): Likewise.
> 	(OACC_DECLARE_CLAUSE_MASK): Likewise.
> 	(OACC_DATA_CLAUSE_MASK): Likewise.
> 	(OACC_ENTER_DATA_CLAUSE_MASK): Remove PRESENT_OR_* clauses.
> 	(OACC_EXIT_DATA_CLAUSE_MASK): Add FINALIZE clause.
> 	(OACC_UPDATE_CLAUSE_MASK): Remove SELF, add IF_PRESENT.
> 	(c_parser_oacc_declare): Remove PRESENT_OR_* clauses.
> 	* c-typeck.c (c_finish_omp_clauses): Handle IF_PRESENT and FINALIZE.
> 
> 	gcc/cp/
> 	* parser.c (cp_parser_omp_clause_name): Add support for finalize
> 	and if_present. Make present_or_{copy,copyin,copyout,create} aliases
> 	to their non-present_or_* counterparts. Make 'self' an alias to
> 	PRAGMA_OACC_CLAUSE_HOST.
> 	(cp_parser_oacc_data_clause): Update GOMP mappings for
> 	PRAGMA_OACC_CLAUSE_{COPY,COPYIN,COPYOUT,CREATE,DELETE}. Remove
> 	PRAGMA_OACC_CLAUSE_{SELF,PRESENT_OR_*}.
> 	(cp_parser_oacc_all_clauses): Handle finalize and if_present clauses.
> 	Remove support for present_or_* clauses.
> 	(OACC_KERNELS_CLAUSE_MASK): Remove PRESENT_OR_* clauses.
> 	(OACC_PARALLEL_CLAUSE_MASK): Likewise.
> 	(OACC_DECLARE_CLAUSE_MASK): Likewise.
> 	(OACC_DATA_CLAUSE_MASK): Likewise.
> 	(OACC_ENTER_DATA_CLAUSE_MASK): Remove PRESENT_OR_* clauses.
> 	(OACC_EXIT_DATA_CLAUSE_MASK): Add FINALIZE clause.
> 	(OACC_UPDATE_CLAUSE_MASK): Remove SELF, add IF_PRESENT.
> 	(cp_parser_oacc_declare): Remove PRESENT_OR_* clauses.
> 	* pt.c (tsubst_omp_clauses): Handle IF_PRESENT and FINALIZE.
> 	* semantics.c (finish_omp_clauses): Handle IF_PRESENT and FINALIZE.
> 
> 	gcc/fortran/
> 	* gfortran.h (gfc_omp_clauses): Add unsigned if_present, finalize
> 	bitfields.
> 	* openmp.c (enum omp_mask2): Remove OMP_CLAUSE_PRESENT_OR_*. Add
> 	OMP_CLAUSE_{IF_PRESENT,FINALIZE}.
> 	(gfc_match_omp_clauses): Update handling of copy, copyin, copyout,
> 	create, deviceptr, present_of_*. Add support for finalize and
> 	if_present.
> 	(OACC_PARALLEL_CLAUSES): Remove PRESENT_OR_* clauses.
> 	(OACC_KERNELS_CLAUSES): Likewise.
> 	(OACC_DATA_CLAUSES): Likewise.
> 	(OACC_DECLARE_CLAUSES): Likewise.
> 	(OACC_UPDATE_CLAUSES): Add IF_PRESENT clause.
> 	(OACC_ENTER_DATA_CLAUSES): Remove PRESENT_OR_* clauses.
> 	(OACC_EXIT_DATA_CLAUSES): Add FINALIZE clause.
> 	(gfc_match_oacc_declare): Update to OpenACC 2.5 semantics.
> 	* trans-openmp.c (gfc_trans_omp_clauses): Add support for IF_PRESENT
> 	and FINALIZE.
> 
> 	gcc/
> 	* gimplify.c (gimplify_scan_omp_clauses): Add support for
> 	OMP_CLAUSE_{IF_PRESENT,FINALIZE}.
> 	(gimplify_adjust_omp_clauses): Likewise.
> 	(gimplify_oacc_declare_1): Add support for GOMP_MAP_RELEASE, remove
> 	support for GOMP_MAP_FORCE_{ALLOC,TO,FROM,TOFROM}.
> 	(gimplify_omp_target_update): Update handling of acc update and
> 	enter/exit data.
> 	* omp-low.c (install_var_field): Remove unused parameter
> 	base_pointers_restrict.
> 	(scan_sharing_clauses): Remove base_pointers_restrict parameter.
> 	Update call to install_var_field. Handle OMP_CLAUSE_{IF_PRESENT,
> 	FINALIZE}
> 	(omp_target_base_pointers_restrict_p): Delete.
> 	(scan_omp_target): Update call to scan_sharing_clauses.
> 	* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_{IF_PRESENT,
> 	FINALIZE}.
> 	* tree-nested.c (convert_nonlocal_omp_clauses): Handle
> 	OMP_CLAUSE_{IF_PRESENT,FINALIZE}.
> 	(convert_local_omp_clauses): Likewise.
> 	* tree-pretty-print.c (dump_omp_clause): Likewise.
> 	* tree.c (omp_clause_num_ops): Add entries for 	OMP_CLAUSE_{IF_PRESENT,
> 	FINALIZE}.
> 	(omp_clause_code_name): Likewise.
> 
> 	gcc/testsuite/
> 	* c-c++-common/goacc/declare-1.c: Update test case to utilize OpenACC
> 	2.5 data clause semantics.
> 	* c-c++-common/goacc/declare-2.c: Likewise.
> 	* c-c++-common/goacc/default-4.c: Likewise.
> 	* c-c++-common/goacc/finalize-1.c: New test.
> 	* c-c++-common/goacc/kernels-alias-2.c: Update test case to utilize
> 	OpenACC 2.5 data clause semantics.
> 	* c-c++-common/goacc/kernels-alias.c: Likewise.
> 	* c-c++-common/goacc/routine-5.c: Likewise.
> 	* c-c++-common/goacc/update-if_present-1.c: New test.
> 	* c-c++-common/goacc/update-if_present-2.c: New test.
> 	* g++.dg/goacc/template.C: Update test case to utilize OpenACC
> 	2.5 data clause semantics.
> 	* gfortran.dg/goacc/combined-directives.f90: Likewise.
> 	* gfortran.dg/goacc/data-tree.f95: Likewise.
> 	* gfortran.dg/goacc/declare-2.f95: Likewise.
> 	* gfortran.dg/goacc/default-4.f: Likewise.
> 	* gfortran.dg/goacc/enter-exit-data.f95: Likewise.
> 	* gfortran.dg/goacc/finalize-1.f: New test.
> 	* gfortran.dg/goacc/kernels-alias-2.f95: Update test case to utilize
> 	OpenACC 2.5 data clause semantics.
> 	* gfortran.dg/goacc/kernels-alias.f95: Likewise.
> 	* gfortran.dg/goacc/kernels-tree.f95: Likewise.
> 	* gfortran.dg/goacc/nested-function-1.f90: Likewise.
> 	* gfortran.dg/goacc/parallel-tree.f95: Likewise.
> 	* gfortran.dg/goacc/reduction-promotions.f90: Likewise.
> 	* gfortran.dg/goacc/update-if_present-1.f90: New test.
> 	* gfortran.dg/goacc/update-if_present-2.f90: New test.
> 
> 	libgomp/
> 	* libgomp.h (struct splay_tree_key_s): Add dynamic_refcount member.
> 	(gomp_acc_remove_pointer): Update declaration.
> 	(gomp_acc_declare_allocate): Declare.
> 	(gomp_remove_var): Declare.
> 	* libgomp.map (OACC_2.5): Define.
> 	* oacc-mem.c (acc_map_data): Update refcount.
> 	(acc_unmap_data): Likewise.
> 	(present_create_copy): Likewise.
> 	(acc_create): Add FLAG_PRESENT when calling present_create_copy.
> 	(acc_copyin): Likewise.
> 	(FLAG_FINALIZE): Define.
> 	(delete_copyout): Update dynamic refcounts, add support for FINALIZE.
> 	(acc_delete_finalize): New function.
> 	(acc_delete_finalize_async): New function.
> 	(acc_copyout_finalize): New function.
> 	(acc_copyout_finalize_async): New function.
> 	(gomp_acc_insert_pointer): Update refcounts.
> 	(gomp_acc_remove_pointer): Return if data is not present on the
> 	accelerator.
> 	* oacc-parallel.c (find_pset): Rename to find_pointer.
> 	(find_pointer): Add support for GOMP_MAP_POINTER.
> 	(handle_ftn_pointers): New function.
> 	(GOACC_parallel_keyed): Update refcounts of variables.
> 	(GOACC_enter_exit_data): Add support for finalized data mappings.
> 	Add support for GOMP_MAP_{TO,ALLOC,RELESE,FROM}. Update handling
> 	of fortran arrays.
> 	(GOACC_update): Add support for GOMP_MAP_{ALWAYS_POINTER,TO,FROM}.
> 	(GOACC_declare): Add support for GOMP_MAP_RELEASE, remove support
> 	for GOMP_MAP_FORCE_FROM.
> 	* openacc.f90 (module openacc_internal): Add
> 	acc_copyout_finalize_{32_h,64_h,array_h,_l}, and
> 	acc_delete_finalize_{32_h,64_h,array_h,_l}. Add interfaces for
> 	acc_copyout_finalize and acc_delete_finalize.
> 	(acc_copyout_finalize_32_h): New subroutine.
> 	(acc_copyout_finalize_64_h): New subroutine.
> 	(acc_copyout_finalize_array_h): New subroutine.
> 	(acc_delete_finalize_32_h): New subroutine.
> 	(acc_delete_finalize_64_h): New subroutine.
> 	(acc_delete_finalize_array_h): New subroutine.
> 	* openacc.h (acc_copyout_finalize): Declare.
> 	(acc_copyout_finalize_async): Declare.
> 	(acc_delete_finalize): Declare.
> 	(acc_delete_finalize_async): Declare.
> 	* openacc_lib.h (acc_copyout_finalize): New interface.
> 	(acc_delete_finalize): New interface.
> 	* target.c (gomp_map_vars): Update dynamic_refcount.
> 	(gomp_remove_var): New function.
> 	(gomp_unmap_vars): Use it.
> 	(gomp_unload_image_from_device): Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-1.c: Update test
> 	case to utilize OpenACC 2.5 data clause semantics.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-2.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-3.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-4.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-5.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-6.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-7.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/data-already-8.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/lib-16.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/lib-25.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/lib-32.c: Likewise.
> 	* testsuite/libgomp.oacc-c-c++-common/lib-83.c: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-5.f90: New test.
> 	* testsuite/libgomp.oacc-fortran/data-already-1.f: Update test case to
> 	utilize OpenACC 2.5 data clause semantics.
> 	* testsuite/libgomp.oacc-fortran/data-already-2.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-3.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-4.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-5.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-6.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-7.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/data-already-8.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/lib-32-1.f: Likewise.
> 	* testsuite/libgomp.oacc-fortran/lib-32-2.f: Likewise.
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]