aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tburnus@baylibre.com>2025-11-05 16:25:54 +0100
committerTobias Burnus <tburnus@baylibre.com>2025-11-05 16:25:54 +0100
commit90f2ab4b6e1463d8cb89c70585e19987a58f3de1 (patch)
treead1c1282b1afa207c466268d0ebc64e05d79dd77
parent4983e9745edae3807243693e8865835b45f08c95 (diff)
downloadgcc-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.C11
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