Skip to content

Commit acb6d1f

Browse files
authored
[UR] ASan layer fix and test update (#17826)
Two fixes for asan: * The test has been updated to run on all adapters and also skip HIP and OpenCL (which don't support the required VirtualMem functions). * GetShadowMemory has been changed to CreateShadowMemory. Previously, shadow memory had a static lifetime, while the Context that was used to construct it only had a lifetime of the `AsanInterceptor` object. It has been changed and now each `AsanInterceptor` creates its own shadow memory.
1 parent fcf019b commit acb6d1f

File tree

4 files changed

+93
-64
lines changed

4 files changed

+93
-64
lines changed

unified-runtime/source/loader/layers/sanitizer/asan/asan_interceptor.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ AsanInterceptor::getOrCreateShadowMemory(ur_device_handle_t Device,
332332
}
333333
std::shared_ptr<ContextInfo> CI;
334334
insertContext(InternalContext, CI);
335-
m_ShadowMap[Type] = GetShadowMemory(InternalContext, Device, Type);
335+
m_ShadowMap[Type] = CreateShadowMemory(InternalContext, Device, Type);
336336
m_ShadowMap[Type]->Setup();
337337
}
338338
return m_ShadowMap[Type];

unified-runtime/source/loader/layers/sanitizer/asan/asan_shadow.cpp

+6-12
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,15 @@
2020
namespace ur_sanitizer_layer {
2121
namespace asan {
2222

23-
std::shared_ptr<ShadowMemory> GetShadowMemory(ur_context_handle_t Context,
24-
ur_device_handle_t Device,
25-
DeviceType Type) {
23+
std::shared_ptr<ShadowMemory> CreateShadowMemory(ur_context_handle_t Context,
24+
ur_device_handle_t Device,
25+
DeviceType Type) {
2626
if (Type == DeviceType::CPU) {
27-
static std::shared_ptr<ShadowMemory> ShadowCPU =
28-
std::make_shared<ShadowMemoryCPU>(Context, Device);
29-
return ShadowCPU;
27+
return std::make_shared<ShadowMemoryCPU>(Context, Device);
3028
} else if (Type == DeviceType::GPU_PVC) {
31-
static std::shared_ptr<ShadowMemory> ShadowPVC =
32-
std::make_shared<ShadowMemoryPVC>(Context, Device);
33-
return ShadowPVC;
29+
return std::make_shared<ShadowMemoryPVC>(Context, Device);
3430
} else if (Type == DeviceType::GPU_DG2) {
35-
static std::shared_ptr<ShadowMemory> ShadowDG2 =
36-
std::make_shared<ShadowMemoryDG2>(Context, Device);
37-
return ShadowDG2;
31+
return std::make_shared<ShadowMemoryDG2>(Context, Device);
3832
} else {
3933
getContext()->logger.error("Unsupport device type");
4034
return nullptr;

unified-runtime/source/loader/layers/sanitizer/asan/asan_shadow.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@ struct ShadowMemoryDG2 final : public ShadowMemoryGPU {
163163
size_t GetShadowSize() override { return 0x100000000000ULL; }
164164
};
165165

166-
std::shared_ptr<ShadowMemory> GetShadowMemory(ur_context_handle_t Context,
167-
ur_device_handle_t Device,
168-
DeviceType Type);
166+
std::shared_ptr<ShadowMemory> CreateShadowMemory(ur_context_handle_t Context,
167+
ur_device_handle_t Device,
168+
DeviceType Type);
169169

170170
} // namespace asan
171171
} // namespace ur_sanitizer_layer

unified-runtime/test/layers/sanitizer/asan.cpp

+83-48
Original file line numberDiff line numberDiff line change
@@ -26,30 +26,47 @@ TEST(DeviceAsan, Initialization) {
2626
status = urLoaderInit(0, loaderConfig);
2727
ASSERT_EQ(status, UR_RESULT_SUCCESS);
2828

29-
ur_adapter_handle_t adapter;
30-
status = urAdapterGet(1, &adapter, nullptr);
29+
uint32_t num_adapters;
30+
status = urAdapterGet(0, nullptr, &num_adapters);
3131
ASSERT_EQ(status, UR_RESULT_SUCCESS);
3232

33-
ur_platform_handle_t platform;
34-
status = urPlatformGet(&adapter, 1, 1, &platform, nullptr);
33+
std::vector<ur_adapter_handle_t> adapters;
34+
adapters.resize(num_adapters);
35+
status = urAdapterGet(num_adapters, adapters.data(), nullptr);
3536
ASSERT_EQ(status, UR_RESULT_SUCCESS);
3637

37-
ur_device_handle_t device;
38-
status = urDeviceGet(platform, UR_DEVICE_TYPE_DEFAULT, 1, &device, nullptr);
39-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
38+
for (auto adapter : adapters) {
39+
ur_adapter_backend_t backend;
40+
status = urAdapterGetInfo(adapter, UR_ADAPTER_INFO_BACKEND, sizeof(backend),
41+
&backend, nullptr);
42+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
43+
if (backend == UR_ADAPTER_BACKEND_OPENCL ||
44+
backend == UR_ADAPTER_BACKEND_HIP) {
45+
// Helper methods are unsupported
46+
continue;
47+
}
4048

41-
ur_context_handle_t context;
42-
status = urContextCreate(1, &device, nullptr, &context);
43-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
49+
ur_platform_handle_t platform;
50+
status = urPlatformGet(&adapter, 1, 1, &platform, nullptr);
51+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
4452

45-
status = urContextRelease(context);
46-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
53+
ur_device_handle_t device;
54+
status = urDeviceGet(platform, UR_DEVICE_TYPE_DEFAULT, 1, &device, nullptr);
55+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
4756

48-
status = urDeviceRelease(device);
49-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
57+
ur_context_handle_t context;
58+
status = urContextCreate(1, &device, nullptr, &context);
59+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
5060

51-
status = urAdapterRelease(adapter);
52-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
61+
status = urContextRelease(context);
62+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
63+
64+
status = urDeviceRelease(device);
65+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
66+
67+
status = urAdapterRelease(adapter);
68+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
69+
}
5370

5471
status = urLoaderTearDown();
5572
ASSERT_EQ(status, UR_RESULT_SUCCESS);
@@ -70,49 +87,67 @@ TEST(DeviceAsan, UnsupportedFeature) {
7087
status = urLoaderInit(0, loaderConfig);
7188
ASSERT_EQ(status, UR_RESULT_SUCCESS);
7289

73-
ur_adapter_handle_t adapter;
74-
status = urAdapterGet(1, &adapter, nullptr);
90+
uint32_t num_adapters;
91+
status = urAdapterGet(0, nullptr, &num_adapters);
7592
ASSERT_EQ(status, UR_RESULT_SUCCESS);
7693

77-
ur_platform_handle_t platform;
78-
status = urPlatformGet(&adapter, 1, 1, &platform, nullptr);
94+
std::vector<ur_adapter_handle_t> adapters;
95+
adapters.resize(num_adapters);
96+
status = urAdapterGet(num_adapters, adapters.data(), nullptr);
7997
ASSERT_EQ(status, UR_RESULT_SUCCESS);
8098

81-
ur_device_handle_t device;
82-
status = urDeviceGet(platform, UR_DEVICE_TYPE_DEFAULT, 1, &device, nullptr);
83-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
99+
for (auto adapter : adapters) {
100+
ur_adapter_backend_t backend;
101+
status = urAdapterGetInfo(adapter, UR_ADAPTER_INFO_BACKEND, sizeof(backend),
102+
&backend, nullptr);
103+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
104+
SCOPED_TRACE(backend);
105+
if (backend == UR_ADAPTER_BACKEND_OPENCL ||
106+
backend == UR_ADAPTER_BACKEND_HIP) {
107+
// Helper methods are unsupported
108+
continue;
109+
}
84110

85-
ur_context_handle_t context;
86-
status = urContextCreate(1, &device, nullptr, &context);
87-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
111+
ur_platform_handle_t platform;
112+
status = urPlatformGet(&adapter, 1, 1, &platform, nullptr);
113+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
88114

89-
// Check for explict unsupported features
90-
ur_bool_t isSupported;
91-
status = urDeviceGetInfo(device, UR_DEVICE_INFO_VIRTUAL_MEMORY_SUPPORT,
92-
sizeof(isSupported), &isSupported, nullptr);
93-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
94-
ASSERT_EQ(isSupported, 0);
115+
ur_device_handle_t device;
116+
status = urDeviceGet(platform, UR_DEVICE_TYPE_DEFAULT, 1, &device, nullptr);
117+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
95118

96-
status = urDeviceGetInfo(device, UR_DEVICE_INFO_COMMAND_BUFFER_SUPPORT_EXP,
97-
sizeof(isSupported), &isSupported, nullptr);
98-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
99-
ASSERT_EQ(isSupported, 0);
119+
ur_context_handle_t context;
120+
status = urContextCreate(1, &device, nullptr, &context);
121+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
100122

101-
ur_device_command_buffer_update_capability_flags_t update_flag;
102-
status = urDeviceGetInfo(
103-
device, UR_DEVICE_INFO_COMMAND_BUFFER_UPDATE_CAPABILITIES_EXP,
104-
sizeof(update_flag), &update_flag, nullptr);
105-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
106-
ASSERT_EQ(update_flag, 0);
123+
// Check for explict unsupported features
124+
ur_bool_t isSupported;
125+
status = urDeviceGetInfo(device, UR_DEVICE_INFO_VIRTUAL_MEMORY_SUPPORT,
126+
sizeof(isSupported), &isSupported, nullptr);
127+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
128+
ASSERT_EQ(isSupported, 0);
107129

108-
status = urContextRelease(context);
109-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
130+
status = urDeviceGetInfo(device, UR_DEVICE_INFO_COMMAND_BUFFER_SUPPORT_EXP,
131+
sizeof(isSupported), &isSupported, nullptr);
132+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
133+
ASSERT_EQ(isSupported, 0);
110134

111-
status = urDeviceRelease(device);
112-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
135+
ur_device_command_buffer_update_capability_flags_t update_flag;
136+
status = urDeviceGetInfo(
137+
device, UR_DEVICE_INFO_COMMAND_BUFFER_UPDATE_CAPABILITIES_EXP,
138+
sizeof(update_flag), &update_flag, nullptr);
139+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
140+
ASSERT_EQ(update_flag, 0);
113141

114-
status = urAdapterRelease(adapter);
115-
ASSERT_EQ(status, UR_RESULT_SUCCESS);
142+
status = urContextRelease(context);
143+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
144+
145+
status = urDeviceRelease(device);
146+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
147+
148+
status = urAdapterRelease(adapter);
149+
ASSERT_EQ(status, UR_RESULT_SUCCESS);
150+
}
116151

117152
status = urLoaderTearDown();
118153
ASSERT_EQ(status, UR_RESULT_SUCCESS);

0 commit comments

Comments
 (0)