Skip to content

Commit 0666ed3

Browse files
Make unified builtin table including stateless kernels
Signed-off-by: John Falkowski <[email protected]>
1 parent 441fe1f commit 0666ed3

File tree

7 files changed

+61
-102
lines changed

7 files changed

+61
-102
lines changed

level_zero/core/source/builtin/builtin_functions_lib.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -20,14 +20,21 @@ struct Kernel;
2020

2121
enum class Builtin : uint32_t {
2222
CopyBufferBytes = 0u,
23+
CopyBufferBytesStateless,
2324
CopyBufferRectBytes2d,
2425
CopyBufferRectBytes3d,
2526
CopyBufferToBufferMiddle,
27+
CopyBufferToBufferMiddleStateless,
2628
CopyBufferToBufferSide,
29+
CopyBufferToBufferSideStateless,
2730
FillBufferImmediate,
31+
FillBufferImmediateStateless,
2832
FillBufferSSHOffset,
33+
FillBufferSSHOffsetStateless,
2934
FillBufferMiddle,
35+
FillBufferMiddleStateless,
3036
FillBufferRightLeftover,
37+
FillBufferRightLeftoverStateless,
3138
QueryKernelTimestamps,
3239
QueryKernelTimestampsWithOffsets,
3340
COUNT
@@ -55,10 +62,8 @@ struct BuiltinFunctionsLib {
5562
NEO::BuiltIns *builtins);
5663

5764
virtual Kernel *getFunction(Builtin func) = 0;
58-
virtual Kernel *getStatelessFunction(Builtin func) = 0;
5965
virtual Kernel *getImageFunction(ImageBuiltin func) = 0;
6066
virtual void initBuiltinKernel(Builtin builtId) = 0;
61-
virtual void initStatelessBuiltinKernel(Builtin builtId) = 0;
6267
virtual void initBuiltinImageKernel(ImageBuiltin func) = 0;
6368
MOCKABLE_VIRTUAL std::unique_lock<MutexType> obtainUniqueOwnership();
6469

level_zero/core/source/builtin/builtin_functions_lib_impl.cpp

Lines changed: 25 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -30,60 +30,7 @@ void BuiltinFunctionsLibImpl::initBuiltinKernel(Builtin func) {
3030
builtinName = "copyBufferToBufferBytesSingle";
3131
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
3232
break;
33-
case Builtin::CopyBufferRectBytes2d:
34-
builtinName = "CopyBufferRectBytes2d";
35-
builtin = NEO::EBuiltInOps::CopyBufferRect;
36-
break;
37-
case Builtin::CopyBufferRectBytes3d:
38-
builtinName = "CopyBufferRectBytes3d";
39-
builtin = NEO::EBuiltInOps::CopyBufferRect;
40-
break;
41-
case Builtin::CopyBufferToBufferMiddle:
42-
builtinName = "CopyBufferToBufferMiddleRegion";
43-
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
44-
break;
45-
case Builtin::CopyBufferToBufferSide:
46-
builtinName = "CopyBufferToBufferSideRegion";
47-
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
48-
break;
49-
case Builtin::FillBufferImmediate:
50-
builtinName = "FillBufferImmediate";
51-
builtin = NEO::EBuiltInOps::FillBuffer;
52-
break;
53-
case Builtin::FillBufferSSHOffset:
54-
builtinName = "FillBufferSSHOffset";
55-
builtin = NEO::EBuiltInOps::FillBuffer;
56-
break;
57-
case Builtin::FillBufferMiddle:
58-
builtinName = "FillBufferMiddle";
59-
builtin = NEO::EBuiltInOps::FillBuffer;
60-
break;
61-
case Builtin::FillBufferRightLeftover:
62-
builtinName = "FillBufferRightLeftover";
63-
builtin = NEO::EBuiltInOps::FillBuffer;
64-
break;
65-
case Builtin::QueryKernelTimestamps:
66-
builtinName = "QueryKernelTimestamps";
67-
builtin = NEO::EBuiltInOps::QueryKernelTimestamps;
68-
break;
69-
case Builtin::QueryKernelTimestampsWithOffsets:
70-
builtinName = "QueryKernelTimestampsWithOffsets";
71-
builtin = NEO::EBuiltInOps::QueryKernelTimestamps;
72-
break;
73-
default:
74-
UNRECOVERABLE_IF(true);
75-
};
76-
77-
auto builtId = static_cast<uint32_t>(func);
78-
builtins[builtId] = loadBuiltIn(builtin, builtinName);
79-
}
80-
81-
void BuiltinFunctionsLibImpl::initStatelessBuiltinKernel(Builtin func) {
82-
const char *builtinName = nullptr;
83-
NEO::EBuiltInOps::Type builtin;
84-
85-
switch (func) {
86-
case Builtin::CopyBufferBytes:
33+
case Builtin::CopyBufferBytesStateless:
8734
builtinName = "copyBufferToBufferBytesSingle";
8835
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
8936
break;
@@ -96,26 +43,50 @@ void BuiltinFunctionsLibImpl::initStatelessBuiltinKernel(Builtin func) {
9643
builtin = NEO::EBuiltInOps::CopyBufferRect;
9744
break;
9845
case Builtin::CopyBufferToBufferMiddle:
46+
builtinName = "CopyBufferToBufferMiddleRegion";
47+
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
48+
break;
49+
case Builtin::CopyBufferToBufferMiddleStateless:
9950
builtinName = "CopyBufferToBufferMiddleRegion";
10051
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
10152
break;
10253
case Builtin::CopyBufferToBufferSide:
54+
builtinName = "CopyBufferToBufferSideRegion";
55+
builtin = NEO::EBuiltInOps::CopyBufferToBuffer;
56+
break;
57+
case Builtin::CopyBufferToBufferSideStateless:
10358
builtinName = "CopyBufferToBufferSideRegion";
10459
builtin = NEO::EBuiltInOps::CopyBufferToBufferStateless;
10560
break;
10661
case Builtin::FillBufferImmediate:
62+
builtinName = "FillBufferImmediate";
63+
builtin = NEO::EBuiltInOps::FillBuffer;
64+
break;
65+
case Builtin::FillBufferImmediateStateless:
10766
builtinName = "FillBufferImmediate";
10867
builtin = NEO::EBuiltInOps::FillBufferStateless;
10968
break;
11069
case Builtin::FillBufferSSHOffset:
70+
builtinName = "FillBufferSSHOffset";
71+
builtin = NEO::EBuiltInOps::FillBuffer;
72+
break;
73+
case Builtin::FillBufferSSHOffsetStateless:
11174
builtinName = "FillBufferSSHOffset";
11275
builtin = NEO::EBuiltInOps::FillBufferStateless;
11376
break;
11477
case Builtin::FillBufferMiddle:
78+
builtinName = "FillBufferMiddle";
79+
builtin = NEO::EBuiltInOps::FillBuffer;
80+
break;
81+
case Builtin::FillBufferMiddleStateless:
11582
builtinName = "FillBufferMiddle";
11683
builtin = NEO::EBuiltInOps::FillBufferStateless;
11784
break;
11885
case Builtin::FillBufferRightLeftover:
86+
builtinName = "FillBufferRightLeftover";
87+
builtin = NEO::EBuiltInOps::FillBuffer;
88+
break;
89+
case Builtin::FillBufferRightLeftoverStateless:
11990
builtinName = "FillBufferRightLeftover";
12091
builtin = NEO::EBuiltInOps::FillBufferStateless;
12192
break;
@@ -202,15 +173,6 @@ Kernel *BuiltinFunctionsLibImpl::getFunction(Builtin func) {
202173
return builtins[builtId]->func.get();
203174
}
204175

205-
Kernel *BuiltinFunctionsLibImpl::getStatelessFunction(Builtin func) {
206-
auto builtId = static_cast<uint32_t>(func);
207-
208-
if (builtins[builtId].get() == nullptr) {
209-
initStatelessBuiltinKernel(func);
210-
}
211-
212-
return builtins[builtId]->func.get();
213-
}
214176
Kernel *BuiltinFunctionsLibImpl::getImageFunction(ImageBuiltin func) {
215177
auto builtId = static_cast<uint32_t>(func);
216178

level_zero/core/source/builtin/builtin_functions_lib_impl.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -30,10 +30,8 @@ struct BuiltinFunctionsLibImpl : BuiltinFunctionsLib {
3030
}
3131

3232
Kernel *getFunction(Builtin func) override;
33-
Kernel *getStatelessFunction(Builtin func) override;
3433
Kernel *getImageFunction(ImageBuiltin func) override;
3534
void initBuiltinKernel(Builtin builtId) override;
36-
void initStatelessBuiltinKernel(Builtin builtId) override;
3735
void initBuiltinImageKernel(ImageBuiltin func) override;
3836
MOCKABLE_VIRTUAL std::unique_ptr<BuiltinFunctionsLibImpl::BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName);
3937

level_zero/core/source/cmdlist/cmdlist_hw.inl

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -849,11 +849,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyKernelWithGA(v
849849

850850
Kernel *builtinFunction = nullptr;
851851

852-
if (isStateless) {
853-
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(builtin);
854-
} else {
855-
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
856-
}
852+
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
857853

858854
uint32_t groupSizeX = builtinFunction->getImmutableData()
859855
->getDescriptor()
@@ -1099,6 +1095,10 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
10991095
appendEventForProfilingAllWalkers(hSignalEvent, true);
11001096

11011097
if (ret == ZE_RESULT_SUCCESS && leftSize) {
1098+
Builtin func = Builtin::CopyBufferToBufferSide;
1099+
if (isStateless) {
1100+
func = Builtin::CopyBufferToBufferSideStateless;
1101+
}
11021102
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
11031103
dstAllocationStruct.alloc, dstAllocationStruct.offset,
11041104
srcAllocationStruct.alignedAllocationPtr,
@@ -1108,12 +1108,16 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
11081108
reinterpret_cast<void *>(&srcAllocationStruct.alignedAllocationPtr),
11091109
srcAllocationStruct.alloc, srcAllocationStruct.offset,
11101110
leftSize, 1UL,
1111-
Builtin::CopyBufferToBufferSide,
1111+
func,
11121112
hSignalEvent,
11131113
isStateless);
11141114
}
11151115

11161116
if (ret == ZE_RESULT_SUCCESS && middleSizeBytes) {
1117+
Builtin func = Builtin::CopyBufferToBufferMiddle;
1118+
if (isStateless) {
1119+
func = Builtin::CopyBufferToBufferMiddleStateless;
1120+
}
11171121
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
11181122
dstAllocationStruct.alloc, leftSize + dstAllocationStruct.offset,
11191123
srcAllocationStruct.alignedAllocationPtr,
@@ -1124,12 +1128,16 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
11241128
srcAllocationStruct.alloc, leftSize + srcAllocationStruct.offset,
11251129
middleSizeBytes,
11261130
middleElSize,
1127-
Builtin::CopyBufferToBufferMiddle,
1131+
func,
11281132
hSignalEvent,
11291133
isStateless);
11301134
}
11311135

11321136
if (ret == ZE_RESULT_SUCCESS && rightSize) {
1137+
Builtin func = Builtin::CopyBufferToBufferSide;
1138+
if (isStateless) {
1139+
func = Builtin::CopyBufferToBufferSideStateless;
1140+
}
11331141
ret = isCopyOnly() ? appendMemoryCopyBlit(dstAllocationStruct.alignedAllocationPtr,
11341142
dstAllocationStruct.alloc, leftSize + middleSizeBytes + dstAllocationStruct.offset,
11351143
srcAllocationStruct.alignedAllocationPtr,
@@ -1139,7 +1147,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
11391147
reinterpret_cast<void *>(&srcAllocationStruct.alignedAllocationPtr),
11401148
srcAllocationStruct.alloc, leftSize + middleSizeBytes + srcAllocationStruct.offset,
11411149
rightSize, 1UL,
1142-
Builtin::CopyBufferToBufferSide,
1150+
func,
11431151
hSignalEvent,
11441152
isStateless);
11451153
}
@@ -1450,7 +1458,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
14501458
Kernel *builtinFunction = nullptr;
14511459

14521460
if (isStateless) {
1453-
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferImmediate);
1461+
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferImmediateStateless);
14541462
} else {
14551463
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferImmediate);
14561464
}
@@ -1495,7 +1503,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
14951503

14961504
Kernel *builtinFunction = nullptr;
14971505
if (isStateless) {
1498-
builtinFunction = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferMiddle);
1506+
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferMiddleStateless);
14991507
} else {
15001508
builtinFunction = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferMiddle);
15011509
}
@@ -1555,7 +1563,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
15551563

15561564
Kernel *builtinFunctionRemainder;
15571565
if (isStateless) {
1558-
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getStatelessFunction(Builtin::FillBufferRightLeftover);
1566+
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferRightLeftoverStateless);
15591567
} else {
15601568
builtinFunctionRemainder = device->getBuiltinFunctionsLib()->getFunction(Builtin::FillBufferRightLeftover);
15611569
}

level_zero/core/test/unit_tests/mocks/mock_builtin_functions_lib_impl.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -28,12 +28,7 @@ struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
2828
builtins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBuffer, "copyBufferToBufferBytesSingle");
2929
}
3030
}
31-
void initStatelessBuiltinKernel(L0::Builtin func) override {
32-
auto builtId = static_cast<uint32_t>(func);
33-
if (builtins[builtId].get() == nullptr) {
34-
builtins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBufferStateless, "copyBufferToBufferBytesSingle");
35-
}
36-
}
31+
3732
void initBuiltinImageKernel(L0::ImageBuiltin func) override {
3833
auto builtId = static_cast<uint32_t>(func);
3934
if (imageBuiltins[builtId].get() == nullptr) {
@@ -47,9 +42,7 @@ struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
4742
Kernel *getFunction(Builtin func) override {
4843
return dummyKernel.get();
4944
}
50-
Kernel *getStatelessFunction(Builtin func) override {
51-
return dummyKernel.get();
52-
}
45+
5346
Kernel *getImageFunction(ImageBuiltin func) override {
5447
return dummyKernel.get();
5548
}

level_zero/core/test/unit_tests/mocks/mock_builtin_functions_lib_impl_timestamps.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -40,19 +40,13 @@ struct MockBuiltinFunctionsLibImplTimestamps : BuiltinFunctionsLibImpl {
4040
};
4141
}
4242

43-
void initStatelessBuiltinKernel(Builtin func) override {
44-
}
4543
void initBuiltinImageKernel(ImageBuiltin func) override {
4644
}
4745

4846
Kernel *getFunction(Builtin func) override {
4947
return func == Builtin::QueryKernelTimestampsWithOffsets ? builtins[1]->func.get() : builtins[0]->func.get();
5048
}
5149

52-
Kernel *getStatelessFunction(Builtin func) override {
53-
return nullptr;
54-
}
55-
5650
std::unique_ptr<BuiltinFunctionsLibImpl::BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) override {
5751
using BuiltInCodeType = NEO::BuiltinCode::ECodeType;
5852

level_zero/core/test/unit_tests/sources/builtin/builtin_functions_tests.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -28,7 +28,6 @@ class BuiltinFunctionsLibFixture : public DeviceFixture {
2828
struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
2929
using BuiltinFunctionsLibImpl::builtins;
3030
using BuiltinFunctionsLibImpl::getFunction;
31-
using BuiltinFunctionsLibImpl::getStatelessFunction;
3231
using BuiltinFunctionsLibImpl::imageBuiltins;
3332
MockBuiltinFunctionsLibImpl(L0::Device *device, NEO::BuiltIns *builtInsLib) : BuiltinFunctionsLibImpl(device, builtInsLib) {}
3433
std::unique_ptr<BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) override {
@@ -145,14 +144,14 @@ HWTEST_F(TestBuiltinFunctionsLibImplStateless, givenCallsToGetFunctionThenEachBu
145144
}
146145

147146
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
148-
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getStatelessFunction(static_cast<L0::Builtin>(builtId)));
147+
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
149148
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
150149
initializedBuiltins[builtId] = mockBuiltinFunctionsLibImpl->builtins[builtId]->func.get();
151150
}
152151

153152
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
154153
EXPECT_EQ(initializedBuiltins[builtId],
155-
mockBuiltinFunctionsLibImpl->getStatelessFunction(static_cast<L0::Builtin>(builtId)));
154+
mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
156155
}
157156
}
158157

@@ -169,7 +168,7 @@ HWTEST_F(TestBuiltinFunctionsLibImplStateless, givenCallToStatelessBuiltinFuncti
169168
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
170169
}
171170
uint32_t builtId = static_cast<uint32_t>(Builtin::COUNT) + 1;
172-
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initStatelessBuiltinKernel(static_cast<L0::Builtin>(builtId)), std::exception);
171+
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initBuiltinKernel(static_cast<L0::Builtin>(builtId)), std::exception);
173172
}
174173

175174
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCompilerInterfaceWhenCreateDeviceAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {

0 commit comments

Comments
 (0)