From 625ade1931a3db55f6f4b6314c23c7d120b6f48c Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Tue, 23 Jul 2024 20:53:57 +0200 Subject: [PATCH] [SYCL][NFC] Introduce more helpers to unittests (#14716) Introduced a macro to hide bolierplate of specializing `KernelInfo` structs. Added a helper function to generate default image to avoid repeating the same code in every test. --- sycl/unittests/SYCL2020/IsCompatible.cpp | 60 +++---------------- sycl/unittests/SYCL2020/KernelBundle.cpp | 24 +------- .../SYCL2020/KernelBundleStateFiltering.cpp | 27 ++------- sycl/unittests/buffer/KernelArgMemObj.cpp | 23 +------ sycl/unittests/helpers/MockKernelInfo.hpp | 15 +++++ sycl/unittests/helpers/PiImage.hpp | 19 ++++++ sycl/unittests/helpers/TestKernel.hpp | 23 +------ sycl/unittests/kernel-and-program/Cache.cpp | 11 +--- .../kernel-and-program/MultipleDevsCache.cpp | 39 +----------- .../kernel-and-program/OutOfResources.cpp | 43 ++----------- .../pipes/host_pipe_registration.cpp | 24 +------- sycl/unittests/queue/GetProfilingInfo.cpp | 49 ++++----------- 12 files changed, 81 insertions(+), 276 deletions(-) diff --git a/sycl/unittests/SYCL2020/IsCompatible.cpp b/sycl/unittests/SYCL2020/IsCompatible.cpp index eafbc00ccbe96..eae77cdf0c8d9 100644 --- a/sycl/unittests/SYCL2020/IsCompatible.cpp +++ b/sycl/unittests/SYCL2020/IsCompatible.cpp @@ -14,59 +14,13 @@ class TestKernelCPUValidReqdWGSize3D; class TestKernelGPU; class TestKernelACC; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernelCPU"; } -}; - -template <> -struct KernelInfo - : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { - return "TestKernelCPUInvalidReqdWGSize1D"; - } -}; - -template <> -struct KernelInfo - : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { - return "TestKernelCPUInvalidReqdWGSize2D"; - } -}; - -template <> -struct KernelInfo - : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { - return "TestKernelCPUInvalidReqdWGSize3D"; - } -}; - -template <> -struct KernelInfo - : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { - return "TestKernelCPUValidReqdWGSize3D"; - } -}; - -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernelGPU"; } -}; - -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernelACC"; } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl +MOCK_INTEGRATION_HEADER(TestKernelCPU) +MOCK_INTEGRATION_HEADER(TestKernelCPUInvalidReqdWGSize1D) +MOCK_INTEGRATION_HEADER(TestKernelCPUInvalidReqdWGSize2D) +MOCK_INTEGRATION_HEADER(TestKernelCPUInvalidReqdWGSize3D) +MOCK_INTEGRATION_HEADER(TestKernelCPUValidReqdWGSize3D) +MOCK_INTEGRATION_HEADER(TestKernelGPU) +MOCK_INTEGRATION_HEADER(TestKernelACC) static sycl::unittest::PiImage generateDefaultImage(std::initializer_list KernelNames, diff --git a/sycl/unittests/SYCL2020/KernelBundle.cpp b/sycl/unittests/SYCL2020/KernelBundle.cpp index 48dddeed77848..21a8761e4c935 100644 --- a/sycl/unittests/SYCL2020/KernelBundle.cpp +++ b/sycl/unittests/SYCL2020/KernelBundle.cpp @@ -20,27 +20,9 @@ class TestKernel; class TestKernelExeOnly; class TestKernelWithAspects; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernel"; } -}; - -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernelExeOnly"; } -}; - -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "TestKernelWithAspects"; } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl +MOCK_INTEGRATION_HEADER(TestKernel) +MOCK_INTEGRATION_HEADER(TestKernelExeOnly) +MOCK_INTEGRATION_HEADER(TestKernelWithAspects) static sycl::unittest::PiImage generateDefaultImage(std::initializer_list KernelNames, diff --git a/sycl/unittests/SYCL2020/KernelBundleStateFiltering.cpp b/sycl/unittests/SYCL2020/KernelBundleStateFiltering.cpp index c2dfa6e51e6b9..7e008b9809b1a 100644 --- a/sycl/unittests/SYCL2020/KernelBundleStateFiltering.cpp +++ b/sycl/unittests/SYCL2020/KernelBundleStateFiltering.cpp @@ -25,27 +25,12 @@ class KernelB; class KernelC; class KernelD; class KernelE; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "KernelA"; } -}; -template <> struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "KernelB"; } -}; -template <> struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "KernelC"; } -}; -template <> struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "KernelD"; } -}; -template <> struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "KernelE"; } -}; -} // namespace detail -} // namespace _V1 -} // namespace sycl + +MOCK_INTEGRATION_HEADER(KernelA) +MOCK_INTEGRATION_HEADER(KernelB) +MOCK_INTEGRATION_HEADER(KernelC) +MOCK_INTEGRATION_HEADER(KernelD) +MOCK_INTEGRATION_HEADER(KernelE) namespace { diff --git a/sycl/unittests/buffer/KernelArgMemObj.cpp b/sycl/unittests/buffer/KernelArgMemObj.cpp index f1315ca8df8ac..7f59cf52d09e2 100644 --- a/sycl/unittests/buffer/KernelArgMemObj.cpp +++ b/sycl/unittests/buffer/KernelArgMemObj.cpp @@ -33,27 +33,8 @@ struct KernelInfo : public unittest::MockKernelInfoBase { } // namespace _V1 } // namespace sycl -static sycl::unittest::PiImage generateImage() { - using namespace sycl::unittest; - - PiPropertySet PropSet; - - std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data - - PiArray Entries = makeEmptyKernels({"TestKernelWithMemObj"}); - - PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format - __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec - "", // Compile options - "", // Link options - std::move(Bin), - std::move(Entries), - std::move(PropSet)}; - - return Img; -} - -static sycl::unittest::PiImage Img = generateImage(); +static auto Img = + sycl::unittest::generateDefaultImage({"TestKernelWithMemObj"}); static sycl::unittest::PiImageArray<1> ImgArray{&Img}; using namespace sycl; diff --git a/sycl/unittests/helpers/MockKernelInfo.hpp b/sycl/unittests/helpers/MockKernelInfo.hpp index ecf137d8a0cd4..836346eddd11d 100644 --- a/sycl/unittests/helpers/MockKernelInfo.hpp +++ b/sycl/unittests/helpers/MockKernelInfo.hpp @@ -29,3 +29,18 @@ struct MockKernelInfoBase { } // namespace unittest } // namespace _V1 } // namespace sycl + +// In most cases we don't need to redefine any other method besides getName(), +// so here we only have the simplest helper. If any test needs to redefine more +// methods, they can do that explicitly. +#define MOCK_INTEGRATION_HEADER(KernelName) \ + namespace sycl { \ + inline namespace _V1 { \ + namespace detail { \ + template <> \ + struct KernelInfo : public unittest::MockKernelInfoBase { \ + static constexpr const char *getName() { return #KernelName; } \ + }; \ + } /* namespace detail */ \ + } /* namespace _V1 */ \ + } /* namespace sycl */ diff --git a/sycl/unittests/helpers/PiImage.hpp b/sycl/unittests/helpers/PiImage.hpp index c34e3d832795c..ee78ab2a65f75 100644 --- a/sycl/unittests/helpers/PiImage.hpp +++ b/sycl/unittests/helpers/PiImage.hpp @@ -536,6 +536,25 @@ addDeviceRequirementsProps(PiPropertySet &Props, std::move(Value)); } +inline PiImage +generateDefaultImage(std::initializer_list KernelNames) { + PiPropertySet PropSet; + + std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data + + PiArray Entries = makeEmptyKernels(KernelNames); + + PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format + __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec + "", // Compile options + "", // Link options + std::move(Bin), + std::move(Entries), + std::move(PropSet)}; + + return Img; +} + } // namespace unittest } // namespace _V1 } // namespace sycl diff --git a/sycl/unittests/helpers/TestKernel.hpp b/sycl/unittests/helpers/TestKernel.hpp index 2c92d815aeb30..0edc129e03413 100644 --- a/sycl/unittests/helpers/TestKernel.hpp +++ b/sycl/unittests/helpers/TestKernel.hpp @@ -33,25 +33,6 @@ struct KernelInfo> } // namespace _V1 } // namespace sycl -static sycl::unittest::PiImage generateDefaultImage() { - using namespace sycl::unittest; - - PiPropertySet PropSet; - - std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data - - PiArray Entries = makeEmptyKernels({"TestKernel"}); - - PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format - __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec - "", // Compile options - "", // Link options - std::move(Bin), - std::move(Entries), - std::move(PropSet)}; - - return Img; -} - -static sycl::unittest::PiImage Img = generateDefaultImage(); +static sycl::unittest::PiImage Img = + sycl::unittest::generateDefaultImage({"TestKernel"}); static sycl::unittest::PiImageArray<1> ImgArray{&Img}; diff --git a/sycl/unittests/kernel-and-program/Cache.cpp b/sycl/unittests/kernel-and-program/Cache.cpp index 7205c1eaea867..3b4089d50deb2 100644 --- a/sycl/unittests/kernel-and-program/Cache.cpp +++ b/sycl/unittests/kernel-and-program/Cache.cpp @@ -36,18 +36,13 @@ class CacheTestKernel2 { void operator()(sycl::item<1>){}; }; +MOCK_INTEGRATION_HEADER(CacheTestKernel) +MOCK_INTEGRATION_HEADER(CacheTestKernel2) + namespace sycl { const static specialization_id SpecConst1{42}; inline namespace _V1 { namespace detail { -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "CacheTestKernel"; } -}; -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "CacheTestKernel2"; } -}; template <> const char *get_spec_constant_symbolic_ID() { return "SC1"; } diff --git a/sycl/unittests/kernel-and-program/MultipleDevsCache.cpp b/sycl/unittests/kernel-and-program/MultipleDevsCache.cpp index 32cb6c83c8fa7..77744401efdd4 100644 --- a/sycl/unittests/kernel-and-program/MultipleDevsCache.cpp +++ b/sycl/unittests/kernel-and-program/MultipleDevsCache.cpp @@ -23,43 +23,10 @@ using namespace sycl; class MultipleDevsCacheTestKernel; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> -struct KernelInfo - : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { - return "MultipleDevsCacheTestKernel"; - } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl - -static sycl::unittest::PiImage generateDefaultImage() { - using namespace sycl::unittest; - - PiPropertySet PropSet; - - std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data - - PiArray Entries = - makeEmptyKernels({"MultipleDevsCacheTestKernel"}); - - PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format - __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec - "", // Compile options - "", // Link options - std::move(Bin), - std::move(Entries), - std::move(PropSet)}; - - return Img; -} +MOCK_INTEGRATION_HEADER(MultipleDevsCacheTestKernel) -static sycl::unittest::PiImage Img = generateDefaultImage(); +static sycl::unittest::PiImage Img = + sycl::unittest::generateDefaultImage({"MultipleDevsCacheTestKernel"}); static sycl::unittest::PiImageArray<1> ImgArray{&Img}; static pi_result redefinedDevicesGetAfter(pi_platform platform, diff --git a/sycl/unittests/kernel-and-program/OutOfResources.cpp b/sycl/unittests/kernel-and-program/OutOfResources.cpp index e8c04bf8796c6..b839618264901 100644 --- a/sycl/unittests/kernel-and-program/OutOfResources.cpp +++ b/sycl/unittests/kernel-and-program/OutOfResources.cpp @@ -24,45 +24,12 @@ using namespace sycl; class OutOfResourcesKernel1; class OutOfResourcesKernel2; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "OutOfResourcesKernel1"; } -}; +MOCK_INTEGRATION_HEADER(OutOfResourcesKernel1) +MOCK_INTEGRATION_HEADER(OutOfResourcesKernel2) -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "OutOfResourcesKernel2"; } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl - -static sycl::unittest::PiImage makeImage(const char *kname) { - using namespace sycl::unittest; - - PiPropertySet PropSet; - - std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data - - PiArray Entries = makeEmptyKernels({kname}); - - PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format - __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec - "", // Compile options - "", // Link options - std::move(Bin), - std::move(Entries), - std::move(PropSet)}; - - return Img; -} - -static sycl::unittest::PiImage Img[2] = {makeImage("OutOfResourcesKernel1"), - makeImage("OutOfResourcesKernel2")}; +static sycl::unittest::PiImage Img[2] = { + sycl::unittest::generateDefaultImage({"OutOfResourcesKernel1"}), + sycl::unittest::generateDefaultImage({"OutOfResourcesKernel2"})}; static sycl::unittest::PiImageArray<2> ImgArray{Img}; diff --git a/sycl/unittests/pipes/host_pipe_registration.cpp b/sycl/unittests/pipes/host_pipe_registration.cpp index 7220e41739515..4938c4a89ae1a 100644 --- a/sycl/unittests/pipes/host_pipe_registration.cpp +++ b/sycl/unittests/pipes/host_pipe_registration.cpp @@ -12,31 +12,13 @@ #include #include #include +#include #include #include #include -template class TestKernel; - -namespace sycl { -inline namespace _V1 { -namespace detail { -template struct KernelInfo> { - static constexpr unsigned getNumParams() { return 0; } - static const kernel_param_desc_t &getParamDesc(int) { - static kernel_param_desc_t Dummy; - return Dummy; - } - static constexpr const char *getName() { return "TestKernel"; } - static constexpr bool isESIMD() { return false; } - static constexpr bool callsThisItem() { return false; } - static constexpr bool callsAnyThisFreeFunction() { return false; } - static constexpr int64_t getKernelSize() { return KernelSize; } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl +class TestKernel; +MOCK_INTEGRATION_HEADER(TestKernel) using namespace sycl; using default_pipe_properties = diff --git a/sycl/unittests/queue/GetProfilingInfo.cpp b/sycl/unittests/queue/GetProfilingInfo.cpp index 4872b2a243b46..13f49b5bafa4d 100644 --- a/sycl/unittests/queue/GetProfilingInfo.cpp +++ b/sycl/unittests/queue/GetProfilingInfo.cpp @@ -24,36 +24,7 @@ class InfoTestKernel; -namespace sycl { -inline namespace _V1 { -namespace detail { -template <> -struct KernelInfo : public unittest::MockKernelInfoBase { - static constexpr const char *getName() { return "InfoTestKernel"; } -}; - -} // namespace detail -} // namespace _V1 -} // namespace sycl -template sycl::unittest::PiImage generateTestImage() { - using namespace sycl::unittest; - - PiPropertySet PropSet; - - std::vector Bin{0, 1, 2, 3, 4, 5}; // Random data - - PiArray Entries = makeEmptyKernels({"InfoTestKernel"}); - - PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format - __SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec - "", // Compile options - "", // Link options - std::move(Bin), - std::move(Entries), - std::move(PropSet)}; - - return Img; -} +MOCK_INTEGRATION_HEADER(InfoTestKernel) static pi_result redefinedPiEventGetProfilingInfo(pi_event event, pi_profiling_info param_name, @@ -86,7 +57,8 @@ TEST(GetProfilingInfo, normal_pass_without_exception) { redefinedPiEventGetProfilingInfo); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); @@ -123,7 +95,8 @@ TEST(GetProfilingInfo, command_exception_check) { redefinedPiEventGetProfilingInfo); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); sycl::queue Queue{Ctx, Dev}; @@ -223,7 +196,8 @@ TEST(GetProfilingInfo, check_if_now_dead_queue_property_set) { redefinedPiEventGetProfilingInfo); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); const int globalWIs{512}; @@ -262,7 +236,8 @@ TEST(GetProfilingInfo, check_if_now_dead_queue_property_not_set) { redefinedPiEventGetProfilingInfo); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); @@ -407,7 +382,8 @@ TEST(GetProfilingInfo, fallback_profiling_PiGetDeviceAndHostTimer_unsupported) { redefinedDeviceGetInfoAcc); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); sycl::queue Queue{ @@ -445,7 +421,8 @@ TEST(GetProfilingInfo, fallback_profiling_mock_piEnqueueKernelLaunch) { redefinedDeviceGetInfoAcc); const sycl::device Dev = Plt.get_devices()[0]; sycl::context Ctx{Dev}; - static sycl::unittest::PiImage DevImage = generateTestImage(); + static auto DevImage = + sycl::unittest::generateDefaultImage({"InfoTestKernel"}); static sycl::unittest::PiImageArray<1> DevImageArray = {&DevImage}; auto KernelID = sycl::get_kernel_id(); sycl::queue Queue{