//===------- Offload API tests - olLaunchKernel --------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "../common/Fixtures.hpp" #include #include struct LaunchKernelTestBase : OffloadQueueTest { void SetUpKernel(const char *kernel) { RETURN_ON_FATAL_FAILURE(OffloadQueueTest::SetUp()); ASSERT_TRUE(TestEnvironment::loadDeviceBinary(kernel, Device, DeviceBin)); ASSERT_GE(DeviceBin->getBufferSize(), 0lu); ASSERT_SUCCESS(olCreateProgram(Device, DeviceBin->getBufferStart(), DeviceBin->getBufferSize(), &Program)); ASSERT_SUCCESS(olGetKernel(Program, kernel, &Kernel)); LaunchArgs.Dimensions = 1; LaunchArgs.GroupSizeX = 64; LaunchArgs.GroupSizeY = 1; LaunchArgs.GroupSizeZ = 1; LaunchArgs.NumGroupsX = 1; LaunchArgs.NumGroupsY = 1; LaunchArgs.NumGroupsZ = 1; LaunchArgs.DynSharedMemory = 0; } void TearDown() override { if (Program) { olDestroyProgram(Program); } RETURN_ON_FATAL_FAILURE(OffloadQueueTest::TearDown()); } std::unique_ptr DeviceBin; ol_program_handle_t Program = nullptr; ol_kernel_handle_t Kernel = nullptr; ol_kernel_launch_size_args_t LaunchArgs{}; }; struct olLaunchKernelTest : LaunchKernelTestBase { void SetUp() override { RETURN_ON_FATAL_FAILURE(LaunchKernelTestBase::SetUpKernel("foo")); } }; OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelTest); struct olLaunchKernelNoArgsTest : LaunchKernelTestBase { void SetUp() override { RETURN_ON_FATAL_FAILURE(LaunchKernelTestBase::SetUpKernel("noargs")); } }; OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelNoArgsTest); TEST_P(olLaunchKernelTest, Success) { void *Mem; ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, LaunchArgs.GroupSizeX * sizeof(uint32_t), &Mem)); struct { void *Mem; } Args{Mem}; ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &Args, sizeof(Args), &LaunchArgs, nullptr)); ASSERT_SUCCESS(olWaitQueue(Queue)); uint32_t *Data = (uint32_t *)Mem; for (int i = 0; i < 64; i++) { ASSERT_EQ(Data[i], i); } ASSERT_SUCCESS(olMemFree(Mem)); } TEST_P(olLaunchKernelNoArgsTest, Success) { ASSERT_SUCCESS( olLaunchKernel(Queue, Device, Kernel, nullptr, 0, &LaunchArgs, nullptr)); ASSERT_SUCCESS(olWaitQueue(Queue)); } TEST_P(olLaunchKernelTest, SuccessSynchronous) { void *Mem; ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, LaunchArgs.GroupSizeX * sizeof(uint32_t), &Mem)); struct { void *Mem; } Args{Mem}; ASSERT_SUCCESS(olLaunchKernel(nullptr, Device, Kernel, &Args, sizeof(Args), &LaunchArgs, nullptr)); uint32_t *Data = (uint32_t *)Mem; for (int i = 0; i < 64; i++) { ASSERT_EQ(Data[i], i); } ASSERT_SUCCESS(olMemFree(Mem)); }