11
11
#include < gtest/gtest.h>
12
12
13
13
struct LaunchKernelTestBase : OffloadQueueTest {
14
- void SetUpKernel (const char *kernel ) {
14
+ void SetUpProgram (const char *program ) {
15
15
RETURN_ON_FATAL_FAILURE (OffloadQueueTest::SetUp ());
16
- ASSERT_TRUE (TestEnvironment::loadDeviceBinary (kernel , Device, DeviceBin));
16
+ ASSERT_TRUE (TestEnvironment::loadDeviceBinary (program , Device, DeviceBin));
17
17
ASSERT_GE (DeviceBin->getBufferSize (), 0lu);
18
18
ASSERT_SUCCESS (olCreateProgram (Device, DeviceBin->getBufferStart (),
19
19
DeviceBin->getBufferSize (), &Program));
20
- ASSERT_SUCCESS ( olGetKernel (Program, kernel, &Kernel));
20
+
21
21
LaunchArgs.Dimensions = 1 ;
22
22
LaunchArgs.GroupSize = {64 , 1 , 1 };
23
23
LaunchArgs.NumGroups = {1 , 1 , 1 };
@@ -34,13 +34,21 @@ struct LaunchKernelTestBase : OffloadQueueTest {
34
34
35
35
std::unique_ptr<llvm::MemoryBuffer> DeviceBin;
36
36
ol_program_handle_t Program = nullptr ;
37
- ol_kernel_handle_t Kernel = nullptr ;
38
37
ol_kernel_launch_size_args_t LaunchArgs{};
39
38
};
40
39
40
+ struct LaunchSingleKernelTestBase : LaunchKernelTestBase {
41
+ void SetUpKernel (const char *kernel) {
42
+ RETURN_ON_FATAL_FAILURE (SetUpProgram (kernel));
43
+ ASSERT_SUCCESS (olGetKernel (Program, kernel, &Kernel));
44
+ }
45
+
46
+ ol_kernel_handle_t Kernel = nullptr ;
47
+ };
48
+
41
49
#define KERNEL_TEST (NAME, KERNEL ) \
42
- struct olLaunchKernel ##NAME##Test : LaunchKernelTestBase { \
43
- void SetUp () override { LaunchKernelTestBase:: SetUpKernel (#KERNEL); } \
50
+ struct olLaunchKernel ##NAME##Test : LaunchSingleKernelTestBase { \
51
+ void SetUp () override { SetUpKernel (#KERNEL); } \
44
52
}; \
45
53
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE (olLaunchKernel##NAME##Test);
46
54
@@ -49,6 +57,29 @@ KERNEL_TEST(NoArgs, noargs)
49
57
KERNEL_TEST(LocalMem, localmem)
50
58
KERNEL_TEST(LocalMemReduction, localmem_reduction)
51
59
KERNEL_TEST(LocalMemStatic, localmem_static)
60
+ KERNEL_TEST(GlobalCtor, global_ctor)
61
+ KERNEL_TEST(GlobalDtor, global_dtor)
62
+
63
+ struct LaunchMultipleKernelTestBase : LaunchKernelTestBase {
64
+ void SetUpKernels (const char *program, std::vector<const char *> kernels) {
65
+ RETURN_ON_FATAL_FAILURE (SetUpProgram (program));
66
+
67
+ Kernels.resize (kernels.size ());
68
+ size_t I = 0 ;
69
+ for (auto K : kernels)
70
+ ASSERT_SUCCESS (olGetKernel (Program, K, &Kernels[I++]));
71
+ }
72
+
73
+ std::vector<ol_kernel_handle_t > Kernels;
74
+ };
75
+
76
+ #define KERNEL_MULTI_TEST (NAME, PROGRAM, ...) \
77
+ struct olLaunchKernel ##NAME##Test : LaunchMultipleKernelTestBase { \
78
+ void SetUp () override { SetUpKernels (#PROGRAM, {__VA_ARGS__}); } \
79
+ }; \
80
+ OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE (olLaunchKernel##NAME##Test);
81
+
82
+ KERNEL_MULTI_TEST (Global, global, " write" , " read" )
52
83
53
84
TEST_P(olLaunchKernelFooTest, Success) {
54
85
void *Mem;
@@ -168,3 +199,55 @@ TEST_P(olLaunchKernelLocalMemStaticTest, Success) {
168
199
169
200
ASSERT_SUCCESS (olMemFree (Mem));
170
201
}
202
+
203
+ TEST_P (olLaunchKernelGlobalTest, Success) {
204
+ void *Mem;
205
+ ASSERT_SUCCESS (olMemAlloc (Device, OL_ALLOC_TYPE_MANAGED,
206
+ LaunchArgs.GroupSize .x * sizeof (uint32_t ), &Mem));
207
+ struct {
208
+ void *Mem;
209
+ } Args{Mem};
210
+
211
+ ASSERT_SUCCESS (olLaunchKernel (Queue, Device, Kernels[0 ], nullptr , 0 ,
212
+ &LaunchArgs, nullptr ));
213
+ ASSERT_SUCCESS (olWaitQueue (Queue));
214
+ ASSERT_SUCCESS (olLaunchKernel (Queue, Device, Kernels[1 ], &Args, sizeof (Args),
215
+ &LaunchArgs, nullptr ));
216
+ ASSERT_SUCCESS (olWaitQueue (Queue));
217
+
218
+ uint32_t *Data = (uint32_t *)Mem;
219
+ for (uint32_t i = 0 ; i < 64 ; i++) {
220
+ ASSERT_EQ (Data[i], i * 2 );
221
+ }
222
+
223
+ ASSERT_SUCCESS (olMemFree (Mem));
224
+ }
225
+
226
+ TEST_P (olLaunchKernelGlobalCtorTest, Success) {
227
+ void *Mem;
228
+ ASSERT_SUCCESS (olMemAlloc (Device, OL_ALLOC_TYPE_MANAGED,
229
+ LaunchArgs.GroupSize .x * sizeof (uint32_t ), &Mem));
230
+ struct {
231
+ void *Mem;
232
+ } Args{Mem};
233
+
234
+ ASSERT_SUCCESS (olLaunchKernel (Queue, Device, Kernel, &Args, sizeof (Args),
235
+ &LaunchArgs, nullptr ));
236
+ ASSERT_SUCCESS (olWaitQueue (Queue));
237
+
238
+ uint32_t *Data = (uint32_t *)Mem;
239
+ for (uint32_t i = 0 ; i < 64 ; i++) {
240
+ ASSERT_EQ (Data[i], i + 100 );
241
+ }
242
+
243
+ ASSERT_SUCCESS (olMemFree (Mem));
244
+ }
245
+
246
+ TEST_P (olLaunchKernelGlobalDtorTest, Success) {
247
+ // TODO: We can't inspect the result of a destructor yet, once we
248
+ // find/implement a way, update this test. For now we just check that nothing
249
+ // crashes
250
+ ASSERT_SUCCESS (
251
+ olLaunchKernel (Queue, Device, Kernel, nullptr , 0 , &LaunchArgs, nullptr ));
252
+ ASSERT_SUCCESS (olWaitQueue (Queue));
253
+ }
0 commit comments