From patchwork Wed Dec 19 21:56:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 1016368 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-492846-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="XAs19ruW"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43Kpdg3WqTz9sB5 for ; Thu, 20 Dec 2018 08:57:09 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:in-reply-to:references:date:message-id :mime-version:content-type; q=dns; s=default; b=eRL7RF5HHiu/ieGy NMAZUsgrBfpL8qBOs4/WVXkVxme20WnAv59bgFPKNHx5/QhPfthAg8aFWFaMa3SH wZjewZaLnSAwAOXMLHUHJIUfUqZRUOJ/RkyG7Pj/3dAF14+QyTD9RLext+6I3EhB 2/uDIYKNcZhwabsZLm8nH1Gqt34= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:in-reply-to:references:date:message-id :mime-version:content-type; s=default; bh=B5/1ttrrWCIxDuu90OewPR EFvoI=; b=XAs19ruWBBQhKe8nIaQ3pUhR9eOWN7wlBBnU9Jx1RYCwUllSKzoFAQ nvn6hKOK2t2HAGaEggQLi0guEGbEdEbud1rAd6k+TVt0HqJxRIXwd0tGZkZ9OXc0 nzNZY6NNLO5aY4caDOZMhczHc1Dn79JSGEEVsotYhMm/eI86WMVj4= Received: (qmail 95797 invoked by alias); 19 Dec 2018 21:56:28 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 95184 invoked by uid 89); 19 Dec 2018 21:56:27 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=sk:gomp_of, 1457 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 19 Dec 2018 21:56:20 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=svr-ies-mbx-01.mgc.mentorg.com) by relay1.mentorg.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) id 1gZjpB-0005Fy-Of from Thomas_Schwinge@mentor.com ; Wed, 19 Dec 2018 13:56:18 -0800 Received: from hertz.schwinge.homeip.net (137.202.0.90) by svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Wed, 19 Dec 2018 21:56:13 +0000 From: Thomas Schwinge To: Jakub Jelinek , CC: , =?utf-8?b?R2VyZ8O2?= Barany Subject: For libgomp OpenACC entry points, redefine the "device" argument to "flags" In-Reply-To: <20181219141812.GC23305@tucnak> References: <0fe4cc25-8ed3-831f-337f-c61fd54eb7f0@mentor.com> <6a1ccffb-b139-3bde-6e3d-198464051cbf@mentor.com> <20181219133838.GA23305@tucnak> <20181219140342.GB23305@tucnak> <20181219141812.GC23305@tucnak> User-Agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/25.2.2 (x86_64-pc-linux-gnu) Date: Wed, 19 Dec 2018 22:56:05 +0100 Message-ID: MIME-Version: 1.0 Hi Jakub! On Wed, 19 Dec 2018 15:18:12 +0100, Jakub Jelinek wrote: > On Wed, Dec 19, 2018 at 03:03:42PM +0100, Jakub Jelinek wrote: > > On Wed, Dec 19, 2018 at 02:59:54PM +0100, Thomas Schwinge wrote: > > > Right. For OpenACC, there's no "device" clause, so we only ever passed > > > in "GOMP_DEVICE_ICV" (default), or "GOMP_DEVICE_HOST_FALLBACK" ("if > > > (false)" clause). Therefore, the libgomp "resolve_legacy_flags" function > > > added to make sure that these two values (as used by old executables) > > > continue to work as before (with new libgomp). (And, we have to make > > > sure that no (new) "GOACC_FLAG_*" combination ever results in these > > > values; will document that.) > > LGTM then in principle. > > Or keep it int and use inverted bitmask, thus when bit is 1, it represents > the default state and when bit is 0, it is something different from it. Ha, I too had that idea after thinking some more about the "-1" and "-2" values/representations... :-) > If you passed before just -1 and -2 and because we are only supporting two's > complement, the host fallback test would be (flags & 1) == 0. I structured that a bit more conveniently. That's especially useful once additional flags added, where you want to just do "flags |= [flag]", etc. > Then you don't need to at runtime transform from legacy to non-legacy. Right. Is the attached OK for trunk? If approving this patch, please respond with "Reviewed-by: NAME " so that your effort will be recorded in the commit log, see . For your review convenience, here's the "gcc/omp-expand.c" changes with "--ignore-space-change" (as I slightly restructured OpenACC vs. OpenMP code paths): @@ -7536,49 +7536,62 @@ expand_omp_target (struct omp_region *region) clauses = gimple_omp_target_clauses (entry_stmt); - /* By default, the value of DEVICE is GOMP_DEVICE_ICV (let runtime - library choose) and there is no conditional. */ - cond = NULL_TREE; - device = build_int_cst (integer_type_node, GOMP_DEVICE_ICV); - - c = omp_find_clause (clauses, OMP_CLAUSE_IF); - if (c) - cond = OMP_CLAUSE_IF_EXPR (c); - + device = NULL_TREE; + tree goacc_flags = NULL_TREE; + if (is_gimple_omp_oacc (entry_stmt)) + { + /* By default, no GOACC_FLAGs are set. */ + goacc_flags = integer_zero_node; + } + else + { c = omp_find_clause (clauses, OMP_CLAUSE_DEVICE); if (c) { - /* Even if we pass it to all library function calls, it is currently only - defined/used for the OpenMP target ones. */ - gcc_checking_assert (start_ix == BUILT_IN_GOMP_TARGET - || start_ix == BUILT_IN_GOMP_TARGET_DATA - || start_ix == BUILT_IN_GOMP_TARGET_UPDATE - || start_ix == BUILT_IN_GOMP_TARGET_ENTER_EXIT_DATA); - device = OMP_CLAUSE_DEVICE_ID (c); clause_loc = OMP_CLAUSE_LOCATION (c); } else + { + /* By default, the value of DEVICE is GOMP_DEVICE_ICV (let runtime + library choose). */ + device = build_int_cst (integer_type_node, GOMP_DEVICE_ICV); clause_loc = gimple_location (entry_stmt); + } c = omp_find_clause (clauses, OMP_CLAUSE_NOWAIT); if (c) flags_i |= GOMP_TARGET_FLAG_NOWAIT; + } + /* By default, there is no conditional. */ + cond = NULL_TREE; + c = omp_find_clause (clauses, OMP_CLAUSE_IF); + if (c) + cond = OMP_CLAUSE_IF_EXPR (c); + /* If we found the clause 'if (cond)', build: + OpenACC: goacc_flags = (cond ? goacc_flags : flags | GOACC_FLAG_HOST_FALLBACK) + OpenMP: device = (cond ? device : GOMP_DEVICE_HOST_FALLBACK) */ + if (cond) + { + tree *tp; + if (is_gimple_omp_oacc (entry_stmt)) + tp = &goacc_flags; + else + { /* Ensure 'device' is of the correct type. */ device = fold_convert_loc (clause_loc, integer_type_node, device); - /* If we found the clause 'if (cond)', build - (cond ? device : GOMP_DEVICE_HOST_FALLBACK). */ - if (cond) - { + tp = &device; + } + cond = gimple_boolify (cond); basic_block cond_bb, then_bb, else_bb; edge e; tree tmp_var; - tmp_var = create_tmp_var (TREE_TYPE (device)); + tmp_var = create_tmp_var (TREE_TYPE (*tp)); if (offloaded) e = split_block_after_labels (new_bb); else @@ -7601,10 +7614,17 @@ expand_omp_target (struct omp_region *region) gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi = gsi_start_bb (then_bb); - stmt = gimple_build_assign (tmp_var, device); + stmt = gimple_build_assign (tmp_var, *tp); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi = gsi_start_bb (else_bb); + if (is_gimple_omp_oacc (entry_stmt)) + stmt = gimple_build_assign (tmp_var, + BIT_IOR_EXPR, + *tp, + build_int_cst (integer_type_node, + GOACC_FLAG_HOST_FALLBACK)); + else stmt = gimple_build_assign (tmp_var, build_int_cst (integer_type_node, GOMP_DEVICE_HOST_FALLBACK)); @@ -7617,12 +7637,15 @@ expand_omp_target (struct omp_region *region) make_edge (then_bb, new_bb, EDGE_FALLTHRU); make_edge (else_bb, new_bb, EDGE_FALLTHRU); - device = tmp_var; + *tp = tmp_var; + gsi = gsi_last_nondebug_bb (new_bb); } else { gsi = gsi_last_nondebug_bb (new_bb); + + if (device != NULL_TREE) device = force_gimple_operand_gsi (&gsi, device, true, NULL_TREE, true, GSI_SAME_STMT); } @@ -7648,6 +7671,16 @@ expand_omp_target (struct omp_region *region) bool tagging = false; /* The maximum number used by any start_ix, without varargs. */ auto_vec args; + if (is_gimple_omp_oacc (entry_stmt)) + { + tree goacc_flags_m = fold_build1 (GOACC_FLAGS_MARSHAL_OP, + TREE_TYPE (goacc_flags), goacc_flags); + goacc_flags_m = force_gimple_operand_gsi (&gsi, goacc_flags_m, true, + NULL_TREE, true, + GSI_SAME_STMT); + args.quick_push (goacc_flags_m); + } + else args.quick_push (device); if (offloaded) args.quick_push (build_fold_addr_expr (child_fn)); Grüße Thomas From 2bde6a91bbdbd6aa3e4ca784eeab6f4e0cf77434 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Wed, 19 Dec 2018 20:04:18 +0100 Subject: [PATCH] For libgomp OpenACC entry points, redefine the "device" argument to "flags" ... so that we're then able to use this for other flags in addition to "GOACC_FLAG_HOST_FALLBACK". gcc/ * omp-expand.c (expand_omp_target): Restructure OpenACC vs. OpenMP code paths. Update for libgomp OpenACC entry points change. include/ * gomp-constants.h (GOACC_FLAG_HOST_FALLBACK) (GOACC_FLAGS_MARSHAL_OP, GOACC_FLAGS_UNMARSHAL): Define. libgomp/ * oacc-parallel.c (GOACC_parallel_keyed, GOACC_parallel) (GOACC_data_start, GOACC_enter_exit_data, GOACC_update) (GOACC_declare): Redefine the "device" argument to "flags". --- gcc/omp-expand.c | 109 ++++++++++++++++++++++++------------- gcc/tree-ssa-structalias.c | 4 +- include/gomp-constants.h | 12 ++++ libgomp/oacc-parallel.c | 52 +++++++++++------- 4 files changed, 118 insertions(+), 59 deletions(-) diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index 76c09c5883b7..d3626a6f1c5f 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -7536,49 +7536,62 @@ expand_omp_target (struct omp_region *region) clauses = gimple_omp_target_clauses (entry_stmt); - /* By default, the value of DEVICE is GOMP_DEVICE_ICV (let runtime - library choose) and there is no conditional. */ - cond = NULL_TREE; - device = build_int_cst (integer_type_node, GOMP_DEVICE_ICV); - - c = omp_find_clause (clauses, OMP_CLAUSE_IF); - if (c) - cond = OMP_CLAUSE_IF_EXPR (c); - - c = omp_find_clause (clauses, OMP_CLAUSE_DEVICE); - if (c) + device = NULL_TREE; + tree goacc_flags = NULL_TREE; + if (is_gimple_omp_oacc (entry_stmt)) { - /* Even if we pass it to all library function calls, it is currently only - defined/used for the OpenMP target ones. */ - gcc_checking_assert (start_ix == BUILT_IN_GOMP_TARGET - || start_ix == BUILT_IN_GOMP_TARGET_DATA - || start_ix == BUILT_IN_GOMP_TARGET_UPDATE - || start_ix == BUILT_IN_GOMP_TARGET_ENTER_EXIT_DATA); - - device = OMP_CLAUSE_DEVICE_ID (c); - clause_loc = OMP_CLAUSE_LOCATION (c); + /* By default, no GOACC_FLAGs are set. */ + goacc_flags = integer_zero_node; } else - clause_loc = gimple_location (entry_stmt); - - c = omp_find_clause (clauses, OMP_CLAUSE_NOWAIT); - if (c) - flags_i |= GOMP_TARGET_FLAG_NOWAIT; + { + c = omp_find_clause (clauses, OMP_CLAUSE_DEVICE); + if (c) + { + device = OMP_CLAUSE_DEVICE_ID (c); + clause_loc = OMP_CLAUSE_LOCATION (c); + } + else + { + /* By default, the value of DEVICE is GOMP_DEVICE_ICV (let runtime + library choose). */ + device = build_int_cst (integer_type_node, GOMP_DEVICE_ICV); + clause_loc = gimple_location (entry_stmt); + } - /* Ensure 'device' is of the correct type. */ - device = fold_convert_loc (clause_loc, integer_type_node, device); + c = omp_find_clause (clauses, OMP_CLAUSE_NOWAIT); + if (c) + flags_i |= GOMP_TARGET_FLAG_NOWAIT; + } - /* If we found the clause 'if (cond)', build - (cond ? device : GOMP_DEVICE_HOST_FALLBACK). */ + /* By default, there is no conditional. */ + cond = NULL_TREE; + c = omp_find_clause (clauses, OMP_CLAUSE_IF); + if (c) + cond = OMP_CLAUSE_IF_EXPR (c); + /* If we found the clause 'if (cond)', build: + OpenACC: goacc_flags = (cond ? goacc_flags : flags | GOACC_FLAG_HOST_FALLBACK) + OpenMP: device = (cond ? device : GOMP_DEVICE_HOST_FALLBACK) */ if (cond) { + tree *tp; + if (is_gimple_omp_oacc (entry_stmt)) + tp = &goacc_flags; + else + { + /* Ensure 'device' is of the correct type. */ + device = fold_convert_loc (clause_loc, integer_type_node, device); + + tp = &device; + } + cond = gimple_boolify (cond); basic_block cond_bb, then_bb, else_bb; edge e; tree tmp_var; - tmp_var = create_tmp_var (TREE_TYPE (device)); + tmp_var = create_tmp_var (TREE_TYPE (*tp)); if (offloaded) e = split_block_after_labels (new_bb); else @@ -7601,13 +7614,20 @@ expand_omp_target (struct omp_region *region) gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi = gsi_start_bb (then_bb); - stmt = gimple_build_assign (tmp_var, device); + stmt = gimple_build_assign (tmp_var, *tp); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi = gsi_start_bb (else_bb); - stmt = gimple_build_assign (tmp_var, - build_int_cst (integer_type_node, - GOMP_DEVICE_HOST_FALLBACK)); + if (is_gimple_omp_oacc (entry_stmt)) + stmt = gimple_build_assign (tmp_var, + BIT_IOR_EXPR, + *tp, + build_int_cst (integer_type_node, + GOACC_FLAG_HOST_FALLBACK)); + else + stmt = gimple_build_assign (tmp_var, + build_int_cst (integer_type_node, + GOMP_DEVICE_HOST_FALLBACK)); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE); @@ -7617,14 +7637,17 @@ expand_omp_target (struct omp_region *region) make_edge (then_bb, new_bb, EDGE_FALLTHRU); make_edge (else_bb, new_bb, EDGE_FALLTHRU); - device = tmp_var; + *tp = tmp_var; + gsi = gsi_last_nondebug_bb (new_bb); } else { gsi = gsi_last_nondebug_bb (new_bb); - device = force_gimple_operand_gsi (&gsi, device, true, NULL_TREE, - true, GSI_SAME_STMT); + + if (device != NULL_TREE) + device = force_gimple_operand_gsi (&gsi, device, true, NULL_TREE, + true, GSI_SAME_STMT); } t = gimple_omp_target_data_arg (entry_stmt); @@ -7648,7 +7671,17 @@ expand_omp_target (struct omp_region *region) bool tagging = false; /* The maximum number used by any start_ix, without varargs. */ auto_vec args; - args.quick_push (device); + if (is_gimple_omp_oacc (entry_stmt)) + { + tree goacc_flags_m = fold_build1 (GOACC_FLAGS_MARSHAL_OP, + TREE_TYPE (goacc_flags), goacc_flags); + goacc_flags_m = force_gimple_operand_gsi (&gsi, goacc_flags_m, true, + NULL_TREE, true, + GSI_SAME_STMT); + args.quick_push (goacc_flags_m); + } + else + args.quick_push (device); if (offloaded) args.quick_push (build_fold_addr_expr (child_fn)); args.quick_push (t1); diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index fc85e9ded5e8..cfdfb50854f0 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4697,7 +4697,7 @@ find_func_aliases_for_builtin_call (struct function *fn, gcall *t) argpos = 1; break; case BUILT_IN_GOACC_PARALLEL: - /* __builtin_GOACC_parallel (device, fn, mapnum, hostaddrs, + /* __builtin_GOACC_parallel (flags_m, fn, mapnum, hostaddrs, sizes, kinds, ...). */ fnpos = 1; argpos = 3; @@ -5255,7 +5255,7 @@ find_func_clobbers (struct function *fn, gimple *origt) argpos = 1; break; case BUILT_IN_GOACC_PARALLEL: - /* __builtin_GOACC_parallel (device, fn, mapnum, hostaddrs, + /* __builtin_GOACC_parallel (flags_m, fn, mapnum, hostaddrs, sizes, kinds, ...). */ fnpos = 1; argpos = 3; diff --git a/include/gomp-constants.h b/include/gomp-constants.h index d3e64d4e352a..b6b6733bd875 100644 --- a/include/gomp-constants.h +++ b/include/gomp-constants.h @@ -197,6 +197,18 @@ enum gomp_map_kind /* Internal to libgomp. */ #define GOMP_TARGET_FLAG_UPDATE (1U << 31) + +/* OpenACC construct flags. */ + +/* Force host fallback execution. */ +#define GOACC_FLAG_HOST_FALLBACK (1 << 0) + +/* For legacy reasons, in the ABI, the GOACC_FLAGs are encoded as an inverted + bitmask. */ +#define GOACC_FLAGS_MARSHAL_OP BIT_NOT_EXPR +#define GOACC_FLAGS_UNMARSHAL(X) (~(X)) + + /* Versions of libgomp and device-specific plugins. GOMP_VERSION should be incremented whenever an ABI-incompatible change is introduced to the plugin interface defined in libgomp/libgomp.h. */ diff --git a/libgomp/oacc-parallel.c b/libgomp/oacc-parallel.c index e2405d73d5a9..57bd484ba8a1 100644 --- a/libgomp/oacc-parallel.c +++ b/libgomp/oacc-parallel.c @@ -38,6 +38,16 @@ #include #include + +/* In the ABI, the GOACC_FLAGs are encoded as an inverted bitmask, so that we + continue to support the following two legacy values. */ +_Static_assert (GOACC_FLAGS_UNMARSHAL (GOMP_DEVICE_ICV) == 0, + "legacy GOMP_DEVICE_ICV broken"); +_Static_assert (GOACC_FLAGS_UNMARSHAL (GOMP_DEVICE_HOST_FALLBACK) + == GOACC_FLAG_HOST_FALLBACK, + "legacy GOMP_DEVICE_HOST_FALLBACK broken"); + + /* Returns the number of mappings associated with the pointer or pset. PSET have three mappings, whereas pointer have two. */ @@ -105,17 +115,18 @@ handle_ftn_pointers (size_t mapnum, void **hostaddrs, size_t *sizes, static void goacc_wait (int async, int num_waits, va_list *ap); -/* Launch a possibly offloaded function on DEVICE. FN is the host fn +/* Launch a possibly offloaded function with FLAGS. FN is the host fn address. MAPNUM, HOSTADDRS, SIZES & KINDS describe the memory blocks to be copied to/from the device. Varadic arguments are keyed optional parameters terminated with a zero. */ void -GOACC_parallel_keyed (int device, void (*fn) (void *), +GOACC_parallel_keyed (int flags_m, void (*fn) (void *), size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds, ...) { - bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK; + int flags = GOACC_FLAGS_UNMARSHAL (flags_m); + va_list ap; struct goacc_thread *thr; struct gomp_device_descr *acc_dev; @@ -145,7 +156,7 @@ GOACC_parallel_keyed (int device, void (*fn) (void *), /* Host fallback if "if" clause is false or if the current device is set to the host. */ - if (host_fallback) + if (flags & GOACC_FLAG_HOST_FALLBACK) { goacc_save_and_set_bind (acc_device_host); fn (hostaddrs); @@ -269,7 +280,7 @@ GOACC_parallel_keyed (int device, void (*fn) (void *), /* Legacy entry point, only provide host execution. */ void -GOACC_parallel (int device, void (*fn) (void *), +GOACC_parallel (int flags_m, void (*fn) (void *), size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds, int num_gangs, int num_workers, int vector_length, @@ -281,10 +292,11 @@ GOACC_parallel (int device, void (*fn) (void *), } void -GOACC_data_start (int device, size_t mapnum, +GOACC_data_start (int flags_m, size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds) { - bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK; + int flags = GOACC_FLAGS_UNMARSHAL (flags_m); + struct target_mem_desc *tgt; #ifdef HAVE_INTTYPES_H @@ -302,7 +314,7 @@ GOACC_data_start (int device, size_t mapnum, /* Host fallback or 'do nothing'. */ if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) - || host_fallback) + || (flags & GOACC_FLAG_HOST_FALLBACK)) { tgt = gomp_map_vars (NULL, 0, NULL, NULL, NULL, NULL, true, GOMP_MAP_VARS_OPENACC); @@ -333,13 +345,14 @@ GOACC_data_end (void) } void -GOACC_enter_exit_data (int device, size_t mapnum, +GOACC_enter_exit_data (int flags_m, size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds, int async, int num_waits, ...) { + int flags = GOACC_FLAGS_UNMARSHAL (flags_m); + struct goacc_thread *thr; struct gomp_device_descr *acc_dev; - bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK; bool data_enter = false; size_t i; @@ -349,7 +362,7 @@ GOACC_enter_exit_data (int device, size_t mapnum, acc_dev = thr->dev; if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) - || host_fallback) + || (flags & GOACC_FLAG_HOST_FALLBACK)) return; if (num_waits) @@ -523,11 +536,12 @@ goacc_wait (int async, int num_waits, va_list *ap) } void -GOACC_update (int device, size_t mapnum, +GOACC_update (int flags_m, size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds, int async, int num_waits, ...) { - bool host_fallback = device == GOMP_DEVICE_HOST_FALLBACK; + int flags = GOACC_FLAGS_UNMARSHAL (flags_m); + size_t i; goacc_lazy_initialize (); @@ -536,7 +550,7 @@ GOACC_update (int device, size_t mapnum, struct gomp_device_descr *acc_dev = thr->dev; if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) - || host_fallback) + || (flags & GOACC_FLAG_HOST_FALLBACK)) return; if (num_waits) @@ -643,7 +657,7 @@ GOACC_get_thread_num (void) } void -GOACC_declare (int device, size_t mapnum, +GOACC_declare (int flags_m, size_t mapnum, void **hostaddrs, size_t *sizes, unsigned short *kinds) { int i; @@ -663,7 +677,7 @@ GOACC_declare (int device, size_t mapnum, case GOMP_MAP_POINTER: case GOMP_MAP_RELEASE: case GOMP_MAP_DELETE: - GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i], + GOACC_enter_exit_data (flags_m, 1, &hostaddrs[i], &sizes[i], &kinds[i], GOMP_ASYNC_SYNC, 0); break; @@ -672,18 +686,18 @@ GOACC_declare (int device, size_t mapnum, case GOMP_MAP_ALLOC: if (!acc_is_present (hostaddrs[i], sizes[i])) - GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i], + GOACC_enter_exit_data (flags_m, 1, &hostaddrs[i], &sizes[i], &kinds[i], GOMP_ASYNC_SYNC, 0); break; case GOMP_MAP_TO: - GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i], + GOACC_enter_exit_data (flags_m, 1, &hostaddrs[i], &sizes[i], &kinds[i], GOMP_ASYNC_SYNC, 0); break; case GOMP_MAP_FROM: - GOACC_enter_exit_data (device, 1, &hostaddrs[i], &sizes[i], + GOACC_enter_exit_data (flags_m, 1, &hostaddrs[i], &sizes[i], &kinds[i], GOMP_ASYNC_SYNC, 0); break; -- 2.17.1