refactor: add checker for stateless only kernels
Related-To: NEO-10381 Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
parent
4df0dd7894
commit
b3be51fc35
|
@ -9,7 +9,6 @@
|
||||||
#include "shared/source/command_container/encode_surface_state.h"
|
#include "shared/source/command_container/encode_surface_state.h"
|
||||||
#include "shared/source/command_container/implicit_scaling.h"
|
#include "shared/source/command_container/implicit_scaling.h"
|
||||||
#include "shared/source/command_stream/preemption.h"
|
#include "shared/source/command_stream/preemption.h"
|
||||||
#include "shared/source/helpers/addressing_mode_helper.h"
|
|
||||||
#include "shared/source/helpers/cache_flush_xehp_and_later.inl"
|
#include "shared/source/helpers/cache_flush_xehp_and_later.inl"
|
||||||
#include "shared/source/helpers/pause_on_gpu_properties.h"
|
#include "shared/source/helpers/pause_on_gpu_properties.h"
|
||||||
#include "shared/source/helpers/pipeline_select_helper.h"
|
#include "shared/source/helpers/pipeline_select_helper.h"
|
||||||
|
@ -99,13 +98,13 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendLaunchKernelWithParams(K
|
||||||
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KernelImp *kernelImp = static_cast<KernelImp *>(kernel);
|
||||||
if (this->cmdListHeapAddressModel == NEO::HeapAddressModel::globalStateless) {
|
if (this->cmdListHeapAddressModel == NEO::HeapAddressModel::globalStateless) {
|
||||||
if (NEO::AddressingModeHelper::containsStatefulAccess(kernelDescriptor, false)) {
|
if (kernelImp->checkKernelContainsStatefulAccess()) {
|
||||||
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KernelImp *kernelImp = static_cast<KernelImp *>(kernel);
|
|
||||||
if (kernelImp->usesRayTracing()) {
|
if (kernelImp->usesRayTracing()) {
|
||||||
NEO::GraphicsAllocation *memoryBackedBuffer = device->getNEODevice()->getRTMemoryBackedBuffer();
|
NEO::GraphicsAllocation *memoryBackedBuffer = device->getNEODevice()->getRTMemoryBackedBuffer();
|
||||||
if (memoryBackedBuffer == nullptr) {
|
if (memoryBackedBuffer == nullptr) {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "shared/source/debugger/debugger_l0.h"
|
#include "shared/source/debugger/debugger_l0.h"
|
||||||
#include "shared/source/execution_environment/root_device_environment.h"
|
#include "shared/source/execution_environment/root_device_environment.h"
|
||||||
#include "shared/source/gmm_helper/gmm_helper.h"
|
#include "shared/source/gmm_helper/gmm_helper.h"
|
||||||
|
#include "shared/source/helpers/addressing_mode_helper.h"
|
||||||
#include "shared/source/helpers/basic_math.h"
|
#include "shared/source/helpers/basic_math.h"
|
||||||
#include "shared/source/helpers/bindless_heaps_helper.h"
|
#include "shared/source/helpers/bindless_heaps_helper.h"
|
||||||
#include "shared/source/helpers/blit_commands_helper.h"
|
#include "shared/source/helpers/blit_commands_helper.h"
|
||||||
|
@ -1381,4 +1382,12 @@ void KernelImp::patchBindlessOffsetsForImplicitArgs(uint64_t bindlessSurfaceStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool KernelImp::checkKernelContainsStatefulAccess() {
|
||||||
|
auto moduleImp = static_cast<ModuleImp *>(this->module);
|
||||||
|
auto isUserKernel = (moduleImp->getModuleType() == ModuleType::user);
|
||||||
|
auto isGeneratedByIgc = moduleImp->getTranslationUnit()->isGeneratedByIgc;
|
||||||
|
auto containsStatefulAccess = NEO::AddressingModeHelper::containsStatefulAccess(getKernelDescriptor(), false);
|
||||||
|
return containsStatefulAccess && isUserKernel && isGeneratedByIgc;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace L0
|
} // namespace L0
|
||||||
|
|
|
@ -186,6 +186,8 @@ struct KernelImp : Kernel {
|
||||||
|
|
||||||
KernelExt *getExtension(uint32_t extensionType);
|
KernelExt *getExtension(uint32_t extensionType);
|
||||||
|
|
||||||
|
bool checkKernelContainsStatefulAccess();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
KernelImp() = default;
|
KernelImp() = default;
|
||||||
|
|
||||||
|
|
|
@ -159,6 +159,9 @@ struct ModuleImp : public Module {
|
||||||
std::vector<std::shared_ptr<Kernel>> &getPrintfKernelContainer() { return this->printfKernelContainer; }
|
std::vector<std::shared_ptr<Kernel>> &getPrintfKernelContainer() { return this->printfKernelContainer; }
|
||||||
std::weak_ptr<Kernel> getPrintfKernelWeakPtr(ze_kernel_handle_t kernelHandle) const;
|
std::weak_ptr<Kernel> getPrintfKernelWeakPtr(ze_kernel_handle_t kernelHandle) const;
|
||||||
ze_result_t destroyPrintfKernel(ze_kernel_handle_t kernelHandle);
|
ze_result_t destroyPrintfKernel(ze_kernel_handle_t kernelHandle);
|
||||||
|
ModuleType getModuleType() const {
|
||||||
|
return this->type;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MOCKABLE_VIRTUAL ze_result_t initializeTranslationUnit(const ze_module_desc_t *desc, NEO::Device *neoDevice);
|
MOCKABLE_VIRTUAL ze_result_t initializeTranslationUnit(const ze_module_desc_t *desc, NEO::Device *neoDevice);
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace ult {
|
||||||
|
|
||||||
struct MockModuleTranslationUnit : public L0::ModuleTranslationUnit {
|
struct MockModuleTranslationUnit : public L0::ModuleTranslationUnit {
|
||||||
using BaseClass = L0::ModuleTranslationUnit;
|
using BaseClass = L0::ModuleTranslationUnit;
|
||||||
|
using BaseClass::isGeneratedByIgc;
|
||||||
|
|
||||||
MockModuleTranslationUnit(L0::Device *device) : BaseClass{device} {}
|
MockModuleTranslationUnit(L0::Device *device) : BaseClass{device} {}
|
||||||
|
|
||||||
|
|
|
@ -2615,8 +2615,10 @@ HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
EXPECT_EQ(nullptr, dsh);
|
EXPECT_EQ(nullptr, dsh);
|
||||||
}
|
}
|
||||||
HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
givenKernelUsingStatefulAccessWhenAppendingKernelOnGlobalStatelessThenExpectError,
|
givenUserKernelCreatedByIgcUsingStatefulAccessWhenAppendingKernelOnGlobalStatelessThenExpectError,
|
||||||
IsAtLeastXeHpCore) {
|
IsAtLeastXeHpCore) {
|
||||||
|
module->translationUnit->isGeneratedByIgc = true;
|
||||||
|
module->type = ModuleType::user;
|
||||||
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs.resize(1);
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs.resize(1);
|
||||||
|
|
||||||
auto ptrArg = ArgDescriptor(ArgDescriptor::argTPointer);
|
auto ptrArg = ArgDescriptor(ArgDescriptor::argTPointer);
|
||||||
|
@ -2636,5 +2638,71 @@ HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, result);
|
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
|
givenUserKernelNotCreatedByIgcUsingStatefulAccessWhenAppendingKernelOnGlobalStatelessThenExpectSuccess,
|
||||||
|
IsAtLeastXeHpCore) {
|
||||||
|
module->translationUnit->isGeneratedByIgc = false;
|
||||||
|
module->type = ModuleType::user;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs.resize(1);
|
||||||
|
|
||||||
|
auto ptrArg = ArgDescriptor(ArgDescriptor::argTPointer);
|
||||||
|
ptrArg.as<ArgDescPointer>().bindless = 0x40;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs[0] = ptrArg;
|
||||||
|
|
||||||
|
ze_group_count_t groupCount{1, 1, 1};
|
||||||
|
CmdListKernelLaunchParams launchParams = {};
|
||||||
|
auto result = commandList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams, false);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
|
||||||
|
ptrArg.as<ArgDescPointer>().bindless = undefined<CrossThreadDataOffset>;
|
||||||
|
ptrArg.as<ArgDescPointer>().bindful = 0x40;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs[0] = ptrArg;
|
||||||
|
|
||||||
|
result = commandList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams, false);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
|
givenBuiltinKernelCreatedByIgcUsingStatefulAccessWhenAppendingKernelOnGlobalStatelessThenExpectSuccess,
|
||||||
|
IsAtLeastXeHpCore) {
|
||||||
|
module->translationUnit->isGeneratedByIgc = true;
|
||||||
|
module->type = ModuleType::builtin;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs.resize(1);
|
||||||
|
|
||||||
|
auto ptrArg = ArgDescriptor(ArgDescriptor::argTPointer);
|
||||||
|
ptrArg.as<ArgDescPointer>().bindless = 0x40;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs[0] = ptrArg;
|
||||||
|
|
||||||
|
ze_group_count_t groupCount{1, 1, 1};
|
||||||
|
CmdListKernelLaunchParams launchParams = {};
|
||||||
|
auto result = commandList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams, false);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
|
||||||
|
ptrArg.as<ArgDescPointer>().bindless = undefined<CrossThreadDataOffset>;
|
||||||
|
ptrArg.as<ArgDescPointer>().bindful = 0x40;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs[0] = ptrArg;
|
||||||
|
|
||||||
|
result = commandList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams, false);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
HWTEST2_F(CommandListStateBaseAddressGlobalStatelessTest,
|
||||||
|
givenUserKernelCreatedByIgcUsingStatelessAccessWhenAppendingKernelOnGlobalStatelessThenExpectSuccess,
|
||||||
|
IsAtLeastXeHpCore) {
|
||||||
|
module->translationUnit->isGeneratedByIgc = true;
|
||||||
|
module->type = ModuleType::user;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs.resize(1);
|
||||||
|
|
||||||
|
auto ptrArg = ArgDescriptor(ArgDescriptor::argTPointer);
|
||||||
|
ptrArg.as<ArgDescPointer>().bindless = undefined<CrossThreadDataOffset>;
|
||||||
|
ptrArg.as<ArgDescPointer>().bindful = undefined<CrossThreadDataOffset>;
|
||||||
|
mockKernelImmData->kernelDescriptor->payloadMappings.explicitArgs[0] = ptrArg;
|
||||||
|
|
||||||
|
ze_group_count_t groupCount{1, 1, 1};
|
||||||
|
CmdListKernelLaunchParams launchParams = {};
|
||||||
|
auto result = commandList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams, false);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ult
|
} // namespace ult
|
||||||
} // namespace L0
|
} // namespace L0
|
||||||
|
|
Loading…
Reference in New Issue