2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2024-01-19 20:38:56 +08:00
|
|
|
* Copyright (C) 2018-2024 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2021-12-15 01:40:08 +08:00
|
|
|
#include "shared/test/common/test_macros/test.h"
|
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/helpers/dispatch_info_builder.h"
|
2020-05-28 20:05:12 +08:00
|
|
|
#include "opencl/test/unit_test/fixtures/cl_device_fixture.h"
|
2020-02-23 22:20:22 +08:00
|
|
|
#include "opencl/test/unit_test/fixtures/context_fixture.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_buffer.h"
|
2023-01-13 03:31:00 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_cl_device.h"
|
2020-02-23 22:20:22 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
using namespace SplitDispatch;
|
|
|
|
|
2020-05-28 20:05:12 +08:00
|
|
|
class DispatchInfoBuilderFixture : public ContextFixture, public ClDeviceFixture {
|
2022-08-16 22:51:17 +08:00
|
|
|
using ContextFixture::setUp;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
DispatchInfoBuilderFixture() {}
|
|
|
|
void clearCrossThreadData() {
|
|
|
|
memset(pCrossThreadData, 0, sizeof(pCrossThreadData));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
2022-08-16 22:51:17 +08:00
|
|
|
void setUp() {
|
|
|
|
ClDeviceFixture::setUp();
|
2020-01-14 21:32:11 +08:00
|
|
|
cl_device_id device = pClDevice;
|
2022-08-16 22:51:17 +08:00
|
|
|
ContextFixture::setUp(1, &device);
|
2021-04-08 17:05:45 +08:00
|
|
|
pKernelInfo = std::make_unique<MockKernelInfo>();
|
2021-02-16 22:28:59 +08:00
|
|
|
|
|
|
|
pKernelInfo->kernelDescriptor.kernelAttributes.bufferAddressingMode = KernelDescriptor::Stateless;
|
2020-11-19 19:30:44 +08:00
|
|
|
pKernelInfo->kernelDescriptor.kernelAttributes.simdSize = 32;
|
2023-11-30 18:36:43 +08:00
|
|
|
pKernelInfo->kernelDescriptor.kernelAttributes.numGrfRequired = GrfConfig::defaultGrfNumber;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2024-01-23 18:41:31 +08:00
|
|
|
pKernelInfo->kernelDescriptor.kernelAttributes.perThreadScratchSize[0] = 1024;
|
2021-04-08 17:05:45 +08:00
|
|
|
pKernelInfo->setPrintfSurface(sizeof(uintptr_t), 0);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
pKernelInfo->addArgBuffer(0, 0x10, sizeof(void *));
|
|
|
|
pKernelInfo->addArgBuffer(1, 0x30, sizeof(void *));
|
|
|
|
pKernelInfo->addArgBuffer(2, 0x50, sizeof(void *));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2020-10-16 21:00:28 +08:00
|
|
|
pProgram = new MockProgram(pContext, false, toClDeviceVector(*pClDevice));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
pKernel = new MockKernel(pProgram, *pKernelInfo, *pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, pKernel->initialize());
|
|
|
|
pKernel->setCrossThreadData(pCrossThreadData, sizeof(pCrossThreadData));
|
|
|
|
pKernel->setKernelArgHandler(0, &Kernel::setArgBuffer);
|
|
|
|
|
2021-03-22 19:06:23 +08:00
|
|
|
pKernel->slmTotalSize = 128;
|
2017-12-21 07:45:38 +08:00
|
|
|
pKernel->isBuiltIn = true;
|
|
|
|
}
|
|
|
|
|
2022-08-16 22:51:17 +08:00
|
|
|
void tearDown() {
|
2017-12-21 07:45:38 +08:00
|
|
|
delete pKernel;
|
|
|
|
delete pProgram;
|
|
|
|
|
2022-08-16 22:51:17 +08:00
|
|
|
ContextFixture::tearDown();
|
|
|
|
ClDeviceFixture::tearDown();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
std::unique_ptr<MockKernelInfo> pKernelInfo;
|
2017-12-21 07:45:38 +08:00
|
|
|
MockProgram *pProgram = nullptr;
|
|
|
|
MockKernel *pKernel = nullptr;
|
|
|
|
char pCrossThreadData[128];
|
|
|
|
};
|
|
|
|
|
2022-08-16 22:51:17 +08:00
|
|
|
typedef Test<DispatchInfoBuilderFixture> DispatchInfoBuilderTest;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-11-24 01:09:04 +08:00
|
|
|
template <SplitDispatch::Dim dim, SplitDispatch::SplitMode mode>
|
|
|
|
class DispatchInfoBuilderMock : DispatchInfoBuilder<dim, mode> {
|
2017-12-21 07:45:38 +08:00
|
|
|
public:
|
2023-11-24 01:09:04 +08:00
|
|
|
using DispatchInfoBuilder<dim, mode>::DispatchInfoBuilder;
|
2017-12-21 07:45:38 +08:00
|
|
|
void pushSplit(const DispatchInfo &dispatchInfo, MultiDispatchInfo &outMdi) {
|
2023-11-24 01:09:04 +08:00
|
|
|
DispatchInfoBuilder<dim, mode>::pushSplit(dispatchInfo, outMdi);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, Given1dWhenSplittingMultiDispatchInfoThenMultiDispatchInfo) {
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
auto diBuilder = new DispatchInfoBuilderMock<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
DispatchInfo dispatchInfo;
|
|
|
|
diBuilder->pushSplit(dispatchInfo, multiDispatchInfo);
|
|
|
|
EXPECT_TRUE(multiDispatchInfo.empty());
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenGettingDimensionThenCorrectDimensionIsReturned) {
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo mdi1D, mdi2D, mdi3D;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::noSplit> *diBuilder1D = new DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder1D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::noSplit> *diBuilder2D = new DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder2D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder3D = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder3D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder1D->setDispatchGeometry(Vec3<size_t>(1, 0, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder1D->bake(mdi1D);
|
|
|
|
for (auto &dispatchInfo : mdi1D) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getDim());
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder2D->setDispatchGeometry(Vec3<size_t>(1, 2, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder2D->bake(mdi2D);
|
|
|
|
for (auto &dispatchInfo : mdi2D) {
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getDim());
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder3D->setDispatchGeometry(Vec3<size_t>(1, 2, 3), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder3D->bake(mdi3D);
|
|
|
|
for (auto &dispatchInfo : mdi3D) {
|
|
|
|
EXPECT_EQ(3u, dispatchInfo.getDim());
|
|
|
|
}
|
|
|
|
|
|
|
|
delete diBuilder3D;
|
|
|
|
delete diBuilder2D;
|
|
|
|
delete diBuilder1D;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenGettingGwsThenCorrectValuesAreReturned) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
MultiDispatchInfo mdi0, mdi1, mdi2, mdi3;
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi0);
|
|
|
|
EXPECT_TRUE(mdi0.empty());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 0, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi1);
|
|
|
|
for (auto &dispatchInfo : mdi1) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 2, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi2);
|
|
|
|
for (auto &dispatchInfo : mdi2) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 2, 3), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi3);
|
|
|
|
for (auto &dispatchInfo : mdi3) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(3u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(3u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenGettingElwsThenCorrectValuesAreReturned) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
MultiDispatchInfo mdi0, mdi1, mdi2, mdi3;
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(1, 1, 1), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi0);
|
|
|
|
EXPECT_TRUE(mdi0.empty());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 0, 0), Vec3<size_t>(1, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi1);
|
|
|
|
for (auto &dispatchInfo : mdi1) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 1, 0), Vec3<size_t>(1, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi2);
|
|
|
|
for (auto &dispatchInfo : mdi2) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(1, 1, 1), Vec3<size_t>(1, 2, 3), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi3);
|
|
|
|
for (auto &dispatchInfo : mdi3) {
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(3u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(3u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenGettingLwsThenCorrectValuesAreReturned) {
|
2023-12-19 18:17:17 +08:00
|
|
|
auto diBuilder = std::make_unique<DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>>(*pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder);
|
|
|
|
|
|
|
|
MultiDispatchInfo mdi0, mdi1, mdi2, mdi3;
|
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi0);
|
|
|
|
EXPECT_TRUE(mdi0.empty());
|
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
2021-01-14 19:34:49 +08:00
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(4, 0, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
diBuilder->bake(mdi1);
|
|
|
|
for (auto &dispatchInfo : mdi1) {
|
2021-01-14 19:34:49 +08:00
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().x);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
2021-01-14 19:34:49 +08:00
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(4, 4, 0), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
diBuilder->bake(mdi2);
|
|
|
|
for (auto &dispatchInfo : mdi2) {
|
2021-01-14 19:34:49 +08:00
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().y);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
}
|
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
2021-01-14 19:34:49 +08:00
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(4, 4, 4), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
diBuilder->bake(mdi3);
|
|
|
|
for (auto &dispatchInfo : mdi3) {
|
2021-01-14 19:34:49 +08:00
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(4u, dispatchInfo.getLocalWorkgroupSize().x);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenNoSplitWhenCheckingIfBuiltinThenReturnTrue) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
diBuilder->bake(multiDispatchInfo);
|
|
|
|
|
|
|
|
for (auto &dispatchInfo : multiDispatchInfo) {
|
|
|
|
ASSERT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_TRUE(dispatchInfo.getKernel()->isBuiltIn);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplitWhenCheckingIfBuiltinThenReturnTrue) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::kernelSplit> *diBuilder1D = new DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::kernelSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder1D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::kernelSplit> *diBuilder2D = new DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::kernelSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder2D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::kernelSplit> *diBuilder3D = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::kernelSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder3D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// 1D
|
2023-12-19 18:17:17 +08:00
|
|
|
diBuilder1D->setKernel(RegionCoordX::left, pKernel);
|
|
|
|
diBuilder1D->setDispatchGeometry(RegionCoordX::left, Vec3<size_t>(256, 0, 0), Vec3<size_t>(16, 0, 0), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo mdi1D;
|
|
|
|
diBuilder1D->bake(mdi1D);
|
|
|
|
|
|
|
|
for (auto &dispatchInfo : mdi1D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_TRUE(dispatchInfo.getKernel()->isBuiltIn);
|
|
|
|
}
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// 2D
|
2023-12-19 18:17:17 +08:00
|
|
|
diBuilder2D->setKernel(RegionCoordX::left, RegionCoordY::bottom, pKernel);
|
|
|
|
diBuilder2D->setDispatchGeometry(RegionCoordX::left, RegionCoordY::bottom, Vec3<size_t>(256, 256, 0), Vec3<size_t>(16, 16, 0), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo mdi2D;
|
|
|
|
diBuilder2D->bake(mdi2D);
|
|
|
|
for (auto &dispatchInfo : mdi2D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_TRUE(dispatchInfo.getKernel()->isBuiltIn);
|
|
|
|
}
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// 3D
|
2023-12-19 18:17:17 +08:00
|
|
|
diBuilder3D->setKernel(RegionCoordX::right, RegionCoordY::bottom, RegionCoordZ::back, pKernel);
|
|
|
|
diBuilder3D->setDispatchGeometry(RegionCoordX::right, RegionCoordY::bottom, RegionCoordZ::back, Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo mdi3D;
|
|
|
|
diBuilder3D->bake(mdi3D);
|
|
|
|
|
|
|
|
for (auto &dispatchInfo : mdi3D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_TRUE(dispatchInfo.getKernel()->isBuiltIn);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete diBuilder3D;
|
|
|
|
delete diBuilder2D;
|
|
|
|
delete diBuilder1D;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenNoSplitWhenGettingWalkerInfoThenCorrectValuesAreReturned) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit> *diBuilder1D = new DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder1D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit> *diBuilder2D = new DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder2D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit> *diBuilder3D = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder3D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// 1D
|
|
|
|
diBuilder1D->setKernel(pKernel);
|
|
|
|
diBuilder1D->setDispatchGeometry(Vec3<size_t>(256, 0, 0), Vec3<size_t>(16, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi1D;
|
|
|
|
diBuilder1D->bake(mdi1D);
|
|
|
|
EXPECT_EQ(1u, mdi1D.size());
|
|
|
|
|
|
|
|
const DispatchInfo *di1D = mdi1D.begin();
|
|
|
|
EXPECT_EQ(pKernel, di1D->getKernel());
|
|
|
|
EXPECT_EQ(256u, di1D->getGWS().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getGWS().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getGWS().z);
|
|
|
|
EXPECT_EQ(16u, di1D->getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, di1D->getOffset().x);
|
|
|
|
EXPECT_EQ(0u, di1D->getOffset().y);
|
|
|
|
EXPECT_EQ(0u, di1D->getOffset().z);
|
|
|
|
EXPECT_EQ(16u, di1D->getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(256u, di1D->getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(16u, di1D->getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getTotalNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(16u, di1D->getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(1u, di1D->getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, di1D->getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, di1D->getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, di1D->getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, di1D->getStartOfWorkgroups().z);
|
|
|
|
|
|
|
|
// 2D
|
|
|
|
diBuilder2D->setKernel(pKernel);
|
|
|
|
diBuilder2D->setDispatchGeometry(Vec3<size_t>(256, 256, 0), Vec3<size_t>(16, 16, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi2D;
|
|
|
|
diBuilder2D->bake(mdi2D);
|
|
|
|
EXPECT_EQ(1u, mdi2D.size());
|
|
|
|
|
|
|
|
const DispatchInfo *di2D = mdi2D.begin();
|
|
|
|
EXPECT_EQ(pKernel, di2D->getKernel());
|
|
|
|
EXPECT_EQ(256u, di2D->getGWS().x);
|
|
|
|
EXPECT_EQ(256u, di2D->getGWS().y);
|
|
|
|
EXPECT_EQ(1u, di2D->getGWS().z);
|
|
|
|
EXPECT_EQ(16u, di2D->getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(16u, di2D->getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, di2D->getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, di2D->getOffset().x);
|
|
|
|
EXPECT_EQ(0u, di2D->getOffset().y);
|
|
|
|
EXPECT_EQ(0u, di2D->getOffset().z);
|
|
|
|
EXPECT_EQ(16u, di2D->getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(16u, di2D->getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, di2D->getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(16u, di2D->getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(16u, di2D->getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, di2D->getTotalNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(16u, di2D->getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(16u, di2D->getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, di2D->getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, di2D->getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, di2D->getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, di2D->getStartOfWorkgroups().z);
|
|
|
|
|
|
|
|
// 3D
|
|
|
|
diBuilder3D->setKernel(pKernel);
|
|
|
|
diBuilder3D->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi3D;
|
|
|
|
diBuilder3D->bake(mdi3D);
|
|
|
|
EXPECT_EQ(1u, mdi3D.size());
|
|
|
|
|
|
|
|
const DispatchInfo *di3D = mdi3D.begin();
|
|
|
|
EXPECT_EQ(pKernel, di3D->getKernel());
|
|
|
|
EXPECT_EQ(256u, di3D->getGWS().x);
|
|
|
|
EXPECT_EQ(256u, di3D->getGWS().y);
|
|
|
|
EXPECT_EQ(256u, di3D->getGWS().z);
|
|
|
|
EXPECT_EQ(16u, di3D->getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(16u, di3D->getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(16u, di3D->getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, di3D->getOffset().x);
|
|
|
|
EXPECT_EQ(0u, di3D->getOffset().y);
|
|
|
|
EXPECT_EQ(0u, di3D->getOffset().z);
|
|
|
|
EXPECT_EQ(16u, di3D->getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(16u, di3D->getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(16u, di3D->getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(16u, di3D->getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(16u, di3D->getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(16u, di3D->getTotalNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(16u, di3D->getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(16u, di3D->getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(16u, di3D->getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, di3D->getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, di3D->getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, di3D->getStartOfWorkgroups().z);
|
|
|
|
|
|
|
|
delete diBuilder3D;
|
|
|
|
delete diBuilder2D;
|
|
|
|
delete diBuilder1D;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplitWhenGettingWalkerInfoThenCorrectValuesAreReturned) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit> *diBuilder1D = new DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder1D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit> *diBuilder2D = new DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder2D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit> *diBuilder3D = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder3D); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// 1D
|
|
|
|
diBuilder1D->setKernel(pKernel);
|
|
|
|
diBuilder1D->setDispatchGeometry(Vec3<size_t>(256, 0, 0), Vec3<size_t>(15, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi1D;
|
|
|
|
diBuilder1D->bake(mdi1D);
|
|
|
|
EXPECT_EQ(2u, mdi1D.size());
|
|
|
|
|
|
|
|
auto dispatchId = 0;
|
|
|
|
for (auto &dispatchInfo : mdi1D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getTotalNumberOfWorkgroups().z);
|
|
|
|
switch (dispatchId) {
|
|
|
|
case 0:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
dispatchId++;
|
|
|
|
}
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// 2D
|
2017-12-21 07:45:38 +08:00
|
|
|
diBuilder2D->setKernel(pKernel);
|
|
|
|
diBuilder2D->setDispatchGeometry(Vec3<size_t>(256, 256, 0), Vec3<size_t>(15, 15, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi2D;
|
|
|
|
diBuilder2D->bake(mdi2D);
|
|
|
|
EXPECT_EQ(4u, mdi2D.size());
|
|
|
|
|
|
|
|
dispatchId = 0;
|
|
|
|
for (auto &dispatchInfo : mdi2D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getTotalNumberOfWorkgroups().z);
|
|
|
|
switch (dispatchId) {
|
|
|
|
case 0:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
dispatchId++;
|
|
|
|
}
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// 3D
|
2017-12-21 07:45:38 +08:00
|
|
|
diBuilder3D->setKernel(pKernel);
|
|
|
|
diBuilder3D->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(15, 15, 15), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdi3D;
|
|
|
|
diBuilder3D->bake(mdi3D);
|
|
|
|
EXPECT_EQ(8u, mdi3D.size());
|
|
|
|
|
|
|
|
dispatchId = 0;
|
|
|
|
for (auto &dispatchInfo : mdi3D) {
|
|
|
|
EXPECT_EQ(pKernel, dispatchInfo.getKernel());
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().x);
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().y);
|
|
|
|
EXPECT_EQ(256u, dispatchInfo.getGWS().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getEnqueuedWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getOffset().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getTotalNumberOfWorkgroups().z);
|
|
|
|
switch (dispatchId) {
|
|
|
|
case 0:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
EXPECT_EQ(255u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(15u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(0u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getActualWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().x);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().y);
|
|
|
|
EXPECT_EQ(1u, dispatchInfo.getLocalWorkgroupSize().z);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(18u, dispatchInfo.getNumberOfWorkgroups().z);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().x);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().y);
|
|
|
|
EXPECT_EQ(17u, dispatchInfo.getStartOfWorkgroups().z);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
dispatchId++;
|
|
|
|
}
|
|
|
|
delete diBuilder3D;
|
|
|
|
delete diBuilder2D;
|
|
|
|
delete diBuilder1D;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplit1dWhenSettingDispatchGeometryThenMdiSizeIsCorrect) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(2, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize0;
|
|
|
|
diBuilder->bake(mdiSize0);
|
|
|
|
EXPECT_EQ(0u, mdiSize0.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 0, 0), Vec3<size_t>(2, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize1;
|
|
|
|
diBuilder->bake(mdiSize1);
|
|
|
|
EXPECT_EQ(1u, mdiSize1.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 0, 0), Vec3<size_t>(2, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize2;
|
|
|
|
diBuilder->bake(mdiSize2);
|
|
|
|
EXPECT_EQ(2u, mdiSize2.size());
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplit2dWhenSettingDispatchGeometryThenMdiSizeIsCorrect) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(2, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize00;
|
|
|
|
diBuilder->bake(mdiSize00);
|
|
|
|
EXPECT_EQ(0u, mdiSize00.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 2, 0), Vec3<size_t>(2, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize11;
|
|
|
|
diBuilder->bake(mdiSize11);
|
|
|
|
EXPECT_EQ(1u, mdiSize11.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 2, 0), Vec3<size_t>(2, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize21;
|
|
|
|
diBuilder->bake(mdiSize21);
|
|
|
|
EXPECT_EQ(2u, mdiSize21.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 3, 0), Vec3<size_t>(2, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize12;
|
|
|
|
diBuilder->bake(mdiSize12);
|
|
|
|
EXPECT_EQ(2u, mdiSize12.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 3, 0), Vec3<size_t>(2, 2, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize22;
|
|
|
|
diBuilder->bake(mdiSize22);
|
|
|
|
EXPECT_EQ(4u, mdiSize22.size());
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplit3dWhenSettingDispatchGeometryThenMdiSizeIsCorrect) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::walkerSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(0, 0, 0), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize000;
|
|
|
|
diBuilder->bake(mdiSize000);
|
|
|
|
EXPECT_EQ(0u, mdiSize000.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 2, 2), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize111;
|
|
|
|
diBuilder->bake(mdiSize111);
|
|
|
|
EXPECT_EQ(1u, mdiSize111.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 2, 2), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize211;
|
|
|
|
diBuilder->bake(mdiSize211);
|
|
|
|
EXPECT_EQ(2u, mdiSize211.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 3, 2), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize121;
|
|
|
|
diBuilder->bake(mdiSize121);
|
|
|
|
EXPECT_EQ(2u, mdiSize121.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 2, 3), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize112;
|
|
|
|
diBuilder->bake(mdiSize112);
|
|
|
|
EXPECT_EQ(2u, mdiSize112.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 3, 2), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize221;
|
|
|
|
diBuilder->bake(mdiSize221);
|
|
|
|
EXPECT_EQ(4u, mdiSize221.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 2, 3), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize212;
|
|
|
|
diBuilder->bake(mdiSize212);
|
|
|
|
EXPECT_EQ(4u, mdiSize212.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(2, 3, 3), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize122;
|
|
|
|
diBuilder->bake(mdiSize122);
|
|
|
|
EXPECT_EQ(4u, mdiSize122.size());
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(3, 3, 3), Vec3<size_t>(2, 2, 2), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo mdiSize222;
|
|
|
|
diBuilder->bake(mdiSize222);
|
|
|
|
EXPECT_EQ(8u, mdiSize222.size());
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenSettingKernelArgThenAddressesAreCorrect) {
|
2022-07-02 02:03:54 +08:00
|
|
|
const ClDeviceInfo &devInfo = pClDevice->getDeviceInfo();
|
|
|
|
if (devInfo.svmCapabilities == 0) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
Buffer *buffer = new MockBuffer();
|
|
|
|
auto val = (cl_mem)buffer;
|
|
|
|
auto pVal = &val;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
|
|
|
|
diBuilder->bake(multiDispatchInfo);
|
|
|
|
clearCrossThreadData();
|
|
|
|
|
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArg(0, sizeof(cl_mem *), pVal));
|
|
|
|
char data[128];
|
|
|
|
void *svmPtr = &data;
|
2019-01-28 17:24:11 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArgSvm(1, sizeof(svmPtr), svmPtr, nullptr, 0u));
|
2018-10-30 22:24:15 +08:00
|
|
|
MockGraphicsAllocation svmAlloc(svmPtr, 128);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArgSvmAlloc(2, svmPtr, &svmAlloc));
|
|
|
|
|
|
|
|
for (auto &dispatchInfo : multiDispatchInfo) {
|
2021-04-08 17:05:45 +08:00
|
|
|
auto crossthreadOffset0 = pKernelInfo->argAsPtr(0).stateless;
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(buffer->getCpuAddress(), *reinterpret_cast<void **>((dispatchInfo.getKernel()->getCrossThreadData() + crossthreadOffset0)));
|
2021-04-08 17:05:45 +08:00
|
|
|
auto crossthreadOffset1 = pKernelInfo->argAsPtr(1).stateless;
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(svmPtr, *(reinterpret_cast<void **>(dispatchInfo.getKernel()->getCrossThreadData() + crossthreadOffset1)));
|
2021-04-08 17:05:45 +08:00
|
|
|
auto crossthreadOffset2 = pKernelInfo->argAsPtr(2).stateless;
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(svmPtr, *(reinterpret_cast<void **>(dispatchInfo.getKernel()->getCrossThreadData() + crossthreadOffset2)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
delete buffer;
|
|
|
|
delete diBuilder;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenSplitWhenSettingKernelArgThenAddressesAreCorrect) {
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d1D, SplitDispatch::SplitMode::kernelSplit> builder1D(*pClDevice);
|
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d2D, SplitDispatch::SplitMode::kernelSplit> builder2D(*pClDevice);
|
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::kernelSplit> builder3D(*pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
Buffer *buffer = new MockBuffer();
|
|
|
|
auto val = (cl_mem)buffer;
|
|
|
|
auto pVal = &val;
|
|
|
|
|
|
|
|
char data[128];
|
|
|
|
void *svmPtr = &data;
|
|
|
|
|
|
|
|
builder1D.setKernel(pKernel);
|
|
|
|
builder2D.setKernel(pKernel);
|
|
|
|
builder3D.setKernel(pKernel);
|
|
|
|
|
2022-05-12 22:04:41 +08:00
|
|
|
Vec3<size_t> gws(256, 256, 256);
|
|
|
|
Vec3<size_t> elws(16, 16, 16);
|
2017-12-21 07:45:38 +08:00
|
|
|
Vec3<size_t> offset(0, 0, 0);
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
builder1D.setDispatchGeometry(SplitDispatch::RegionCoordX::left, gws, elws, offset);
|
|
|
|
builder2D.setDispatchGeometry(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, gws, elws, offset);
|
|
|
|
builder3D.setDispatchGeometry(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, SplitDispatch::RegionCoordZ::front, gws, elws, offset);
|
2017-12-21 07:45:38 +08:00
|
|
|
MultiDispatchInfo mdi1D;
|
|
|
|
MultiDispatchInfo mdi2D;
|
|
|
|
MultiDispatchInfo mdi3D;
|
|
|
|
|
|
|
|
builder1D.bake(mdi1D);
|
|
|
|
builder1D.bake(mdi2D);
|
|
|
|
builder1D.bake(mdi3D);
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// Set arg
|
2017-12-21 07:45:38 +08:00
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder1D.setArg(SplitDispatch::RegionCoordX::left, static_cast<uint32_t>(0), sizeof(cl_mem *), pVal);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi1D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(buffer->getCpuAddress(), *reinterpret_cast<void **>((dispatchInfo.getKernel()->getCrossThreadData() + 0x10)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder2D.setArg(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, static_cast<uint32_t>(0), sizeof(cl_mem *), pVal);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi2D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(buffer->getCpuAddress(), *reinterpret_cast<void **>((dispatchInfo.getKernel()->getCrossThreadData() + 0x10)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder3D.setArg(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, SplitDispatch::RegionCoordZ::front, static_cast<uint32_t>(0), sizeof(cl_mem *), pVal);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi3D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(buffer->getCpuAddress(), *reinterpret_cast<void **>((dispatchInfo.getKernel()->getCrossThreadData() + 0x10)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2023-01-04 23:00:09 +08:00
|
|
|
// Set arg SVM
|
2017-12-21 07:45:38 +08:00
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder1D.setArgSvm(SplitDispatch::RegionCoordX::left, 1, sizeof(svmPtr), svmPtr, nullptr, 0u);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi1D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(svmPtr, *(reinterpret_cast<void **>(dispatchInfo.getKernel()->getCrossThreadData() + 0x30)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder2D.setArgSvm(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, 1, sizeof(svmPtr), svmPtr, nullptr, 0u);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi2D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(svmPtr, *(reinterpret_cast<void **>(dispatchInfo.getKernel()->getCrossThreadData() + 0x30)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
clearCrossThreadData();
|
2023-12-19 18:17:17 +08:00
|
|
|
builder3D.setArgSvm(SplitDispatch::RegionCoordX::left, SplitDispatch::RegionCoordY::top, SplitDispatch::RegionCoordZ::front, 1, sizeof(svmPtr), svmPtr, nullptr, 0u);
|
2017-12-21 07:45:38 +08:00
|
|
|
for (auto &dispatchInfo : mdi3D) {
|
2021-03-22 19:06:23 +08:00
|
|
|
EXPECT_EQ(svmPtr, *(reinterpret_cast<void **>(dispatchInfo.getKernel()->getCrossThreadData() + 0x30)));
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
delete buffer;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenInvalidInputWhenSettingKernelArgThenInvalidMemObjectErrorIsReturned) {
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
char *buffer = new char[sizeof(Buffer)];
|
|
|
|
auto val = (cl_mem)buffer;
|
|
|
|
auto pVal = &val;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setKernel(pKernel);
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
|
|
|
|
diBuilder->bake(multiDispatchInfo);
|
2020-04-02 16:34:53 +08:00
|
|
|
EXPECT_EQ(CL_INVALID_MEM_OBJECT, diBuilder->setArg(0, sizeof(cl_mem *), pVal));
|
2019-01-28 17:24:11 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArgSvm(1, sizeof(void *), nullptr, nullptr, 0u));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
delete[] buffer;
|
|
|
|
}
|
|
|
|
|
2020-04-02 16:34:53 +08:00
|
|
|
TEST_F(DispatchInfoBuilderTest, GivenNullKernelWhenSettingKernelArgThenSuccessIsReturned) {
|
2022-07-02 02:03:54 +08:00
|
|
|
const ClDeviceInfo &devInfo = pClDevice->getDeviceInfo();
|
|
|
|
if (devInfo.svmCapabilities == 0) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
Buffer *buffer = new MockBuffer();
|
|
|
|
auto val = (cl_mem)buffer;
|
|
|
|
auto pVal = &val;
|
|
|
|
char data[128];
|
|
|
|
void *svmPtr = &data;
|
2018-10-30 22:24:15 +08:00
|
|
|
MockGraphicsAllocation svmAlloc(svmPtr, 128);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit> *diBuilder = new DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>(*pClDevice);
|
2022-05-10 01:40:30 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(Vec3<size_t>(256, 256, 256), Vec3<size_t>(16, 16, 16), Vec3<size_t>(0, 0, 0));
|
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
|
|
|
|
diBuilder->bake(multiDispatchInfo);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArg(0, sizeof(cl_mem *), pVal));
|
2019-01-28 17:24:11 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArgSvm(1, sizeof(svmPtr), svmPtr, nullptr, 0u));
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, diBuilder->setArgSvmAlloc(2, svmPtr, &svmAlloc));
|
|
|
|
|
|
|
|
delete diBuilder;
|
|
|
|
delete buffer;
|
|
|
|
}
|
2021-07-20 22:21:38 +08:00
|
|
|
|
|
|
|
TEST_F(DispatchInfoBuilderTest, WhenDimensionIsNotSetThenProperDimensionIsReturned) {
|
|
|
|
MultiDispatchInfo mdi;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
auto diBuilder = std::make_unique<DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>>(*pClDevice);
|
2021-07-20 22:21:38 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder);
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(0u, Vec3<size_t>(128, 4, 1), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi);
|
|
|
|
for (auto &dispatchInfo : mdi) {
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getDim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(DispatchInfoBuilderTest, WhengDimensionIsNotMatchingGWSThenDimensionPassedAsArgumentIsReturned) {
|
|
|
|
MultiDispatchInfo mdi;
|
|
|
|
|
2023-12-19 18:17:17 +08:00
|
|
|
auto diBuilder = std::make_unique<DispatchInfoBuilder<SplitDispatch::Dim::d3D, SplitDispatch::SplitMode::noSplit>>(*pClDevice);
|
2021-07-20 22:21:38 +08:00
|
|
|
ASSERT_NE(nullptr, diBuilder);
|
|
|
|
|
|
|
|
diBuilder->setDispatchGeometry(2u, Vec3<size_t>(128, 1, 1), Vec3<size_t>(0, 0, 0), Vec3<size_t>(0, 0, 0));
|
|
|
|
diBuilder->bake(mdi);
|
|
|
|
for (auto &dispatchInfo : mdi) {
|
|
|
|
EXPECT_EQ(2u, dispatchInfo.getDim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|