mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-10 12:53:42 +08:00
[10/n] Internal 4GB allocator.
- Sip kernel now uses Program Change-Id: Ibba11a5686502084a8b7fa99732f8bc2ee78dcc5
This commit is contained in:

committed by
sys_ocldev

parent
354eb346fe
commit
8b726368d5
@ -138,16 +138,7 @@ const SipKernel &BuiltIns::getSipKernel(SipKernelType type, const Device &device
|
||||
retVal = program->processGenBinary();
|
||||
DEBUG_BREAK_IF(retVal != CL_SUCCESS);
|
||||
|
||||
auto kernelInfo = program->getKernelInfo(size_t{0});
|
||||
UNRECOVERABLE_IF(kernelInfo == nullptr);
|
||||
|
||||
uint32_t sipOffset = kernelInfo->systemKernelOffset;
|
||||
UNRECOVERABLE_IF(sipOffset >= kernelInfo->heapInfo.pKernelHeader->KernelHeapSize)
|
||||
sipBuiltIn.first.reset(new SipKernel(type, ptrOffset(kernelInfo->heapInfo.pKernelHeap, sipOffset),
|
||||
kernelInfo->heapInfo.pKernelHeader->KernelHeapSize - sipOffset));
|
||||
|
||||
DEBUG_BREAK_IF(retVal != CL_SUCCESS);
|
||||
program->release();
|
||||
sipBuiltIn.first.reset(new SipKernel(type, program));
|
||||
};
|
||||
std::call_once(sipBuiltIn.second, initializer);
|
||||
UNRECOVERABLE_IF(sipBuiltIn.first == nullptr);
|
||||
|
@ -72,14 +72,8 @@ const char *getSipLlSrc(const Device &device) {
|
||||
return (ptrSize == 8) ? llDummySrc64 : llDummySrc32;
|
||||
}
|
||||
|
||||
SipKernel::SipKernel(SipKernelType type, const void *binary, size_t binarySize)
|
||||
SipKernel::SipKernel(SipKernelType type, Program *sipProgram)
|
||||
: type(type) {
|
||||
|
||||
UNRECOVERABLE_IF(binary == nullptr);
|
||||
UNRECOVERABLE_IF(binarySize == 0);
|
||||
|
||||
this->binary.reset(new char[binarySize]);
|
||||
memcpy_s(this->binary.get(), binarySize, binary, binarySize);
|
||||
this->binarySize = binarySize;
|
||||
program.reset(sipProgram);
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,8 @@
|
||||
|
||||
#include <cinttypes>
|
||||
#include <memory>
|
||||
#include "runtime/helpers/ptr_math.h"
|
||||
#include "runtime/program/program.h"
|
||||
|
||||
namespace OCLRT {
|
||||
|
||||
@ -42,18 +44,20 @@ const char *getSipLlSrc(const Device &device);
|
||||
|
||||
class SipKernel {
|
||||
public:
|
||||
SipKernel(SipKernelType type, const void *binary, size_t binarySize);
|
||||
SipKernel(SipKernelType type, Program *sipProgram);
|
||||
SipKernel(const SipKernel &) = delete;
|
||||
SipKernel &operator=(const SipKernel &) = delete;
|
||||
SipKernel(SipKernel &&) = default;
|
||||
SipKernel &operator=(SipKernel &&) = default;
|
||||
|
||||
const char *getBinary() const {
|
||||
return binary.get();
|
||||
auto kernelInfo = program->getKernelInfo(size_t{0});
|
||||
return reinterpret_cast<const char *>(ptrOffset(kernelInfo->heapInfo.pKernelHeap, kernelInfo->systemKernelOffset));
|
||||
}
|
||||
|
||||
size_t getBinarySize() const {
|
||||
return binarySize;
|
||||
auto kernelInfo = program->getKernelInfo(size_t{0});
|
||||
return kernelInfo->heapInfo.pKernelHeader->KernelHeapSize - kernelInfo->systemKernelOffset;
|
||||
}
|
||||
|
||||
SipKernelType getType() const {
|
||||
@ -62,7 +66,6 @@ class SipKernel {
|
||||
|
||||
protected:
|
||||
SipKernelType type = SipKernelType::COUNT;
|
||||
std::unique_ptr<char[]> binary = nullptr;
|
||||
size_t binarySize = 0;
|
||||
std::unique_ptr<Program> program;
|
||||
};
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "runtime/built_ins/sip.h"
|
||||
#include "unit_tests/mocks/mock_device.h"
|
||||
#include "unit_tests/mocks/mock_device_factory.h"
|
||||
#include "unit_tests/mocks/mock_program.h"
|
||||
|
||||
using namespace OCLRT;
|
||||
|
||||
@ -79,18 +80,16 @@ TEST(Sip, SipLlContainsMetadataRequiredByCompiler) {
|
||||
}
|
||||
|
||||
TEST(Sip, getType) {
|
||||
uint32_t binary = 0;
|
||||
|
||||
SipKernel csr{SipKernelType::Csr, &binary, sizeof(binary)};
|
||||
SipKernel csr{SipKernelType::Csr, getSipProgramWithCustomBinary()};
|
||||
EXPECT_EQ(SipKernelType::Csr, csr.getType());
|
||||
|
||||
SipKernel dbgCsr{SipKernelType::DbgCsr, &binary, sizeof(binary)};
|
||||
SipKernel dbgCsr{SipKernelType::DbgCsr, getSipProgramWithCustomBinary()};
|
||||
EXPECT_EQ(SipKernelType::DbgCsr, dbgCsr.getType());
|
||||
|
||||
SipKernel dbgCsrLocal{SipKernelType::DbgCsrLocal, &binary, sizeof(binary)};
|
||||
SipKernel dbgCsrLocal{SipKernelType::DbgCsrLocal, getSipProgramWithCustomBinary()};
|
||||
EXPECT_EQ(SipKernelType::DbgCsrLocal, dbgCsrLocal.getType());
|
||||
|
||||
SipKernel undefined{SipKernelType::COUNT, &binary, sizeof(binary)};
|
||||
SipKernel undefined{SipKernelType::COUNT, getSipProgramWithCustomBinary()};
|
||||
EXPECT_EQ(SipKernelType::COUNT, undefined.getType());
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "unit_tests/fixtures/memory_management_fixture.h"
|
||||
#include "unit_tests/mocks/mock_builtins.h"
|
||||
#include "unit_tests/mocks/mock_csr.h"
|
||||
#include "unit_tests/mocks/mock_program.h"
|
||||
#include "test.h"
|
||||
#include "runtime/helpers/cache_policy.h"
|
||||
|
||||
@ -247,17 +248,13 @@ HWTEST_F(CommandStreamReceiverTest, givenDefaultCommandStreamReceiverThenDefault
|
||||
}
|
||||
|
||||
TEST(CommandStreamReceiver, cmdStreamReceiverReservedBlockInInstructionHeapIsBasedOnPreemptionHelper) {
|
||||
char pattern[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41};
|
||||
|
||||
auto mockDevice = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(nullptr));
|
||||
mockDevice->setPreemptionMode(PreemptionMode::MidThread);
|
||||
|
||||
{
|
||||
MockBuiltins mockBuiltins;
|
||||
mockBuiltins.overrideGlobalBuiltins();
|
||||
{
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr,
|
||||
pattern, sizeof(pattern)));
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr, getSipProgramWithCustomBinary()));
|
||||
mockBuiltins.overrideSipKernel(std::move(sipOverride));
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,9 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "runtime/helpers/hash.h"
|
||||
#include "runtime/helpers/options.h"
|
||||
#include "runtime/helpers/string.h"
|
||||
#include "runtime/program/program.h"
|
||||
|
||||
namespace OCLRT {
|
||||
@ -105,4 +108,60 @@ class MockProgram : public Program {
|
||||
|
||||
bool contextSet = false;
|
||||
};
|
||||
|
||||
inline Program *getSipProgramWithCustomBinary() {
|
||||
char binary[1024];
|
||||
char *pBinary = binary;
|
||||
auto totalSize = 0u;
|
||||
|
||||
SProgramBinaryHeader *pBHdr = (SProgramBinaryHeader *)binary;
|
||||
pBHdr->Magic = iOpenCL::MAGIC_CL;
|
||||
pBHdr->Version = iOpenCL::CURRENT_ICBE_VERSION;
|
||||
pBHdr->Device = platformDevices[0]->pPlatform->eRenderCoreFamily;
|
||||
pBHdr->GPUPointerSizeInBytes = 8;
|
||||
pBHdr->NumberOfKernels = 1;
|
||||
pBHdr->SteppingId = 0;
|
||||
pBHdr->PatchListSize = 0;
|
||||
pBinary += sizeof(SProgramBinaryHeader);
|
||||
totalSize += sizeof(SProgramBinaryHeader);
|
||||
|
||||
SKernelBinaryHeaderCommon *pKHdr = (SKernelBinaryHeaderCommon *)pBinary;
|
||||
pKHdr->CheckSum = 0;
|
||||
pKHdr->ShaderHashCode = 0;
|
||||
pKHdr->KernelNameSize = 4;
|
||||
pKHdr->PatchListSize = 0;
|
||||
pKHdr->KernelHeapSize = 16;
|
||||
pKHdr->GeneralStateHeapSize = 0;
|
||||
pKHdr->DynamicStateHeapSize = 0;
|
||||
pKHdr->SurfaceStateHeapSize = 0;
|
||||
pKHdr->KernelUnpaddedSize = 0;
|
||||
pBinary += sizeof(SKernelBinaryHeaderCommon);
|
||||
totalSize += sizeof(SKernelBinaryHeaderCommon);
|
||||
char *pKernelBin = pBinary;
|
||||
strcpy_s(pBinary, 4, "sip");
|
||||
pBinary += pKHdr->KernelNameSize;
|
||||
totalSize += pKHdr->KernelNameSize;
|
||||
|
||||
strcpy_s(pBinary, 18, "kernel morphEUs()");
|
||||
pBinary += pKHdr->KernelHeapSize;
|
||||
totalSize += pKHdr->KernelHeapSize;
|
||||
|
||||
uint32_t kernelBinSize =
|
||||
pKHdr->DynamicStateHeapSize +
|
||||
pKHdr->GeneralStateHeapSize +
|
||||
pKHdr->KernelHeapSize +
|
||||
pKHdr->KernelNameSize +
|
||||
pKHdr->PatchListSize +
|
||||
pKHdr->SurfaceStateHeapSize;
|
||||
uint64_t hashValue = Hash::hash(reinterpret_cast<const char *>(pKernelBin), kernelBinSize);
|
||||
pKHdr->CheckSum = static_cast<uint32_t>(hashValue & 0xFFFFFFFF);
|
||||
|
||||
auto errCode = CL_SUCCESS;
|
||||
auto program = Program::createFromGenBinary(nullptr, binary, totalSize, false, &errCode);
|
||||
UNRECOVERABLE_IF(errCode != CL_SUCCESS);
|
||||
errCode = program->processGenBinary();
|
||||
UNRECOVERABLE_IF(errCode != CL_SUCCESS);
|
||||
return program;
|
||||
}
|
||||
|
||||
} // namespace OCLRT
|
||||
|
@ -349,7 +349,7 @@ TEST(PreemptionTest, instructionHeapIsInvalidIfItSmallerThanSipKernel) {
|
||||
mockBuiltins.overrideGlobalBuiltins();
|
||||
{
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr,
|
||||
sipPattern, sizeof(sipPattern)));
|
||||
getSipProgramWithCustomBinary()));
|
||||
mockBuiltins.overrideSipKernel(std::move(sipOverride));
|
||||
}
|
||||
|
||||
@ -371,8 +371,7 @@ TEST(PreemptionTest, instructionHeapIsInvalidIfItDoesNotContainSipKernelAtTheBeg
|
||||
MockBuiltins mockBuiltins;
|
||||
mockBuiltins.overrideGlobalBuiltins();
|
||||
{
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr,
|
||||
sipPattern, sizeof(sipPattern)));
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr, getSipProgramWithCustomBinary()));
|
||||
mockBuiltins.overrideSipKernel(std::move(sipOverride));
|
||||
}
|
||||
|
||||
@ -386,16 +385,14 @@ TEST(PreemptionTest, instructionHeapIsValidIfItContainSipKernelAtTheBegining) {
|
||||
auto mockDevice = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(nullptr));
|
||||
mockDevice->setPreemptionMode(PreemptionMode::MidThread);
|
||||
|
||||
char sipPattern[] = {2, 3, 5, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41};
|
||||
instructionHeap.getSpace(sizeof(instructionHeapBuffer));
|
||||
memcpy_s(instructionHeapBuffer, sizeof(instructionHeapBuffer), sipPattern, sizeof(sipPattern));
|
||||
|
||||
{
|
||||
MockBuiltins mockBuiltins;
|
||||
mockBuiltins.overrideGlobalBuiltins();
|
||||
{
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr,
|
||||
sipPattern, sizeof(sipPattern)));
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr, getSipProgramWithCustomBinary()));
|
||||
memcpy_s(instructionHeapBuffer, sizeof(instructionHeapBuffer), sipOverride->getBinary(), sipOverride->getBinarySize());
|
||||
mockBuiltins.overrideSipKernel(std::move(sipOverride));
|
||||
}
|
||||
|
||||
@ -409,22 +406,20 @@ TEST(PreemptionTest, whenPreemptionModeIsMidThreadThenInstructionHeapSipKernelRe
|
||||
LinearStream instructionHeap(instructionHeapBuffer, sizeof(instructionHeapBuffer));
|
||||
auto mockDevice = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(nullptr));
|
||||
mockDevice->setPreemptionMode(PreemptionMode::MidThread);
|
||||
|
||||
char sipPattern[] = {2, 3, 5, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41};
|
||||
|
||||
{
|
||||
size_t sipSize = 0u;
|
||||
MockBuiltins mockBuiltins;
|
||||
mockBuiltins.overrideGlobalBuiltins();
|
||||
{
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr,
|
||||
sipPattern, sizeof(sipPattern)));
|
||||
auto sipOverride = std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel(OCLRT::SipKernelType::Csr, getSipProgramWithCustomBinary()));
|
||||
sipSize = sipOverride->getBinarySize();
|
||||
mockBuiltins.overrideSipKernel(std::move(sipOverride));
|
||||
}
|
||||
|
||||
EXPECT_EQ(sizeof(sipPattern), PreemptionHelper::getInstructionHeapSipKernelReservedSize(*mockDevice));
|
||||
EXPECT_EQ(sipSize, PreemptionHelper::getInstructionHeapSipKernelReservedSize(*mockDevice));
|
||||
PreemptionHelper::initializeInstructionHeapSipKernelReservedBlock(instructionHeap, *mockDevice);
|
||||
EXPECT_TRUE(PreemptionHelper::isValidInstructionHeapForMidThreadPreemption(instructionHeap, *mockDevice));
|
||||
EXPECT_EQ(7, instructionHeapBuffer[sizeof(sipPattern)]); // check for overflow
|
||||
EXPECT_EQ(7, instructionHeapBuffer[sipSize]); // check for overflow
|
||||
}
|
||||
}
|
||||
|
||||
@ -442,8 +437,7 @@ HWTEST_P(PreemptionHwTest, getRequiredCmdStreamSizeReturns0WhenPreemptionModeIsN
|
||||
auto mockDevice = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(nullptr));
|
||||
{
|
||||
MockBuiltins tmpBuiltins;
|
||||
char sipData[16] = {0};
|
||||
tmpBuiltins.overrideSipKernel(std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel{SipKernelType::Csr, sipData, sizeof(sipData)}));
|
||||
tmpBuiltins.overrideSipKernel(std::unique_ptr<OCLRT::SipKernel>(new OCLRT::SipKernel{SipKernelType::Csr, getSipProgramWithCustomBinary()}));
|
||||
tmpBuiltins.overrideGlobalBuiltins();
|
||||
PreemptionHelper::programCmdStream<FamilyType>(cmdStream, mode, mode,
|
||||
nullptr, LinearStream(nullptr, 0), *mockDevice);
|
||||
|
Reference in New Issue
Block a user