From 694bbd399c1323975b4a6735646e46c6914de63d Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Thu, 30 Mar 2023 10:08:12 +0200 Subject: [PATCH 2/2] '-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'. --- 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); + } } } } -- 2.25.1