Make unified builtin table including stateless kernels

Signed-off-by: John Falkowski <john.falkowski@intel.com>
This commit is contained in:
John Falkowski
2022-02-22 00:17:53 +00:00
committed by Compute-Runtime-Automation
parent 441fe1f589
commit 0666ed35ba
7 changed files with 61 additions and 102 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2021 Intel Corporation
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -20,14 +20,21 @@ struct Kernel;
enum class Builtin : uint32_t {
CopyBufferBytes = 0u,
CopyBufferBytesStateless,
CopyBufferRectBytes2d,
CopyBufferRectBytes3d,
CopyBufferToBufferMiddle,
CopyBufferToBufferMiddleStateless,
CopyBufferToBufferSide,
CopyBufferToBufferSideStateless,
FillBufferImmediate,
FillBufferImmediateStateless,
FillBufferSSHOffset,
FillBufferSSHOffsetStateless,
FillBufferMiddle,
FillBufferMiddleStateless,
FillBufferRightLeftover,
FillBufferRightLeftoverStateless,
QueryKernelTimestamps,
QueryKernelTimestampsWithOffsets,
COUNT
@@ -55,10 +62,8 @@ struct BuiltinFunctionsLib {
NEO::BuiltIns *builtins);
virtual Kernel *getFunction(Builtin func) = 0;
virtual Kernel *getStatelessFunction(Builtin func) = 0;
virtual Kernel *getImageFunction(ImageBuiltin func) = 0;
virtual void initBuiltinKernel(Builtin builtId) = 0;
virtual void initStatelessBuiltinKernel(Builtin builtId) = 0;
virtual void initBuiltinImageKernel(ImageBuiltin func) = 0;
MOCKABLE_VIRTUAL std::unique_lock<MutexType> obtainUniqueOwnership();

View File

@@ -30,60 +30,7 @@ void BuiltinFunctionsLibImpl::initBuiltinKernel(Builtin func) {
builtinName = "copyBufferToBufferBytesSingle";
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
break;
case Builtin::CopyBufferRectBytes2d:
builtinName = "CopyBufferRectBytes2d";
builtin = NEO::EBuiltInOps::CopyBufferRect;
break;
case Builtin::CopyBufferRectBytes3d:
builtinName = "CopyBufferRectBytes3d";
builtin = NEO::EBuiltInOps::CopyBufferRect;
break;
case Builtin::CopyBufferToBufferMiddle:
builtinName = "CopyBufferToBufferMiddleRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
break;
case Builtin::CopyBufferToBufferSide:
builtinName = "CopyBufferToBufferSideRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
break;
case Builtin::FillBufferImmediate:
builtinName = "FillBufferImmediate";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferSSHOffset:
builtinName = "FillBufferSSHOffset";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferMiddle:
builtinName = "FillBufferMiddle";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferRightLeftover:
builtinName = "FillBufferRightLeftover";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::QueryKernelTimestamps:
builtinName = "QueryKernelTimestamps";
builtin = NEO::EBuiltInOps::QueryKernelTimestamps;
break;
case Builtin::QueryKernelTimestampsWithOffsets:
builtinName = "QueryKernelTimestampsWithOffsets";
builtin = NEO::EBuiltInOps::QueryKernelTimestamps;
break;
default:
UNRECOVERABLE_IF(true);
};
auto builtId = static_cast<uint32_t>(func);
builtins[builtId] = loadBuiltIn(builtin, builtinName);
}
void BuiltinFunctionsLibImpl::initStatelessBuiltinKernel(Builtin func) {
const char *builtinName = nullptr;
NEO::EBuiltInOps::Type builtin;
switch (func) {
case Builtin::CopyBufferBytes:
case Builtin::CopyBufferBytesStateless:
builtinName = "copyBufferToBufferBytesSingle";
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
break;
@@ -96,26 +43,50 @@ void BuiltinFunctionsLibImpl::initStatelessBuiltinKernel(Builtin func) {
builtin = NEO::EBuiltInOps::CopyBufferRect;
break;
case Builtin::CopyBufferToBufferMiddle:
builtinName = "CopyBufferToBufferMiddleRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
break;
case Builtin::CopyBufferToBufferMiddleStateless:
builtinName = "CopyBufferToBufferMiddleRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
break;
case Builtin::CopyBufferToBufferSide:
builtinName = "CopyBufferToBufferSideRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
break;
case Builtin::CopyBufferToBufferSideStateless:
builtinName = "CopyBufferToBufferSideRegion";
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
break;
case Builtin::FillBufferImmediate:
builtinName = "FillBufferImmediate";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferImmediateStateless:
builtinName = "FillBufferImmediate";
builtin = NEO::EBuiltInOps::FillBufferStateless;
break;
case Builtin::FillBufferSSHOffset:
builtinName = "FillBufferSSHOffset";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferSSHOffsetStateless:
builtinName = "FillBufferSSHOffset";
builtin = NEO::EBuiltInOps::FillBufferStateless;
break;
case Builtin::FillBufferMiddle:
builtinName = "FillBufferMiddle";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferMiddleStateless:
builtinName = "FillBufferMiddle";
builtin = NEO::EBuiltInOps::FillBufferStateless;
break;
case Builtin::FillBufferRightLeftover:
builtinName = "FillBufferRightLeftover";
builtin = NEO::EBuiltInOps::FillBuffer;
break;
case Builtin::FillBufferRightLeftoverStateless:
builtinName = "FillBufferRightLeftover";
builtin = NEO::EBuiltInOps::FillBufferStateless;
break;
@@ -202,15 +173,6 @@ Kernel *BuiltinFunctionsLibImpl::getFunction(Builtin func) {
return builtins[builtId]->func.get();
}
Kernel *BuiltinFunctionsLibImpl::getStatelessFunction(Builtin func) {
auto builtId = static_cast<uint32_t>(func);
if (builtins[builtId].get() == nullptr) {
initStatelessBuiltinKernel(func);
}
return builtins[builtId]->func.get();
}
Kernel *BuiltinFunctionsLibImpl::getImageFunction(ImageBuiltin func) {
auto builtId = static_cast<uint32_t>(func);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2021 Intel Corporation
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -30,10 +30,8 @@ struct BuiltinFunctionsLibImpl : BuiltinFunctionsLib {
}
Kernel *getFunction(Builtin func) override;
Kernel *getStatelessFunction(Builtin func) override;
Kernel *getImageFunction(ImageBuiltin func) override;
void initBuiltinKernel(Builtin builtId) override;
void initStatelessBuiltinKernel(Builtin builtId) override;
void initBuiltinImageKernel(ImageBuiltin func) override;
MOCKABLE_VIRTUAL std::unique_ptr<BuiltinFunctionsLibImpl::BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName);

View File

@@ -849,11 +849,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyKernelWithGA(v
Kernel *builtinFunction = nullptr;
if (isStateless) {
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(builtin);
} else {
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
}
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
uint32_t groupSizeX = builtinFunction->getImmutableData()
->getDescriptor()
@@ -1099,6 +1095,10 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
appendEventForProfilingAllWalkers(hSignalEvent, true);
if (ret == ZE_RESULT_SUCCESS && leftSize) {
Builtin func = Builtin::CopyBufferToBufferSide;
if (isStateless) {
func = Builtin::CopyBufferToBufferSideStateless;
}
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
dstAllocationStruct.alloc, dstAllocationStruct.offset,
srcAllocationStruct.alignedAllocationPtr,
@@ -1108,12 +1108,16 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
reinterpret_cast<void *>(&srcAllocationStruct.alignedAllocationPtr),
srcAllocationStruct.alloc, srcAllocationStruct.offset,
leftSize, 1UL,
Builtin::CopyBufferToBufferSide,
func,
hSignalEvent,
isStateless);
}
if (ret == ZE_RESULT_SUCCESS && middleSizeBytes) {
Builtin func = Builtin::CopyBufferToBufferMiddle;
if (isStateless) {
func = Builtin::CopyBufferToBufferMiddleStateless;
}
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
dstAllocationStruct.alloc, leftSize + dstAllocationStruct.offset,
srcAllocationStruct.alignedAllocationPtr,
@@ -1124,12 +1128,16 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
srcAllocationStruct.alloc, leftSize + srcAllocationStruct.offset,
middleSizeBytes,
middleElSize,
Builtin::CopyBufferToBufferMiddle,
func,
hSignalEvent,
isStateless);
}
if (ret == ZE_RESULT_SUCCESS && rightSize) {
Builtin func = Builtin::CopyBufferToBufferSide;
if (isStateless) {
func = Builtin::CopyBufferToBufferSideStateless;
}
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
dstAllocationStruct.alloc, leftSize + middleSizeBytes + dstAllocationStruct.offset,
srcAllocationStruct.alignedAllocationPtr,
@@ -1139,7 +1147,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
reinterpret_cast<void *>(&srcAllocationStruct.alignedAllocationPtr),
srcAllocationStruct.alloc, leftSize + middleSizeBytes + srcAllocationStruct.offset,
rightSize, 1UL,
Builtin::CopyBufferToBufferSide,
func,
hSignalEvent,
isStateless);
}
@@ -1450,7 +1458,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
Kernel *builtinFunction = nullptr;
if (isStateless) {
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferImmediate);
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferImmediateStateless);
} else {
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferImmediate);
}
@@ -1495,7 +1503,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
Kernel *builtinFunction = nullptr;
if (isStateless) {
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferMiddle);
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferMiddleStateless);
} else {
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferMiddle);
}
@@ -1555,7 +1563,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
Kernel *builtinFunctionRemainder;
if (isStateless) {
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferRightLeftover);
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferRightLeftoverStateless);
} else {
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferRightLeftover);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2021 Intel Corporation
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -28,12 +28,7 @@ struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
builtins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBuffer, "copyBufferToBufferBytesSingle");
}
}
void initStatelessBuiltinKernel(L0::Builtin func) override {
auto builtId = static_cast<uint32_t>(func);
if (builtins[builtId].get() == nullptr) {
builtins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBufferStateless, "copyBufferToBufferBytesSingle");
}
}
void initBuiltinImageKernel(L0::ImageBuiltin func) override {
auto builtId = static_cast<uint32_t>(func);
if (imageBuiltins[builtId].get() == nullptr) {
@@ -47,9 +42,7 @@ struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
Kernel *getFunction(Builtin func) override {
return dummyKernel.get();
}
Kernel *getStatelessFunction(Builtin func) override {
return dummyKernel.get();
}
Kernel *getImageFunction(ImageBuiltin func) override {
return dummyKernel.get();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2021 Intel Corporation
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -40,8 +40,6 @@ struct MockBuiltinFunctionsLibImplTimestamps : BuiltinFunctionsLibImpl {
};
}
void initStatelessBuiltinKernel(Builtin func) override {
}
void initBuiltinImageKernel(ImageBuiltin func) override {
}
@@ -49,10 +47,6 @@ struct MockBuiltinFunctionsLibImplTimestamps : BuiltinFunctionsLibImpl {
return func == Builtin::QueryKernelTimestampsWithOffsets ? builtins[1]->func.get() : builtins[0]->func.get();
}
Kernel *getStatelessFunction(Builtin func) override {
return nullptr;
}
std::unique_ptr<BuiltinFunctionsLibImpl::BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) override {
using BuiltInCodeType = NEO::BuiltinCode::ECodeType;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2021 Intel Corporation
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -28,7 +28,6 @@ class BuiltinFunctionsLibFixture : public DeviceFixture {
struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
using BuiltinFunctionsLibImpl::builtins;
using BuiltinFunctionsLibImpl::getFunction;
using BuiltinFunctionsLibImpl::getStatelessFunction;
using BuiltinFunctionsLibImpl::imageBuiltins;
MockBuiltinFunctionsLibImpl(L0::Device *device, NEO::BuiltIns *builtInsLib) : BuiltinFunctionsLibImpl(device, builtInsLib) {}
std::unique_ptr<BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) override {
@@ -145,14 +144,14 @@ HWTEST_F(TestBuiltinFunctionsLibImplStateless, givenCallsToGetFunctionThenEachBu
}
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getStatelessFunction(static_cast<L0::Builtin>(builtId)));
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
initializedBuiltins[builtId] = mockBuiltinFunctionsLibImpl->builtins[builtId]->func.get();
}
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_EQ(initializedBuiltins[builtId],
mockBuiltinFunctionsLibImpl->getStatelessFunction(static_cast<L0::Builtin>(builtId)));
mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
}
}
@@ -169,7 +168,7 @@ HWTEST_F(TestBuiltinFunctionsLibImplStateless, givenCallToStatelessBuiltinFuncti
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
}
uint32_t builtId = static_cast<uint32_t>(Builtin::COUNT) + 1;
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initStatelessBuiltinKernel(static_cast<L0::Builtin>(builtId)), std::exception);
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initBuiltinKernel(static_cast<L0::Builtin>(builtId)), std::exception);
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCompilerInterfaceWhenCreateDeviceAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {