Built-in kernels refactor

Related-To: NEO-3220

Change-Id: I4a44a71fe30abd38409de7e9741a3b389b967612
Signed-off-by: Pawel Wilma <pawel.wilma@intel.com>
This commit is contained in:
Pawel Wilma
2019-07-01 16:06:35 +02:00
committed by sys_ocldev
parent 2640e5f17d
commit 40b00c7e8a
16 changed files with 109 additions and 50 deletions

View File

@@ -728,6 +728,7 @@ include_directories(${IGDRCL_SOURCE_DIR}/runtime/gmm_helper/client_context${BRAN
include_directories(${IGDRCL_SOURCE_DIR}/runtime/gmm_helper/gmm_memory${BRANCH_DIR_SUFFIX})
include_directories(${IGDRCL_SOURCE_DIR}/runtime/mem_obj/definitions${BRANCH_DIR_SUFFIX})
include_directories(${IGDRCL_SOURCE_DIR}/runtime/memory_manager/definitions${BRANCH_DIR_SUFFIX})
include_directories(${IGDRCL_SOURCE_DIR}/runtime/built_ins/builtinops${BRANCH_DIR_SUFFIX})
set(HW_SRC_INCLUDE_PATH ${IGDRCL_SOURCE_DIR}/runtime/gen_common)

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2017-2018 Intel Corporation
# Copyright (C) 2017-2019 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -11,9 +11,12 @@ set(RUNTIME_SRCS_BUILT_INS
${CMAKE_CURRENT_SOURCE_DIR}/built_ins_storage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/built_ins.cpp
${CMAKE_CURRENT_SOURCE_DIR}/built_ins.h
${CMAKE_CURRENT_SOURCE_DIR}/built_in_ops_base.h
${CMAKE_CURRENT_SOURCE_DIR}/builtinops${BRANCH_DIR_SUFFIX}/built_in_ops.h
${CMAKE_CURRENT_SOURCE_DIR}/built_ins.inl
${CMAKE_CURRENT_SOURCE_DIR}/sip.cpp
${CMAKE_CURRENT_SOURCE_DIR}/sip.h
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/unknown_built_in_name.cpp
${CMAKE_CURRENT_SOURCE_DIR}/vme_dispatch_builder.h
)
target_sources(${NEO_STATIC_LIB_NAME} PRIVATE ${RUNTIME_SRCS_BUILT_INS})

View File

@@ -0,0 +1,36 @@
/*
* Copyright (C) 2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/helpers/extendable_enum.h"
namespace NEO {
namespace EBuiltInOps {
struct Type : ExtendableEnum {
public:
constexpr Type(uint32_t val) : ExtendableEnum(val) {}
};
constexpr Type AuxTranslation{0};
constexpr Type CopyBufferToBuffer{1};
constexpr Type CopyBufferRect{2};
constexpr Type FillBuffer{3};
constexpr Type CopyBufferToImage3d{4};
constexpr Type CopyImage3dToBuffer{5};
constexpr Type CopyImageToImage1d{6};
constexpr Type CopyImageToImage2d{7};
constexpr Type CopyImageToImage3d{8};
constexpr Type FillImage1d{9};
constexpr Type FillImage2d{10};
constexpr Type FillImage3d{11};
constexpr Type VmeBlockMotionEstimateIntel{12};
constexpr Type VmeBlockAdvancedMotionEstimateCheckIntel{13};
constexpr Type VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel{14};
constexpr Type Scheduler{15};
constexpr uint32_t MaxBaseValue{15};
} // namespace EBuiltInOps
} // namespace NEO

View File

@@ -752,7 +752,7 @@ class BuiltInOp<HWFamily, EBuiltInOps::FillImage3d> : public BuiltinDispatchInfo
Kernel *kernel;
};
BuiltinDispatchInfoBuilder &BuiltIns::getBuiltinDispatchInfoBuilder(EBuiltInOps operation, Context &context, Device &device) {
BuiltinDispatchInfoBuilder &BuiltIns::getBuiltinDispatchInfoBuilder(EBuiltInOps::Type operation, Context &context, Device &device) {
uint32_t operationId = static_cast<uint32_t>(operation);
auto &operationBuilder = BuiltinOpsBuilders[operationId];
switch (operation) {
@@ -795,7 +795,7 @@ BuiltinDispatchInfoBuilder &BuiltIns::getBuiltinDispatchInfoBuilder(EBuiltInOps
return *operationBuilder.first;
}
std::unique_ptr<BuiltinDispatchInfoBuilder> BuiltIns::setBuiltinDispatchInfoBuilder(EBuiltInOps operation, Context &context, Device &device, std::unique_ptr<BuiltinDispatchInfoBuilder> builder) {
std::unique_ptr<BuiltinDispatchInfoBuilder> BuiltIns::setBuiltinDispatchInfoBuilder(EBuiltInOps::Type operation, Context &context, Device &device, std::unique_ptr<BuiltinDispatchInfoBuilder> builder) {
uint32_t operationId = static_cast<uint32_t>(operation);
auto &operationBuilder = BuiltinOpsBuilders[operationId];
operationBuilder.first.swap(builder);

View File

@@ -12,6 +12,7 @@
#include "runtime/helpers/properties_helper.h"
#include "CL/cl.h"
#include "built_in_ops.h"
#include <array>
#include <cstdint>
@@ -36,32 +37,13 @@ class SchedulerKernel;
extern const char *mediaKernelsBuildOptions;
enum class EBuiltInOps : uint32_t {
AuxTranslation = 0,
CopyBufferToBuffer,
CopyBufferRect,
FillBuffer,
CopyBufferToImage3d,
CopyImage3dToBuffer,
CopyImageToImage1d,
CopyImageToImage2d,
CopyImageToImage3d,
FillImage1d,
FillImage2d,
FillImage3d,
VmeBlockMotionEstimateIntel,
VmeBlockAdvancedMotionEstimateCheckIntel,
VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel,
Scheduler,
COUNT
};
BuiltinResourceT createBuiltinResource(const char *ptr, size_t size);
BuiltinResourceT createBuiltinResource(const BuiltinResourceT &r);
std::string createBuiltinResourceName(EBuiltInOps builtin, const std::string &extension,
std::string createBuiltinResourceName(EBuiltInOps::Type builtin, const std::string &extension,
const std::string &platformName = "", uint32_t deviceRevId = 0);
std::string joinPath(const std::string &lhs, const std::string &rhs);
const char *getBuiltinAsString(EBuiltInOps builtin);
const char *getBuiltinAsString(EBuiltInOps::Type builtin);
const char *getUnknownBuiltinAsString(EBuiltInOps::Type builtin);
class Storage {
public:
@@ -147,12 +129,12 @@ struct BuiltinCode {
class BuiltinsLib {
public:
BuiltinsLib();
BuiltinCode getBuiltinCode(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device);
BuiltinCode getBuiltinCode(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device);
static std::unique_ptr<Program> createProgramFromCode(const BuiltinCode &bc, Context &context, Device &device);
protected:
BuiltinResourceT getBuiltinResource(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device);
BuiltinResourceT getBuiltinResource(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device);
using StoragesContainerT = std::vector<std::unique_ptr<Storage>>;
StoragesContainerT allStorages; // sorted by priority allStorages[0] will be checked before allStorages[1], etc.
@@ -177,8 +159,8 @@ class BuiltIns {
using HWFamily = int;
std::pair<std::unique_ptr<BuiltinDispatchInfoBuilder>, std::once_flag> BuiltinOpsBuilders[static_cast<uint32_t>(EBuiltInOps::COUNT)];
BuiltinDispatchInfoBuilder &getBuiltinDispatchInfoBuilder(EBuiltInOps op, Context &context, Device &device);
std::unique_ptr<BuiltinDispatchInfoBuilder> setBuiltinDispatchInfoBuilder(EBuiltInOps op, Context &context, Device &device,
BuiltinDispatchInfoBuilder &getBuiltinDispatchInfoBuilder(EBuiltInOps::Type op, Context &context, Device &device);
std::unique_ptr<BuiltinDispatchInfoBuilder> setBuiltinDispatchInfoBuilder(EBuiltInOps::Type op, Context &context, Device &device,
std::unique_ptr<BuiltinDispatchInfoBuilder> newBuilder);
BuiltIns();
virtual ~BuiltIns();
@@ -232,7 +214,7 @@ class BuiltInOwnershipWrapper : public NonCopyableOrMovableClass {
BuiltinDispatchInfoBuilder *builder = nullptr;
};
template <typename HWFamily, EBuiltInOps OpCode>
template <typename HWFamily, uint32_t OpCode>
class BuiltInOp;
} // namespace NEO

View File

@@ -11,7 +11,7 @@
namespace NEO {
template <typename... KernelsDescArgsT>
void BuiltinDispatchInfoBuilder::populate(Context &context, Device &device, EBuiltInOps op, const char *options, KernelsDescArgsT &&... desc) {
void BuiltinDispatchInfoBuilder::populate(Context &context, Device &device, EBuiltInOps::Type op, const char *options, KernelsDescArgsT &&... desc) {
auto src = kernelsLib.getBuiltinsLib().getBuiltinCode(op, BuiltinCode::ECodeType::Any, device);
prog.reset(BuiltinsLib::createProgramFromCode(src, context, device).release());
prog->build(0, nullptr, options, nullptr, nullptr, kernelsLib.isCacheingEnabled());

View File

@@ -15,10 +15,10 @@
namespace NEO {
const char *getBuiltinAsString(EBuiltInOps builtin) {
const char *getBuiltinAsString(EBuiltInOps::Type builtin) {
switch (builtin) {
default:
return "unknown";
return getUnknownBuiltinAsString(builtin);
case EBuiltInOps::AuxTranslation:
return "aux_translation.igdrcl_built_in";
case EBuiltInOps::CopyBufferToBuffer:
@@ -62,7 +62,7 @@ BuiltinResourceT createBuiltinResource(const BuiltinResourceT &r) {
return BuiltinResourceT(r);
}
std::string createBuiltinResourceName(EBuiltInOps builtin, const std::string &extension,
std::string createBuiltinResourceName(EBuiltInOps::Type builtin, const std::string &extension,
const std::string &platformName, uint32_t deviceRevId) {
std::string ret;
if (platformName.size() > 0) {
@@ -141,7 +141,7 @@ BuiltinsLib::BuiltinsLib() {
allStorages.push_back(std::unique_ptr<Storage>(new FileStorage(getDriverInstallationPath())));
}
BuiltinCode BuiltinsLib::getBuiltinCode(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
BuiltinCode BuiltinsLib::getBuiltinCode(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
std::lock_guard<std::mutex> lockRaii{mutex};
BuiltinResourceT bc;
@@ -192,7 +192,7 @@ std::unique_ptr<Program> BuiltinsLib::createProgramFromCode(const BuiltinCode &b
return ret;
}
BuiltinResourceT BuiltinsLib::getBuiltinResource(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
BuiltinResourceT BuiltinsLib::getBuiltinResource(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
BuiltinResourceT bc;
std::string resourceNameGeneric = createBuiltinResourceName(builtin, BuiltinCode::getExtension(requestedCodeType));
std::string resourceNameForPlatformType = createBuiltinResourceName(builtin, BuiltinCode::getExtension(requestedCodeType), device.getFamilyNameWithType());

View File

@@ -0,0 +1,14 @@
/*
* Copyright (C) 2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/built_ins/built_in_ops_base.h"
namespace NEO {
namespace EBuiltInOps {
constexpr Type COUNT{MaxBaseValue + 1};
}
} // namespace NEO

View File

@@ -56,7 +56,7 @@ class BuiltinDispatchInfoBuilder {
virtual ~BuiltinDispatchInfoBuilder() = default;
template <typename... KernelsDescArgsT>
void populate(Context &context, Device &device, EBuiltInOps operation, const char *options, KernelsDescArgsT &&... desc);
void populate(Context &context, Device &device, EBuiltInOps::Type operation, const char *options, KernelsDescArgsT &&... desc);
virtual bool buildDispatchInfos(MultiDispatchInfo &multiDispatchInfo, const BuiltinOpParams &operationParams) const {
return false;

View File

@@ -8,6 +8,8 @@ add_custom_target(builtins)
set_target_properties(builtins PROPERTIES FOLDER "built_ins")
set(BUILTINS_OUTDIR_WITH_ARCH "${TargetDir}/built_ins/${NEO_ARCH}")
add_dependencies(${BUILTINS_BINARIES_LIB_NAME} builtins)
add_subdirectories()
set(GENERATED_BUILTINS ${GENERATED_BUILTINS} PARENT_SCOPE)
if("${NEO_ARCH}" STREQUAL "x32")
set(BUILTIN_OPTIONS "-cl-intel-greater-than-4GB-buffer-required")
@@ -28,8 +30,7 @@ function(compile_builtin gen_type platform_type builtin)
get_family_name_with_type(${gen_type} ${platform_type})
set(OUTPUTDIR "${BUILTINS_OUTDIR_WITH_ARCH}/${gen_type_lower}")
# get filename
get_filename_component(FILENAME ${builtin} NAME)
set(FILENAME ${builtin})
# get name of the file w/o extension
get_filename_component(BASENAME ${builtin} NAME_WE)

View File

@@ -0,0 +1,15 @@
/*
* Copyright (C) 2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/built_ins/built_ins.h"
namespace NEO {
const char *getUnknownBuiltinAsString(EBuiltInOps::Type builtin) {
return "unknown";
}
} // namespace NEO

View File

@@ -19,7 +19,7 @@ namespace NEO {
template <typename HWFamily>
class VmeBuiltinDispatchInfoBuilder : public BuiltinDispatchInfoBuilder {
public:
VmeBuiltinDispatchInfoBuilder(BuiltIns &kernelsLib, Context &context, Device &device, EBuiltInOps builtinOp,
VmeBuiltinDispatchInfoBuilder(BuiltIns &kernelsLib, Context &context, Device &device, EBuiltInOps::Type builtinOp,
const char *kernelName)
: BuiltinDispatchInfoBuilder(kernelsLib) {
populate(context, device, builtinOp,
@@ -250,7 +250,7 @@ class BuiltInOp<HWFamily, EBuiltInOps::VmeBlockMotionEstimateIntel> : public Vme
template <typename HWFamily>
class AdvancedVmeBuiltinDispatchInfoBuilder : public VmeBuiltinDispatchInfoBuilder<HWFamily> {
public:
AdvancedVmeBuiltinDispatchInfoBuilder(BuiltIns &kernelsLib, Context &context, Device &device, EBuiltInOps builtinOp,
AdvancedVmeBuiltinDispatchInfoBuilder(BuiltIns &kernelsLib, Context &context, Device &device, EBuiltInOps::Type builtinOp,
const char *kernelName)
: VmeBuiltinDispatchInfoBuilder<HWFamily>(kernelsLib, context, device, builtinOp,
kernelName) {

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2017-2018 Intel Corporation
# Copyright (C) 2017-2019 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -11,3 +11,5 @@ set(IGDRCL_SRCS_tests_built_in
${CMAKE_CURRENT_SOURCE_DIR}/sip_tests.cpp
)
target_sources(igdrcl_tests PRIVATE ${IGDRCL_SRCS_tests_built_in})
add_subdirectories()

View File

@@ -691,7 +691,7 @@ TEST_F(BuiltInTests, BuiltinDispatchInfoBuilderReturnTrueIfExplicitKernelArgNotT
TEST_F(BuiltInTests, BuiltinDispatchInfoBuilderGetVMEBuilderReturnNonNull) {
overwriteBuiltInBinaryName(pDevice, "media_kernels_backend");
EBuiltInOps vmeOps[] = {EBuiltInOps::VmeBlockMotionEstimateIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
EBuiltInOps::Type vmeOps[] = {EBuiltInOps::VmeBlockMotionEstimateIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
for (auto op : vmeOps) {
BuiltinDispatchInfoBuilder &builder = pBuiltIns->getBuiltinDispatchInfoBuilder(op, *pContext, *pDevice);
EXPECT_NE(nullptr, &builder);
@@ -702,7 +702,7 @@ TEST_F(BuiltInTests, BuiltinDispatchInfoBuilderGetVMEBuilderReturnNonNull) {
TEST_F(BuiltInTests, BuiltinDispatchInfoBuilderVMEBuilderNullKernel) {
overwriteBuiltInBinaryName(pDevice, "media_kernels_backend");
EBuiltInOps vmeOps[] = {EBuiltInOps::VmeBlockMotionEstimateIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
EBuiltInOps::Type vmeOps[] = {EBuiltInOps::VmeBlockMotionEstimateIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
for (auto op : vmeOps) {
BuiltinDispatchInfoBuilder &builder = pBuiltIns->getBuiltinDispatchInfoBuilder(op, *pContext, *pDevice);
@@ -789,7 +789,7 @@ TEST_F(BuiltInTests, BuiltinDispatchInfoBuilderAdvancedVMEBuilder) {
auto image = std::unique_ptr<Image>(Image2dHelper<>::create(pContext));
cl_mem srcImageArg = static_cast<cl_mem>(image.get());
EBuiltInOps vmeOps[] = {EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
EBuiltInOps::Type vmeOps[] = {EBuiltInOps::VmeBlockAdvancedMotionEstimateCheckIntel, EBuiltInOps::VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel};
for (auto op : vmeOps) {
MultiDispatchInfo outMdi;
overwriteBuiltInBinaryName(pDevice, "media_kernels_backend");
@@ -851,6 +851,11 @@ TEST_F(BuiltInTests, getBuiltinAsString) {
EXPECT_EQ(0, strcmp("unknown", getBuiltinAsString(EBuiltInOps::COUNT)));
}
TEST_F(BuiltInTests, WhenUnknownOperationIsSpecifiedThenUnknownNameIsReturned) {
EXPECT_EQ(0, strcmp("unknown", getUnknownBuiltinAsString(EBuiltInOps::CopyImage3dToBuffer)));
EXPECT_EQ(0, strcmp("unknown", getUnknownBuiltinAsString(EBuiltInOps::COUNT)));
}
TEST_F(BuiltInTests, getExtension) {
EXPECT_EQ(0, strcmp("", BuiltinCode::getExtension(BuiltinCode::ECodeType::Any)));
EXPECT_EQ(0, strcmp(".bin", BuiltinCode::getExtension(BuiltinCode::ECodeType::Binary)));
@@ -872,7 +877,7 @@ TEST_F(BuiltInTests, createBuiltinResource) {
}
TEST_F(BuiltInTests, createBuiltinResourceName) {
EBuiltInOps builtin = EBuiltInOps::CopyBufferToBuffer;
EBuiltInOps::Type builtin = EBuiltInOps::CopyBufferToBuffer;
const std::string extension = ".cl";
const std::string platformName = "skl";
const uint32_t deviceRevId = 9;
@@ -1017,7 +1022,7 @@ TEST_F(BuiltInTests, getBuiltinCodeForTypeInvalid) {
TEST_F(BuiltInTests, getBuiltinResourcesForTypeSource) {
class MockBuiltinsLib : BuiltinsLib {
public:
BuiltinResourceT getBuiltinResource(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
BuiltinResourceT getBuiltinResource(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
return BuiltinsLib::getBuiltinResource(builtin, requestedCodeType, device);
}
};
@@ -1044,7 +1049,7 @@ TEST_F(BuiltInTests, getBuiltinResourcesForTypeSource) {
TEST_F(BuiltInTests, getBuiltinResourcesForTypeBinary) {
class MockBuiltinsLib : BuiltinsLib {
public:
BuiltinResourceT getBuiltinResource(EBuiltInOps builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
BuiltinResourceT getBuiltinResource(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device) {
return BuiltinsLib::getBuiltinResource(builtin, requestedCodeType, device);
}
};

View File

@@ -240,7 +240,7 @@ HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenHostPtr
HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenRowPitchIsSetToSlicePitch) {
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
EBuiltInOps copyBuiltIn = EBuiltInOps::CopyImage3dToBuffer;
EBuiltInOps::Type copyBuiltIn = EBuiltInOps::CopyImage3dToBuffer;
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
copyBuiltIn,
pCmdQ->getContext(),

View File

@@ -218,7 +218,7 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenReadWriteImageIsCalledThenH
HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenWriteImageIsCalledThenRowPitchIsSetToSlicePitch) {
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
EBuiltInOps copyBuiltIn = EBuiltInOps::CopyBufferToImage3d;
EBuiltInOps::Type copyBuiltIn = EBuiltInOps::CopyBufferToImage3d;
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
copyBuiltIn,
pCmdQ->getContext(),