https://gcc.gnu.org/g:4b60a4da49a7fbdf5e58ee9c63dca7a019e4e91f
commit r16-6772-g4b60a4da49a7fbdf5e58ee9c63dca7a019e4e91f Author: Thomas Schwinge <[email protected]> Date: Fri May 30 11:37:46 2025 +0200 Add 'libgomp.c++/target-std__[...]-concurrent-usm.C' test cases for C++ 'std::flat_map', 'std::flat_multimap', 'std::flat_multiset', 'std::flat_set' libgomp/ * testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C: New. * testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C: Likewise. * testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C: Likewise. * testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C: Likewise. * testsuite/libgomp.c++/target-std__flat_map-concurrent.C: Adjust. * testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C: Likewise. * testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C: Likewise. * testsuite/libgomp.c++/target-std__flat_set-concurrent.C: Likewise. Diff: --- .../libgomp.c++/target-std__flat_map-concurrent-usm.C | 8 ++++++++ .../testsuite/libgomp.c++/target-std__flat_map-concurrent.C | 12 ++++++++++++ .../libgomp.c++/target-std__flat_multimap-concurrent-usm.C | 8 ++++++++ .../libgomp.c++/target-std__flat_multimap-concurrent.C | 12 ++++++++++++ .../libgomp.c++/target-std__flat_multiset-concurrent-usm.C | 8 ++++++++ .../libgomp.c++/target-std__flat_multiset-concurrent.C | 10 ++++++++++ .../libgomp.c++/target-std__flat_set-concurrent-usm.C | 8 ++++++++ .../testsuite/libgomp.c++/target-std__flat_set-concurrent.C | 10 ++++++++++ 8 files changed, 76 insertions(+) diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C new file mode 100644 index 000000000000..ac1fc9b53f7c --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-std=c++23" } + +/* { dg-require-effective-target omp_usm } */ +#pragma omp requires unified_shared_memory self_maps +#define OMP_USM +#define MEM_SHARED + +#include "target-std__flat_map-concurrent.C" diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C index 958b75e72092..311f9fc4ef62 100644 --- a/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C @@ -39,7 +39,9 @@ int main (void) init (keys, true); init (data, false); +#ifndef MEM_SHARED #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map) +#endif #pragma omp target { @@ -55,12 +57,22 @@ int main (void) for (int i = 0; i < N; ++i) sum += (long long) keys[i] * _map[keys[i]]; +#ifdef OMP_USM + #pragma omp target + /* Restore the object into pristine state. In particular, deallocate + any memory allocated during device execution, which otherwise, back + on the host, we'd SIGSEGV on, when attempting to deallocate during + destruction of the object. */ + __typeof__ (_map){}.swap (_map); +#endif #ifndef MEM_SHARED #pragma omp target _map.~flat_map (); #endif +#ifndef MEM_SHARED #pragma omp target exit data map (release: _map) +#endif bool ok = validate (sum, keys, data); return ok ? 0 : 1; diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C new file mode 100644 index 000000000000..d772f63c84a1 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-std=c++23" } + +/* { dg-require-effective-target omp_usm } */ +#pragma omp requires unified_shared_memory self_maps +#define OMP_USM +#define MEM_SHARED + +#include "target-std__flat_multimap-concurrent.C" diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C index cee63236750c..0afbd56138f8 100644 --- a/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C @@ -33,7 +33,9 @@ int main (void) init (keys, KEY_MAX); init (data, RAND_MAX); +#ifndef MEM_SHARED #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map) +#endif #pragma omp target { @@ -54,12 +56,22 @@ int main (void) } } +#ifdef OMP_USM + #pragma omp target + /* Restore the object into pristine state. In particular, deallocate + any memory allocated during device execution, which otherwise, back + on the host, we'd SIGSEGV on, when attempting to deallocate during + destruction of the object. */ + __typeof__ (_map){}.swap (_map); +#endif #ifndef MEM_SHARED #pragma omp target _map.~flat_multimap (); #endif +#ifndef MEM_SHARED #pragma omp target exit data map (release: _map) +#endif bool ok = validate (sum, keys, data); return ok ? 0 : 1; diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C new file mode 100644 index 000000000000..56d60a2669af --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-std=c++23" } + +/* { dg-require-effective-target omp_usm } */ +#pragma omp requires unified_shared_memory self_maps +#define OMP_USM +#define MEM_SHARED + +#include "target-std__flat_multiset-concurrent.C" diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C index 13d2ff921d05..a2af7f24ff0d 100644 --- a/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C @@ -34,7 +34,9 @@ int main (void) srand (time (NULL)); init (data); +#ifndef MEM_SHARED #pragma omp target data map (to: data[ :N]) map (alloc: set) +#endif { #pragma omp target { @@ -49,6 +51,14 @@ int main (void) for (int i = 0; i < MAX; ++i) sum += i * set.count (i); +#ifdef OMP_USM + #pragma omp target + /* Restore the object into pristine state. In particular, deallocate + any memory allocated during device execution, which otherwise, back + on the host, we'd SIGSEGV on, when attempting to deallocate during + destruction of the object. */ + __typeof__ (set){}.swap (set); +#endif #ifndef MEM_SHARED #pragma omp target set.~flat_multiset (); diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C new file mode 100644 index 000000000000..1532e6c31734 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-std=c++23" } + +/* { dg-require-effective-target omp_usm } */ +#pragma omp requires unified_shared_memory self_maps +#define OMP_USM +#define MEM_SHARED + +#include "target-std__flat_set-concurrent.C" diff --git a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C index 0f4a1a8e374f..dce213c213c8 100644 --- a/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C +++ b/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C @@ -40,7 +40,9 @@ int main (void) srand (time (NULL)); init (data); +#ifndef MEM_SHARED #pragma omp target data map (to: data[ :N]) map (alloc: _set) +#endif { #pragma omp target { @@ -56,6 +58,14 @@ int main (void) if (_set.count (i) > 0) sum += i; +#ifdef OMP_USM + #pragma omp target + /* Restore the object into pristine state. In particular, deallocate + any memory allocated during device execution, which otherwise, back + on the host, we'd SIGSEGV on, when attempting to deallocate during + destruction of the object. */ + __typeof__ (_set){}.swap (_set); +#endif #ifndef MEM_SHARED #pragma omp target _set.~flat_set ();
