2017-12-21 00:45:38 +01:00
|
|
|
/*
|
2022-01-26 10:59:30 +00:00
|
|
|
* Copyright (C) 2018-2022 Intel Corporation
|
2017-12-21 00:45:38 +01:00
|
|
|
*
|
2018-09-18 09:11:08 +02:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 00:45:38 +01:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2021-09-29 19:10:53 +00:00
|
|
|
#include "shared/source/program/kernel_info.h"
|
2021-03-11 15:53:39 +00:00
|
|
|
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
2022-06-29 19:17:47 +00:00
|
|
|
#include "shared/test/common/test_macros/hw_test.h"
|
2021-03-11 15:53:39 +00:00
|
|
|
|
2020-02-22 22:50:57 +01:00
|
|
|
#include "opencl/source/command_queue/command_queue_hw.h"
|
|
|
|
#include "opencl/source/helpers/hardware_commands_helper.h"
|
|
|
|
#include "opencl/source/kernel/kernel.h"
|
2020-05-28 14:05:12 +02:00
|
|
|
#include "opencl/test/unit_test/fixtures/cl_device_fixture.h"
|
2020-02-23 15:20:22 +01:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_program.h"
|
2020-02-22 22:50:57 +01:00
|
|
|
|
2019-03-26 11:59:46 +01:00
|
|
|
using namespace NEO;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
2020-05-28 14:05:12 +02:00
|
|
|
struct KernelSLMAndBarrierTest : public ClDeviceFixture,
|
2017-12-21 00:45:38 +01:00
|
|
|
public ::testing::TestWithParam<uint32_t> {
|
|
|
|
void SetUp() override {
|
2020-05-28 14:05:12 +02:00
|
|
|
ClDeviceFixture::SetUp();
|
2020-10-16 15:00:28 +02:00
|
|
|
program = std::make_unique<MockProgram>(toClDeviceVector(*pClDevice));
|
2017-12-21 00:45:38 +01:00
|
|
|
|
2021-04-08 11:05:45 +02:00
|
|
|
kernelInfo.setCrossThreadDataSize(sizeof(crossThreadData));
|
|
|
|
|
|
|
|
kernelInfo.setLocalIds({1, 1, 1});
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
kernelInfo.heapInfo.pKernelHeap = kernelIsa;
|
2020-05-26 09:36:04 +02:00
|
|
|
kernelInfo.heapInfo.KernelHeapSize = sizeof(kernelIsa);
|
2020-11-19 12:30:44 +01:00
|
|
|
|
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.simdSize = 32;
|
2017-12-21 00:45:38 +01:00
|
|
|
}
|
|
|
|
void TearDown() override {
|
2020-05-28 14:05:12 +02:00
|
|
|
ClDeviceFixture::TearDown();
|
2017-12-21 00:45:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t simd;
|
|
|
|
uint32_t numChannels;
|
|
|
|
|
2018-08-09 11:34:50 +02:00
|
|
|
std::unique_ptr<MockProgram> program;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
SKernelBinaryHeaderCommon kernelHeader;
|
2021-04-08 11:05:45 +02:00
|
|
|
MockKernelInfo kernelInfo;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
uint32_t kernelIsa[32];
|
|
|
|
uint32_t crossThreadData[32];
|
|
|
|
uint32_t perThreadData[8];
|
|
|
|
};
|
|
|
|
|
|
|
|
static uint32_t slmSizeInKb[] = {1, 4, 8, 16, 32, 64};
|
|
|
|
|
2020-09-09 16:44:06 +02:00
|
|
|
HWCMDTEST_P(IGFX_GEN8_CORE, KernelSLMAndBarrierTest, GivenStaticSlmSizeWhenProgrammingSlmThenProgrammingIsCorrect) {
|
2020-01-14 14:32:11 +01:00
|
|
|
ASSERT_NE(nullptr, pClDevice);
|
2020-01-21 09:35:12 +01:00
|
|
|
CommandQueueHw<FamilyType> cmdQ(nullptr, pClDevice, 0, false);
|
2017-12-21 00:45:38 +01:00
|
|
|
typedef typename FamilyType::INTERFACE_DESCRIPTOR_DATA INTERFACE_DESCRIPTOR_DATA;
|
|
|
|
|
|
|
|
// define kernel info
|
2020-11-19 12:30:44 +01:00
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.barrierCount = 1;
|
2021-03-29 12:34:25 +02:00
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize = GetParam() * KB;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
2021-03-22 15:26:03 +00:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2017-12-21 00:45:38 +01:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
|
|
|
|
|
|
|
// After creating Mock Kernel now create Indirect Heap
|
2022-01-26 10:59:30 +00:00
|
|
|
auto &indirectHeap = cmdQ.getIndirectHeap(IndirectHeap::Type::DYNAMIC_STATE, 8192);
|
2017-12-21 00:45:38 +01:00
|
|
|
|
2022-08-03 12:22:30 +00:00
|
|
|
const uint32_t threadGroupCount = 1u;
|
2017-12-21 00:45:38 +01:00
|
|
|
uint64_t interfaceDescriptorOffset = indirectHeap.getUsed();
|
|
|
|
|
2019-06-12 09:13:06 +02:00
|
|
|
size_t offsetInterfaceDescriptorData = HardwareCommandsHelper<FamilyType>::sendInterfaceDescriptorData(
|
2017-12-21 00:45:38 +01:00
|
|
|
indirectHeap,
|
|
|
|
interfaceDescriptorOffset,
|
|
|
|
0,
|
|
|
|
sizeof(crossThreadData),
|
|
|
|
sizeof(perThreadData),
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
2022-08-03 12:22:30 +00:00
|
|
|
threadGroupCount,
|
2017-12-21 00:45:38 +01:00
|
|
|
1,
|
2019-09-20 14:55:06 +02:00
|
|
|
kernel,
|
2018-08-13 15:05:59 +02:00
|
|
|
4u,
|
2018-05-11 13:33:16 +02:00
|
|
|
pDevice->getPreemptionMode(),
|
2020-11-13 11:41:45 +01:00
|
|
|
nullptr,
|
2020-12-07 14:41:52 +00:00
|
|
|
*pDevice);
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
// add the heap base + offset
|
2018-03-05 11:03:38 +01:00
|
|
|
uint32_t *pIdData = (uint32_t *)indirectHeap.getCpuBase() + offsetInterfaceDescriptorData;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
INTERFACE_DESCRIPTOR_DATA *pSrcIDData = (INTERFACE_DESCRIPTOR_DATA *)pIdData;
|
|
|
|
|
2022-05-12 14:04:41 +00:00
|
|
|
uint32_t expectedSlmSize = 0;
|
2017-12-21 00:45:38 +01:00
|
|
|
|
|
|
|
if (::renderCoreFamily == IGFX_GEN8_CORE) {
|
2021-03-29 12:34:25 +02:00
|
|
|
if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (4 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 1;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (8 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 2;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (16 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 4;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (32 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 8;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (64 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 16;
|
2017-12-21 00:45:38 +01:00
|
|
|
}
|
|
|
|
} else {
|
2021-03-29 12:34:25 +02:00
|
|
|
if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (1 * 1024)) // its a power of "2" +1 for example 1 is 2^0 ( 0+1); 2 is 2^1 is (1+1) etc.
|
2017-12-21 00:45:38 +01:00
|
|
|
{
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 1;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (2 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 2;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (4 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 3;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (8 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 4;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (16 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 5;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (32 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 6;
|
2021-03-29 12:34:25 +02:00
|
|
|
} else if (kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize <= (64 * 1024)) {
|
2022-05-12 14:04:41 +00:00
|
|
|
expectedSlmSize = 7;
|
2017-12-21 00:45:38 +01:00
|
|
|
}
|
|
|
|
}
|
2022-05-12 14:04:41 +00:00
|
|
|
ASSERT_GT(expectedSlmSize, 0u);
|
|
|
|
EXPECT_EQ(expectedSlmSize, pSrcIDData->getSharedLocalMemorySize());
|
2020-11-19 12:30:44 +01:00
|
|
|
EXPECT_EQ(kernelInfo.kernelDescriptor.kernelAttributes.usesBarriers(), pSrcIDData->getBarrierEnable());
|
2017-12-21 00:45:38 +01:00
|
|
|
EXPECT_EQ(INTERFACE_DESCRIPTOR_DATA::DENORM_MODE_SETBYKERNEL, pSrcIDData->getDenormMode());
|
2020-11-27 09:22:59 +00:00
|
|
|
|
|
|
|
if (EncodeSurfaceState<FamilyType>::doBindingTablePrefetch()) {
|
|
|
|
EXPECT_EQ(4u, pSrcIDData->getBindingTableEntryCount());
|
|
|
|
} else {
|
|
|
|
EXPECT_EQ(0u, pSrcIDData->getBindingTableEntryCount());
|
|
|
|
}
|
2017-12-21 00:45:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
SlmSizes,
|
|
|
|
KernelSLMAndBarrierTest,
|
|
|
|
testing::ValuesIn(slmSizeInKb));
|
2021-03-11 15:53:39 +00:00
|
|
|
|
|
|
|
HWTEST_F(KernelSLMAndBarrierTest, GivenInterfaceDescriptorProgrammedWhenOverrideSlmAllocationSizeIsSetThenSlmSizeIsOverwritten) {
|
|
|
|
using INTERFACE_DESCRIPTOR_DATA = typename FamilyType::INTERFACE_DESCRIPTOR_DATA;
|
|
|
|
|
|
|
|
uint32_t expectedSlmSize = 5;
|
|
|
|
DebugManagerStateRestore dbgRestore;
|
|
|
|
DebugManager.flags.OverrideSlmAllocationSize.set(expectedSlmSize);
|
|
|
|
|
2021-03-29 12:34:25 +02:00
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.slmInlineSize = 0;
|
2021-03-11 15:53:39 +00:00
|
|
|
|
2021-03-22 15:26:03 +00:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2021-03-11 15:53:39 +00:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
|
|
|
|
|
|
|
CommandQueueHw<FamilyType> cmdQ(nullptr, pClDevice, 0, false);
|
2022-01-26 10:59:30 +00:00
|
|
|
auto &indirectHeap = cmdQ.getIndirectHeap(IndirectHeap::Type::DYNAMIC_STATE, 8192);
|
2021-03-11 15:53:39 +00:00
|
|
|
|
2022-08-03 12:22:30 +00:00
|
|
|
const uint32_t threadGroupCount = 1u;
|
2021-03-11 15:53:39 +00:00
|
|
|
uint64_t interfaceDescriptorOffset = indirectHeap.getUsed();
|
|
|
|
INTERFACE_DESCRIPTOR_DATA interfaceDescriptorData;
|
|
|
|
|
|
|
|
HardwareCommandsHelper<FamilyType>::sendInterfaceDescriptorData(
|
|
|
|
indirectHeap,
|
|
|
|
interfaceDescriptorOffset,
|
|
|
|
0,
|
|
|
|
sizeof(crossThreadData),
|
|
|
|
sizeof(perThreadData),
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
2022-08-03 12:22:30 +00:00
|
|
|
threadGroupCount,
|
2021-03-11 15:53:39 +00:00
|
|
|
1,
|
|
|
|
kernel,
|
|
|
|
4u,
|
|
|
|
pDevice->getPreemptionMode(),
|
|
|
|
&interfaceDescriptorData,
|
|
|
|
*pDevice);
|
|
|
|
|
|
|
|
auto pInterfaceDescriptor = HardwareCommandsHelper<FamilyType>::getInterfaceDescriptor(indirectHeap, interfaceDescriptorOffset, &interfaceDescriptorData);
|
|
|
|
|
|
|
|
EXPECT_EQ(expectedSlmSize, pInterfaceDescriptor->getSharedLocalMemorySize());
|
|
|
|
}
|