[10/n] Internal 4GB allocator.

- Sip kernel now uses Program

Change-Id: Ibba11a5686502084a8b7fa99732f8bc2ee78dcc5
This commit is contained in:
Mrozek, Michal
2018-03-06 15:29:06 +01:00
committed by sys_ocldev
parent 354eb346fe
commit 8b726368d5
7 changed files with 87 additions and 50 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;
};
}

View File

@ -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());
}

View File

@ -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));
}

View File

@ -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

View File

@ -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);