mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
Make unified builtin table including stateless kernels
Signed-off-by: John Falkowski <john.falkowski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
441fe1f589
commit
0666ed35ba
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user