diff options
| author | Tobias Burnus <tburnus@baylibre.com> | 2025-11-05 16:25:54 +0100 |
|---|---|---|
| committer | Tobias Burnus <tburnus@baylibre.com> | 2025-11-05 16:25:54 +0100 |
| commit | 90f2ab4b6e1463d8cb89c70585e19987a58f3de1 (patch) | |
| tree | ad1c1282b1afa207c466268d0ebc64e05d79dd77 | |
| parent | 4983e9745edae3807243693e8865835b45f08c95 (diff) | |
| download | gcc-90f2ab4b6e1463d8cb89c70585e19987a58f3de1.zip gcc-90f2ab4b6e1463d8cb89c70585e19987a58f3de1.tar.gz gcc-90f2ab4b6e1463d8cb89c70585e19987a58f3de1.tar.bz2 | |
libgomp.c++/target-std__multimap-concurrent.C: Fix USM memory freeing
Fix the unified-shared memory test,
libgomp.c++/target-std__multimap-concurrent-usm.C
added in commit r16-1010-g83ca283853f195
libgomp: Add testcases for concurrent access to standard C++ containers
on offload targets, a number of USM variants
This tests includes the actual code of target-std__multimap-concurrent.C.
The issue is that multimap.insert allocates memory – which is freed by
the destructor. However, if the memory is allocated on a device
('insert'), it also needs to be freed there ('clear') as in general
freeing device-allocated memory is not possible on the host.
libgomp/ChangeLog:
* testsuite/libgomp.c++/target-std__multimap-concurrent.C: Fix memory
freeing of device allocated memory with USM.
| -rw-r--r-- | libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C b/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C index 6a4a4e8..8dbc912 100644 --- a/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C +++ b/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C @@ -4,6 +4,7 @@ #include <stdlib.h> #include <time.h> #include <map> +#include <omp.h> // Make sure that KEY_MAX is less than N to ensure some duplicate keys. #define N 3000 @@ -53,6 +54,16 @@ int main (void) for (auto it = range.first; it != range.second; ++it) sum += (long long) it->first * it->second; } +#ifdef MEM_SHARED + /* Even with USM, memory allocated on the device (with _map.insert) + must be freed on the device. */ + if (omp_get_default_device () != omp_initial_device + && omp_get_default_device () != omp_get_num_devices ()) + { + #pragma omp target + _map.clear (); + } +#endif #ifndef MEM_SHARED #pragma omp target |
