Skip to content

Commit 4be64e7

Browse files
[SYCL] Add unittest for recent handler::set_arg fixes (#7333)
Related PR: #7313
1 parent 09fb342 commit 4be64e7

File tree

4 files changed

+162
-1
lines changed

4 files changed

+162
-1
lines changed

sycl/source/detail/kernel_info.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ typename std::enable_if<
2828
get_kernel_info(RT::PiKernel Kernel, const plugin &Plugin) {
2929
static_assert(detail::is_kernel_info_desc<Param>::value,
3030
"Invalid kernel information descriptor");
31-
size_t ResultSize;
31+
size_t ResultSize = 0;
3232

3333
// TODO catch an exception and put it to list of asynchronous exceptions
3434
Plugin.call<PiApiKind::piKernelGetInfo>(Kernel, PiInfoCode<Param>::value, 0,

sycl/unittests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ add_subdirectory(event)
4848
add_subdirectory(buffer)
4949
add_subdirectory(context)
5050
add_subdirectory(accessor)
51+
add_subdirectory(handler)

sycl/unittests/handler/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
add_sycl_unittest(HandlerTests OBJECT
2+
SetArgForLocalAccessor.cpp
3+
)
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#include <gtest/gtest.h>
2+
#include <helpers/PiMock.hpp>
3+
4+
#include <sycl/sycl.hpp>
5+
6+
// This test checks that we pass the correct buffer size value when setting
7+
// local_accessor as an argument through handler::set_arg to a kernel created
8+
// using OpenCL interoperability methods.
9+
10+
namespace {
11+
12+
struct TestContext {
13+
size_t localBufferArgSize = 0;
14+
15+
// SYCL RT has number of checks that all devices and contexts are consistent
16+
// between kernel, kernel_bundle and other objects.
17+
//
18+
// To ensure that those checks pass, we intercept some PI calls to extract
19+
// the exact PI handles of device and context used in queue creation to later
20+
// return them when program/context/kernel info is requested.
21+
pi_device deviceHandle;
22+
pi_context contextHandle;
23+
24+
pi_program programHandle = createDummyHandle<pi_program>();
25+
26+
~TestContext() { releaseDummyHandle<pi_program>(programHandle); }
27+
};
28+
29+
TestContext GlobalContext;
30+
31+
} // namespace
32+
33+
pi_result redefined_piKernelSetArg(pi_kernel kernel, pi_uint32 arg_index,
34+
size_t arg_size, const void *arg_value) {
35+
GlobalContext.localBufferArgSize = arg_size;
36+
37+
return PI_SUCCESS;
38+
}
39+
40+
pi_result after_piContextGetInfo(pi_context context, pi_context_info param_name,
41+
size_t param_value_size, void *param_value,
42+
size_t *param_value_size_ret) {
43+
switch (param_name) {
44+
case PI_CONTEXT_INFO_DEVICES:
45+
if (param_value)
46+
*static_cast<pi_device *>(param_value) = GlobalContext.deviceHandle;
47+
if (param_value_size_ret)
48+
*param_value_size_ret = sizeof(GlobalContext.deviceHandle);
49+
default:;
50+
}
51+
52+
return PI_SUCCESS;
53+
}
54+
55+
pi_result after_piProgramGetInfo(pi_program program, pi_program_info param_name,
56+
size_t param_value_size, void *param_value,
57+
size_t *param_value_size_ret) {
58+
59+
switch (param_name) {
60+
case PI_PROGRAM_INFO_DEVICES:
61+
if (param_value_size_ret)
62+
*param_value_size_ret = sizeof(GlobalContext.deviceHandle);
63+
if (param_value)
64+
*static_cast<pi_device *>(param_value) = GlobalContext.deviceHandle;
65+
break;
66+
default:;
67+
}
68+
69+
return PI_SUCCESS;
70+
}
71+
72+
pi_result redefined_piProgramGetBuildInfo(pi_program program, pi_device device,
73+
_pi_program_build_info param_name,
74+
size_t param_value_size,
75+
void *param_value,
76+
size_t *param_value_size_ret) {
77+
switch (param_name) {
78+
case PI_PROGRAM_BUILD_INFO_BINARY_TYPE:
79+
if (param_value_size_ret)
80+
*param_value_size_ret = sizeof(pi_program_binary_type);
81+
if (param_value)
82+
*static_cast<pi_program_binary_type *>(param_value) =
83+
PI_PROGRAM_BINARY_TYPE_EXECUTABLE;
84+
break;
85+
default:;
86+
}
87+
88+
return PI_SUCCESS;
89+
}
90+
91+
pi_result after_piContextCreate(const pi_context_properties *properties,
92+
pi_uint32 num_devices, const pi_device *devices,
93+
void (*pfn_notify)(const char *errinfo,
94+
const void *private_info,
95+
size_t cb, void *user_data),
96+
void *user_data, pi_context *ret_context) {
97+
if (ret_context)
98+
GlobalContext.contextHandle = *ret_context;
99+
GlobalContext.deviceHandle = *devices;
100+
return PI_SUCCESS;
101+
}
102+
103+
pi_result after_piKernelGetInfo(pi_kernel kernel, pi_kernel_info param_name,
104+
size_t param_value_size, void *param_value,
105+
size_t *param_value_size_ret) {
106+
switch (param_name) {
107+
case PI_KERNEL_INFO_CONTEXT:
108+
if (param_value_size_ret)
109+
*param_value_size_ret = sizeof(GlobalContext.contextHandle);
110+
if (param_value)
111+
*static_cast<pi_context *>(param_value) = GlobalContext.contextHandle;
112+
break;
113+
case PI_KERNEL_INFO_PROGRAM:
114+
if (param_value_size_ret)
115+
*param_value_size_ret = sizeof(GlobalContext.programHandle);
116+
if (param_value)
117+
*(pi_program *)param_value = GlobalContext.programHandle;
118+
break;
119+
default:;
120+
}
121+
122+
return PI_SUCCESS;
123+
}
124+
125+
TEST(HandlerSetArg, LocalAccessor) {
126+
sycl::unittest::PiMock Mock;
127+
128+
Mock.redefine<sycl::detail::PiApiKind::piKernelSetArg>(
129+
redefined_piKernelSetArg);
130+
Mock.redefineAfter<sycl::detail::PiApiKind::piContextCreate>(
131+
after_piContextCreate);
132+
Mock.redefineAfter<sycl::detail::PiApiKind::piProgramGetInfo>(
133+
after_piProgramGetInfo);
134+
Mock.redefineAfter<sycl::detail::PiApiKind::piContextGetInfo>(
135+
after_piContextGetInfo);
136+
Mock.redefineAfter<sycl::detail::PiApiKind::piKernelGetInfo>(
137+
after_piKernelGetInfo);
138+
Mock.redefine<sycl::detail::PiApiKind::piProgramGetBuildInfo>(
139+
redefined_piProgramGetBuildInfo);
140+
141+
constexpr size_t Size = 128;
142+
sycl::queue Q;
143+
144+
DummyHandleT handle;
145+
auto KernelCL = reinterpret_cast<typename sycl::backend_traits<
146+
sycl::backend::opencl>::template input_type<sycl::kernel>>(&handle);
147+
auto Kernel =
148+
sycl::make_kernel<sycl::backend::opencl>(KernelCL, Q.get_context());
149+
150+
Q.submit([&](sycl::handler &CGH) {
151+
sycl::local_accessor<float, 1> Acc(Size, CGH);
152+
CGH.set_arg(0, Acc);
153+
CGH.single_task(Kernel);
154+
}).wait();
155+
156+
ASSERT_EQ(GlobalContext.localBufferArgSize, Size * sizeof(float));
157+
}

0 commit comments

Comments
 (0)