From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 9062E385840F; Mon, 3 Apr 2023 14:53:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9062E385840F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1680533630; bh=DRA+Kaj646Al0/EdCY6yB3AhKFAepHIkGTgViDY0dYM=; h=From:To:Subject:Date:From; b=ml6BIlZjg2pHKZVOzVelCmKdBFnNVusOdpu10X/gIAiGO91PZilH8+IW6o4tGvIfs cWJwaQrR3UWGU4aAvloO5JMFtRAJFRkXgm+pZ7mX1W1suIQBYKmkWLYFIh9pHgojgI q9Pf9UsjFIn2CCJX8Fr3CDZj58j3JaO/nvCrZHtA= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/omp/gcc-12] '-foffload-memory=pinned' using offloading device interfaces for non-contiguous array support X-Act-Checkin: gcc X-Git-Author: Thomas Schwinge X-Git-Refname: refs/heads/devel/omp/gcc-12 X-Git-Oldrev: 43095690ea519205bf56fc148b346edaa43e0f0f X-Git-Newrev: 694bbd399c1323975b4a6735646e46c6914de63d Message-Id: <20230403145350.9062E385840F@sourceware.org> Date: Mon, 3 Apr 2023 14:53:50 +0000 (GMT) List-Id: https://gcc.gnu.org/g:694bbd399c1323975b4a6735646e46c6914de63d commit 694bbd399c1323975b4a6735646e46c6914de63d Author: Thomas Schwinge Date: Thu Mar 30 10:08:12 2023 +0200 '-foffload-memory=pinned' using offloading device interfaces for non-contiguous array support Changes related to og12 commit 15d0f61a7fecdc8fd12857c40879ea3730f6d99f "Merge non-contiguous array support patches". libgomp/ * target.c (gomp_map_vars_internal) : Handle 'always_pinned_mode'. Diff: --- libgomp/ChangeLog.omp | 3 +++ libgomp/target.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 1b02c057562..09cf9c6f3c1 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,5 +1,8 @@ 2023-04-03 Thomas Schwinge + * target.c (gomp_map_vars_internal) + : Handle 'always_pinned_mode'. + * libgomp-plugin.h (GOMP_OFFLOAD_page_locked_host_free): Add 'struct goacc_asyncqueue *' formal parameter. (GOMP_OFFLOAD_page_locked_host_register) diff --git a/libgomp/target.c b/libgomp/target.c index ed2fc09cf44..38eb5d1aa5b 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -2087,6 +2087,23 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep, k->dynamic_refcount = 0; k->aux = NULL; k->tgt_offset = tgt_size; + k->page_locked_host_p = false; + if (always_pinned_mode) + { + void *ptr = (void *) k->host_start; + size_t size = k->host_end - k->host_start; + int page_locked_host_p = 0; + if (size != 0) + page_locked_host_p = gomp_page_locked_host_register_dev + (devicep, ptr, size, kind & typemask); + if (page_locked_host_p < 0) + { + gomp_mutex_unlock (&devicep->lock); + exit (EXIT_FAILURE); + } + if (page_locked_host_p) + k->page_locked_host_p = true; + } tgt_size += nca->data_row_size; @@ -2120,16 +2137,44 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep, accelerator side ptrblock and copy it in. */ if (nca->ptrblock_size) { - void *ptrblock = gomp_malloc (nca->ptrblock_size); + void *ptrblock; + if (always_pinned_mode) + { + ptrblock + = gomp_page_locked_host_alloc_dev (devicep, + nca->ptrblock_size, + false); + if (!ptrblock) + { + gomp_mutex_unlock (&devicep->lock); + exit (EXIT_FAILURE); + } + } + else + ptrblock = gomp_malloc (nca->ptrblock_size); goacc_noncontig_array_create_ptrblock (nca, ptrblock, target_ptrblock); gomp_copy_host2dev (devicep, aq, target_ptrblock, ptrblock, nca->ptrblock_size, false, cbufp); - if (aq) - /* Free once the transfer has completed. */ - devicep->openacc.async.queue_callback_func (aq, free, ptrblock); + if (always_pinned_mode) + { + if (!gomp_page_locked_host_free_dev (devicep, + ptrblock, + aq)) + { + gomp_mutex_unlock (&devicep->lock); + exit (EXIT_FAILURE); + } + } else - free (ptrblock); + { + if (aq) + /* Free once the transfer has completed. */ + devicep->openacc.async.queue_callback_func + (aq, free, ptrblock); + else + free (ptrblock); + } } } }