//===------- Offload API tests - olLaunchKernel Cooperative ---------------===// // // 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 olLaunchKernelCooperativeTest : LaunchSingleKernelTestBase { void SetUp() override { SetUpKernel("noargs"); bool SupportsCooperative = false; auto Result = olGetDeviceInfo(Device, OL_DEVICE_INFO_COOPERATIVE_LAUNCH_SUPPORT, sizeof(bool), &SupportsCooperative); if (Result) { if (Result->Code == OL_ERRC_UNIMPLEMENTED) { GTEST_SKIP() << "Device does not provide cooperative launch support information"; } if (Result->Code != OL_ERRC_SUCCESS) { GTEST_FAIL() << "olGetDeviceInfo failed with unexpected error: " << Result->Code << ": " << Result->Details; } } if (!SupportsCooperative) { GTEST_SKIP() << "Device does not support cooperative kernel launch"; } } }; OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelCooperativeTest); TEST_P(olLaunchKernelCooperativeTest, GetMaxCooperativeGroupCount) { uint32_t MaxGroupCount = 0; ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount( Device, Kernel, &LaunchArgs, &MaxGroupCount)); ASSERT_GT(MaxGroupCount, 0u); } TEST_P(olLaunchKernelCooperativeTest, SuccessCooperative) { uint32_t MaxGroupCount = 0; ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount( Device, Kernel, &LaunchArgs, &MaxGroupCount)); LaunchArgs.NumGroups.x = MaxGroupCount; bool IsCooperative = true; ol_kernel_launch_prop_t Props[] = { {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative}, OL_KERNEL_LAUNCH_PROP_END}; ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, Props, 0, nullptr, nullptr)); ASSERT_SUCCESS(olSyncQueue(Queue)); } TEST_P(olLaunchKernelCooperativeTest, SuccessNonCooperative) { ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, nullptr, 0, nullptr, nullptr)); ASSERT_SUCCESS(olSyncQueue(Queue)); } TEST_P(olLaunchKernelCooperativeTest, TooManyGroups) { uint32_t MaxGroupCount = 0; ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount( Device, Kernel, &LaunchArgs, &MaxGroupCount)); LaunchArgs.NumGroups.x = MaxGroupCount * 2; bool IsCooperative = true; ol_kernel_launch_prop_t Props[] = { {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative}, OL_KERNEL_LAUNCH_PROP_END}; ASSERT_ANY_ERROR(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, Props, 0, nullptr, nullptr)); } TEST_P(olLaunchKernelCooperativeTest, SynchronousLaunch) { uint32_t MaxGroupCount = 0; ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount( Device, Kernel, &LaunchArgs, &MaxGroupCount)); LaunchArgs.NumGroups.x = std::min(MaxGroupCount, 2u); bool IsCooperative = true; ol_kernel_launch_prop_t Props[] = { {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative}, OL_KERNEL_LAUNCH_PROP_END}; ASSERT_SUCCESS(olLaunchKernel(nullptr, Device, Kernel, &LaunchArgs, Props, 0, nullptr, nullptr)); } TEST_P(olLaunchKernelCooperativeTest, InvalidNullHandleKernel) { uint32_t MaxGroupCount = 0; ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE, olGetKernelMaxCooperativeGroupCount(Device, nullptr, &LaunchArgs, &MaxGroupCount)); } TEST_P(olLaunchKernelCooperativeTest, InvalidNullHandleDevice) { uint32_t MaxGroupCount = 0; ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE, olGetKernelMaxCooperativeGroupCount(nullptr, Kernel, &LaunchArgs, &MaxGroupCount)); } TEST_P(olLaunchKernelCooperativeTest, InvalidNullPointerGroupCountRet) { ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER, olGetKernelMaxCooperativeGroupCount(Device, Kernel, &LaunchArgs, nullptr)); }