1111#include < gtest/gtest.h>
1212
1313struct LaunchKernelTestBase : OffloadQueueTest {
14- void SetUpKernel (const char *kernel ) {
14+ void SetUpProgram (const char *program ) {
1515 RETURN_ON_FATAL_FAILURE (OffloadQueueTest::SetUp ());
16- ASSERT_TRUE (TestEnvironment::loadDeviceBinary (kernel , Device, DeviceBin));
16+ ASSERT_TRUE (TestEnvironment::loadDeviceBinary (program , Device, DeviceBin));
1717 ASSERT_GE (DeviceBin->getBufferSize (), 0lu);
1818 ASSERT_SUCCESS (olCreateProgram (Device, DeviceBin->getBufferStart (),
1919 DeviceBin->getBufferSize (), &Program));
20- ASSERT_SUCCESS ( olGetKernel (Program, kernel, &Kernel));
20+
2121 LaunchArgs.Dimensions = 1 ;
2222 LaunchArgs.GroupSize = {64 , 1 , 1 };
2323 LaunchArgs.NumGroups = {1 , 1 , 1 };
@@ -34,13 +34,21 @@ struct LaunchKernelTestBase : OffloadQueueTest {
3434
3535 std::unique_ptr<llvm::MemoryBuffer> DeviceBin;
3636 ol_program_handle_t Program = nullptr ;
37- ol_kernel_handle_t Kernel = nullptr ;
3837 ol_kernel_launch_size_args_t LaunchArgs{};
3938};
4039
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+
4149#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); } \
4452 }; \
4553 OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE (olLaunchKernel##NAME##Test);
4654
@@ -49,6 +57,29 @@ KERNEL_TEST(NoArgs, noargs)
4957KERNEL_TEST(LocalMem, localmem)
5058KERNEL_TEST(LocalMemReduction, localmem_reduction)
5159KERNEL_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" )
5283
5384TEST_P(olLaunchKernelFooTest, Success) {
5485 void *Mem;
@@ -168,3 +199,55 @@ TEST_P(olLaunchKernelLocalMemStaticTest, Success) {
168199
169200 ASSERT_SUCCESS (olMemFree (Mem));
170201}
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