1//===------- Offload API tests - olLaunchKernel --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "../common/Fixtures.hpp"
10#include <OffloadAPI.h>
11#include <gtest/gtest.h>
12
13struct LaunchKernelTestBase : OffloadQueueTest {
14 void SetUpKernel(const char *kernel) {
15 RETURN_ON_FATAL_FAILURE(OffloadQueueTest::SetUp());
16 ASSERT_TRUE(TestEnvironment::loadDeviceBinary(kernel, Device, DeviceBin));
17 ASSERT_GE(DeviceBin->getBufferSize(), 0lu);
18 ASSERT_SUCCESS(olCreateProgram(Device, DeviceBin->getBufferStart(),
19 DeviceBin->getBufferSize(), &Program));
20 ASSERT_SUCCESS(olGetKernel(Program, kernel, &Kernel));
21 LaunchArgs.Dimensions = 1;
22 LaunchArgs.GroupSizeX = 64;
23 LaunchArgs.GroupSizeY = 1;
24 LaunchArgs.GroupSizeZ = 1;
25
26 LaunchArgs.NumGroupsX = 1;
27 LaunchArgs.NumGroupsY = 1;
28 LaunchArgs.NumGroupsZ = 1;
29
30 LaunchArgs.DynSharedMemory = 0;
31 }
32
33 void TearDown() override {
34 if (Program) {
35 olDestroyProgram(Program);
36 }
37 RETURN_ON_FATAL_FAILURE(OffloadQueueTest::TearDown());
38 }
39
40 std::unique_ptr<llvm::MemoryBuffer> DeviceBin;
41 ol_program_handle_t Program = nullptr;
42 ol_kernel_handle_t Kernel = nullptr;
43 ol_kernel_launch_size_args_t LaunchArgs{};
44};
45
46struct olLaunchKernelTest : LaunchKernelTestBase {
47 void SetUp() override {
48 RETURN_ON_FATAL_FAILURE(LaunchKernelTestBase::SetUpKernel("foo"));
49 }
50};
51OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelTest);
52
53struct olLaunchKernelNoArgsTest : LaunchKernelTestBase {
54 void SetUp() override {
55 RETURN_ON_FATAL_FAILURE(LaunchKernelTestBase::SetUpKernel("noargs"));
56 }
57};
58OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelNoArgsTest);
59
60TEST_P(olLaunchKernelTest, Success) {
61 void *Mem;
62 ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED,
63 LaunchArgs.GroupSizeX * sizeof(uint32_t), &Mem));
64 struct {
65 void *Mem;
66 } Args{.Mem: Mem};
67
68 ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &Args, sizeof(Args),
69 &LaunchArgs, nullptr));
70
71 ASSERT_SUCCESS(olWaitQueue(Queue));
72
73 uint32_t *Data = (uint32_t *)Mem;
74 for (int i = 0; i < 64; i++) {
75 ASSERT_EQ(Data[i], i);
76 }
77
78 ASSERT_SUCCESS(olMemFree(Mem));
79}
80
81TEST_P(olLaunchKernelNoArgsTest, Success) {
82 ASSERT_SUCCESS(
83 olLaunchKernel(Queue, Device, Kernel, nullptr, 0, &LaunchArgs, nullptr));
84
85 ASSERT_SUCCESS(olWaitQueue(Queue));
86}
87
88TEST_P(olLaunchKernelTest, SuccessSynchronous) {
89 void *Mem;
90 ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED,
91 LaunchArgs.GroupSizeX * sizeof(uint32_t), &Mem));
92
93 struct {
94 void *Mem;
95 } Args{.Mem: Mem};
96
97 ASSERT_SUCCESS(olLaunchKernel(nullptr, Device, Kernel, &Args, sizeof(Args),
98 &LaunchArgs, nullptr));
99
100 uint32_t *Data = (uint32_t *)Mem;
101 for (int i = 0; i < 64; i++) {
102 ASSERT_EQ(Data[i], i);
103 }
104
105 ASSERT_SUCCESS(olMemFree(Mem));
106}
107

source code of offload/unittests/OffloadAPI/kernel/olLaunchKernel.cpp