feature: Don't allow to build program with stateful accesses on PVC

Related-To: NEO-6075
Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
This commit is contained in:
Kamil Kopryk
2023-04-26 16:12:22 +00:00
committed by Compute-Runtime-Automation
parent 25c7074d43
commit 1676c32c78
9 changed files with 59 additions and 9 deletions

View File

@@ -73,6 +73,8 @@ void ModuleImmutableDataFixture::MockKernel::setCrossThreadData(uint32_t dataSiz
}
void ModuleImmutableDataFixture::setUp() {
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto hwInfo = NEO::defaultHwInfo.get();
if (DebugManager.flags.OverrideRevision.get() != -1) {
this->copyHwInfo = *NEO::defaultHwInfo.get();
@@ -86,6 +88,9 @@ void ModuleImmutableDataFixture::setUp() {
}
void ModuleImmutableDataFixture::createModuleFromMockBinary(uint32_t perHwThreadPrivateMemorySize, bool isInternal, MockImmutableData *mockKernelImmData, std::initializer_list<ZebinTestData::appendElfAdditionalSection> additionalSections) {
DebugManagerStateRestore restore;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo(), additionalSections);
const auto &src = zebinData->storage;
@@ -133,12 +138,13 @@ L0::Module *ModuleFixture::ProxyModuleImp::create(L0::Device *device, const ze_m
}
void ModuleFixture::setUp() {
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
DeviceFixture::setUp();
createModuleFromMockBinary();
}
void ModuleFixture::createModuleFromMockBinary(ModuleType type) {
zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
@@ -183,6 +189,8 @@ void MultiDeviceModuleFixture::setUp() {
}
void MultiDeviceModuleFixture::createModuleFromMockBinary(uint32_t rootDeviceIndex) {
DebugManagerStateRestore restore;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto device = driverHandle->devices[rootDeviceIndex];
zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;

View File

@@ -116,6 +116,7 @@ struct ModuleImmutableDataFixture : public DeviceFixture {
std::unique_ptr<MockModule> module;
std::unique_ptr<ZebinTestData::ZebinWithL0TestCommonModule> zebinData;
MockImmutableMemoryManager *memoryManager;
DebugManagerStateRestore restore;
};
struct ModuleFixture : public DeviceFixture {
@@ -146,6 +147,7 @@ struct ModuleFixture : public DeviceFixture {
std::unique_ptr<L0::Module> module;
std::unique_ptr<WhiteBox<::L0::Kernel>> kernel;
std::unique_ptr<ZebinTestData::ZebinWithL0TestCommonModule> zebinData;
DebugManagerStateRestore restore;
};
struct MultiDeviceModuleFixture : public MultiDeviceFixture {

View File

@@ -6,6 +6,7 @@
*/
#include "shared/source/compiler_interface/external_functions.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/device_binary_format/patchtokens_decoder.h"
#include "shared/source/helpers/bindless_heaps_helper.h"
@@ -1392,6 +1393,8 @@ class KernelPropertiesTests : public ModuleFixture, public ::testing::Test {
using KernelImp::kernelHasIndirectAccess;
};
void SetUp() override {
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
ModuleFixture::setUp();
ze_kernel_desc_t kernelDesc = {};
@@ -1411,6 +1414,7 @@ class KernelPropertiesTests : public ModuleFixture, public ::testing::Test {
ze_kernel_handle_t kernelHandle;
MockKernel *kernel = nullptr;
DebugManagerStateRestore restore;
};
TEST_F(KernelPropertiesTests, givenKernelThenCorrectNameIsRetrieved) {

View File

@@ -3103,6 +3103,9 @@ TEST_F(MultipleDevicePeerAllocationFailTest,
struct MultipleDevicePeerAllocationTest : public ::testing::Test {
void createModuleFromMockBinary(L0::Device *device, ModuleType type = ModuleType::User) {
DebugManagerStateRestore restorer;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
ze_module_desc_t moduleDesc = {};
@@ -3117,7 +3120,7 @@ struct MultipleDevicePeerAllocationTest : public ::testing::Test {
void SetUp() override {
DebugManagerStateRestore restorer;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
DebugManager.flags.CreateMultipleSubDevices.set(numSubDevices);
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);

View File

@@ -2087,6 +2087,9 @@ HWTEST_F(MultiDeviceModuleSetArgBufferTest,
using ContextModuleCreateTest = Test<DeviceFixture>;
HWTEST_F(ContextModuleCreateTest, givenCallToCreateModuleThenModuleIsReturned) {
DebugManagerStateRestore restore;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
@@ -2110,6 +2113,8 @@ using ModuleTranslationUnitTest = Test<DeviceFixture>;
struct MockModuleTU : public L0::ModuleTranslationUnit {
MockModuleTU(L0::Device *device) : L0::ModuleTranslationUnit(device) {}
DebugManagerStateRestore restore;
ze_result_t buildFromSpirV(const char *input, uint32_t inputSize, const char *buildOptions, const char *internalBuildOptions,
const ze_module_constants_t *pConstants) override {
wasBuildFromSpirVCalled = true;
@@ -2121,6 +2126,7 @@ struct MockModuleTU : public L0::ModuleTranslationUnit {
}
ze_result_t createFromNativeBinary(const char *input, size_t inputSize) override {
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
wasCreateFromNativeBinaryCalled = true;
return L0::ModuleTranslationUnit::createFromNativeBinary(input, inputSize);
}
@@ -2133,7 +2139,6 @@ struct MockModuleTU : public L0::ModuleTranslationUnit {
HWTEST_F(ModuleTranslationUnitTest, GivenRebuildPrecompiledKernelsFlagAndFileWithoutIntermediateCodeWhenCreatingModuleFromNativeBinaryThenModuleIsNotRecompiled) {
DebugManagerStateRestore dgbRestorer;
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(true);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
@@ -2811,6 +2816,8 @@ TEST(ModuleBuildLog, WhenTooSmallBufferIsPassedToGetStringThenErrorIsReturned) {
using PrintfModuleTest = Test<DeviceFixture>;
HWTEST_F(PrintfModuleTest, GivenModuleWithPrintfWhenKernelIsCreatedThenPrintfAllocationIsPlacedInResidencyContainer) {
DebugManagerStateRestore restore{};
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
@@ -3145,8 +3152,9 @@ TEST_F(ModuleInitializeTest, whenModuleInitializeIsCalledThenCorrectResultIsRetu
moduleDesc.pInputModule = reinterpret_cast<const uint8_t *>(src.data());
moduleDesc.inputSize = src.size();
std::array<std::tuple<ze_result_t, bool, ModuleType, int32_t>, 5> testParams = {{
std::array<std::tuple<ze_result_t, bool, ModuleType, int32_t>, 6> testParams = {{
{ZE_RESULT_SUCCESS, false, ModuleType::Builtin, -1},
{ZE_RESULT_SUCCESS, true, ModuleType::User, -1},
{ZE_RESULT_SUCCESS, true, ModuleType::Builtin, 0},
{ZE_RESULT_SUCCESS, true, ModuleType::User, 0},
{ZE_RESULT_SUCCESS, true, ModuleType::Builtin, 1},
@@ -3158,6 +3166,13 @@ TEST_F(ModuleInitializeTest, whenModuleInitializeIsCalledThenCorrectResultIsRetu
module.translationUnit = std::make_unique<MyMockModuleTU>(device);
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(debugKey);
module.setAddressingMode(isStateful);
if (isStateful && debugKey == -1) {
if (compilerProductHelper.failBuildProgramWithStatefulAccessPreference() == true) {
expectedResult = ZE_RESULT_ERROR_MODULE_BUILD_FAILURE;
}
}
EXPECT_EQ(expectedResult, module.initialize(&moduleDesc, device->getNEODevice()));
}
}
@@ -3803,6 +3818,8 @@ HWTEST_F(ModuleWithZebinTest, givenZebinWithKernelCallingExternalFunctionThenUpd
using ModuleKernelImmDatasTest = Test<ModuleFixture>;
TEST_F(ModuleKernelImmDatasTest, givenDeviceOOMWhenMemoryManagerFailsToAllocateMemoryThenReturnInformativeErrorToTheCaller) {
DebugManagerStateRestore restore;
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;

View File

@@ -24,7 +24,7 @@ class ModuleOnlineCompiled : public DeviceFixture, public testing::Test {
public:
void SetUp() override {
DeviceFixture::setUp();
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(device->getHwInfo());
const auto &src = zebinData->storage;
@@ -42,6 +42,7 @@ class ModuleOnlineCompiled : public DeviceFixture, public testing::Test {
DeviceFixture::tearDown();
}
std::unique_ptr<WhiteBox<L0::Module>> module;
DebugManagerStateRestore restore;
};
using ModuleTests = Test<DeviceFixture>;

View File

@@ -139,6 +139,7 @@ class UmStatelessCompressionWithStatefulAccess : public ProgramFixture,
void SetUp() override {
DebugManager.flags.EnableStatelessCompressionWithUnifiedMemory.set(1);
DebugManager.flags.EnableSharedSystemUsmSupport.set(0);
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(0);
compareCompressedMemory = GetParam();
ProgramFixture::setUp();

View File

@@ -1904,14 +1904,15 @@ TEST_F(ProgramTests, givenStatefulAndStatelessAccessesWhenProgramBuildIsCalledTh
}
};
std::array<std::tuple<int, bool, int32_t>, 3> testParams = {{{CL_SUCCESS, false, -1},
std::array<std::tuple<int, bool, int32_t>, 4> testParams = {{{CL_SUCCESS, true, -1},
{CL_SUCCESS, false, -1},
{CL_SUCCESS, true, 0},
{CL_BUILD_PROGRAM_FAILURE, true, 1}}};
for (auto &[result, isStatefulAccess, debuyKey] : testParams) {
for (auto &[expectedResult, isStatefulAccess, debuyKey] : testParams) {
if (!compilerProductHelper.isForceToStatelessRequired()) {
result = CL_SUCCESS;
expectedResult = CL_SUCCESS;
}
MyMockProgram program(pContext, false, toClDeviceVector(*pClDevice));
program.isBuiltIn = false;
@@ -1919,7 +1920,14 @@ TEST_F(ProgramTests, givenStatefulAndStatelessAccessesWhenProgramBuildIsCalledTh
program.createdFrom = Program::CreatedFrom::SOURCE;
program.setAddressingMode(isStatefulAccess);
DebugManager.flags.FailBuildProgramWithStatefulAccess.set(debuyKey);
EXPECT_EQ(result, program.build(toClDeviceVector(*pClDevice), nullptr, false));
if (isStatefulAccess && debuyKey == -1) {
if (compilerProductHelper.failBuildProgramWithStatefulAccessPreference() == true) {
expectedResult = CL_BUILD_PROGRAM_FAILURE;
}
}
EXPECT_EQ(expectedResult, program.build(toClDeviceVector(*pClDevice), nullptr, false));
}
{

View File

@@ -10,4 +10,10 @@ template <>
uint64_t CompilerProductHelperHw<IGFX_PVC>::getHwInfoConfig(const HardwareInfo &hwInfo) const {
return 0x0;
}
template <>
bool CompilerProductHelperHw<IGFX_PVC>::failBuildProgramWithStatefulAccessPreference() const {
return true;
}
} // namespace NEO