diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index 7620c09397..b7186a8849 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -109,9 +109,7 @@ cl_int Program::build( inputArgs.apiOptions = ArrayRef(options.c_str(), options.length()); inputArgs.internalOptions = ArrayRef(internalOptions.c_str(), internalOptions.length()); inputArgs.GTPinInput = gtpinGetIgcInit(); - inputArgs.specConstants.idsBuffer = this->specConstantsIds.get(); - inputArgs.specConstants.sizesBuffer = this->specConstantsSizes.get(); - inputArgs.specConstants.valuesBuffer = this->specConstantsValues.get(); + inputArgs.specConstants.specializedValues = this->specConstantsValues; DBG_LOG(LogApiCalls, "Build Options", inputArgs.apiOptions.begin(), "\nBuild Internal Options", inputArgs.internalOptions.begin()); diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index 52beda8f73..0032ee6aeb 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -238,7 +238,6 @@ cl_int Program::setProgramSpecializationConstant(cl_uint specId, size_t specSize this->specConstantsIds.reset(specConstInfo.idsBuffer.release()); this->specConstantsSizes.reset(specConstInfo.sizesBuffer.release()); - this->specConstantsValues.reset(specConstInfo.valuesBuffer.release()); areSpecializationConstantsInitialized = true; } @@ -252,7 +251,7 @@ cl_int Program::updateSpecializationConstant(cl_uint specId, size_t specSize, co if (specConstantsSizes->GetMemory()[i] == static_cast(specSize)) { uint64_t specConstValue = 0u; memcpy_s(&specConstValue, sizeof(uint64_t), specValue, specSize); - specConstantsValues->GetMemoryWriteable()[i] = specConstValue; + specConstantsValues[specId] = specConstValue; return CL_SUCCESS; } else { return CL_INVALID_VALUE; diff --git a/opencl/source/program/program.h b/opencl/source/program/program.h index 83d33afea3..f92cd619f2 100644 --- a/opencl/source/program/program.h +++ b/opencl/source/program/program.h @@ -330,7 +330,7 @@ class Program : public BaseObject<_cl_program> { bool areSpecializationConstantsInitialized = false; CIF::RAII::UPtr_t specConstantsIds; CIF::RAII::UPtr_t specConstantsSizes; - CIF::RAII::UPtr_t specConstantsValues; + std::map specConstantsValues; BlockKernelManager *blockKernelManager = nullptr; ExecutionEnvironment &executionEnvironment; diff --git a/opencl/test/unit_test/mocks/mock_compilers.cpp b/opencl/test/unit_test/mocks/mock_compilers.cpp index cbe50fe773..b49b4360c8 100644 --- a/opencl/test/unit_test/mocks/mock_compilers.cpp +++ b/opencl/test/unit_test/mocks/mock_compilers.cpp @@ -504,9 +504,6 @@ bool MockIgcOclTranslationCtx::GetSpecConstantsInfoImpl( CIF::Builtins::BufferSimple *src, CIF::Builtins::BufferSimple *outSpecConstantsIds, CIF::Builtins::BufferSimple *outSpecConstantsSizes) { - uint32_t id = 1u; - outSpecConstantsIds->PushBackRawCopy(id); - outSpecConstantsSizes->PushBackRawCopy(sizeof(uint32_t)); return true; } diff --git a/opencl/test/unit_test/program/program_spec_constants_tests.cpp b/opencl/test/unit_test/program/program_spec_constants_tests.cpp index 82eeb117ab..03d556c003 100644 --- a/opencl/test/unit_test/program/program_spec_constants_tests.cpp +++ b/opencl/test/unit_test/program/program_spec_constants_tests.cpp @@ -30,9 +30,7 @@ struct UpdateSpecConstantsTest : public ::testing::Test { mockProgram->specConstantsIds.reset(new MockCIFBuffer()); mockProgram->specConstantsSizes.reset(new MockCIFBuffer()); - mockProgram->specConstantsValues.reset(new MockCIFBuffer()); - uint32_t id1 = 1u, id2 = 2u, id3 = 3u; mockProgram->specConstantsIds->PushBackRawCopy(id1); mockProgram->specConstantsIds->PushBackRawCopy(id2); mockProgram->specConstantsIds->PushBackRawCopy(id3); @@ -42,23 +40,26 @@ struct UpdateSpecConstantsTest : public ::testing::Test { mockProgram->specConstantsSizes->PushBackRawCopy(size2); mockProgram->specConstantsSizes->PushBackRawCopy(size3); - mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val1)); - mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val2)); - mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val3)); + mockProgram->specConstantsValues.insert({id1, static_cast(val1)}); + mockProgram->specConstantsValues.insert({id2, static_cast(val2)}); + mockProgram->specConstantsValues.insert({id3, static_cast(val3)}); - values = mockProgram->specConstantsValues->GetMemoryWriteable(); + values = &mockProgram->specConstantsValues; - EXPECT_EQ(val1, static_cast(values[0])); - EXPECT_EQ(val2, static_cast(values[1])); - EXPECT_EQ(val3, static_cast(values[2])); + EXPECT_EQ(val1, static_cast(values->at(id1))); + EXPECT_EQ(val2, static_cast(values->at(id2))); + EXPECT_EQ(val3, static_cast(values->at(id3))); } ExecutionEnvironment executionEnvironment; std::unique_ptr mockProgram; + uint32_t id1 = 1u; + uint32_t id2 = 2u; + uint32_t id3 = 3u; char val1 = 5; uint16_t val2 = 50; int val3 = 500; - uint64_t *values; + std::map *values; }; TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWhenUpdateSpecializationConstantThenProperValueIsCopiedAndUpdated) { @@ -67,17 +68,16 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWhenUpdateSpecializationCo auto ret = mockProgram->updateSpecializationConstant(3, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_SUCCESS, ret); - EXPECT_EQ(val1, static_cast(values[0])); - EXPECT_EQ(val2, static_cast(values[1])); - EXPECT_EQ(newSpecConstVal3, static_cast(values[2])); - EXPECT_NE(val3, static_cast(values[2])); + EXPECT_EQ(val1, static_cast(values->at(id1))); + EXPECT_EQ(val2, static_cast(values->at(id2))); + EXPECT_EQ(newSpecConstVal3, static_cast(values->at(id3))); newSpecConstVal3 = 50000; - EXPECT_NE(newSpecConstVal3, static_cast(values[2])); + EXPECT_NE(newSpecConstVal3, static_cast(values->at(id3))); ret = mockProgram->updateSpecializationConstant(3, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_SUCCESS, ret); - EXPECT_EQ(newSpecConstVal3, static_cast(values[2])); + EXPECT_EQ(newSpecConstVal3, static_cast(values->at(id3))); } TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperSizeWhenUpdateSpecializationConstantThenErrorIsReturned) { @@ -86,9 +86,9 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperSizeWhenUpdate auto ret = mockProgram->updateSpecializationConstant(3, 10 * sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_INVALID_VALUE, ret); - EXPECT_EQ(val1, static_cast(values[0])); - EXPECT_EQ(val2, static_cast(values[1])); - EXPECT_EQ(val3, static_cast(values[2])); + EXPECT_EQ(val1, static_cast(values->at(id1))); + EXPECT_EQ(val2, static_cast(values->at(id2))); + EXPECT_EQ(val3, static_cast(values->at(id3))); } TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperIdAndSizeWhenUpdateSpecializationConstantThenErrorIsReturned) { @@ -97,7 +97,7 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperIdAndSizeWhenU auto ret = mockProgram->updateSpecializationConstant(4, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_INVALID_SPEC_ID, ret); - EXPECT_EQ(val1, static_cast(values[0])); - EXPECT_EQ(val2, static_cast(values[1])); - EXPECT_EQ(val3, static_cast(values[2])); + EXPECT_EQ(val1, static_cast(values->at(id1))); + EXPECT_EQ(val2, static_cast(values->at(id2))); + EXPECT_EQ(val3, static_cast(values->at(id3))); } diff --git a/shared/source/compiler_interface/compiler_interface.cpp b/shared/source/compiler_interface/compiler_interface.cpp index c92d4d8a40..a5483d5878 100644 --- a/shared/source/compiler_interface/compiler_interface.cpp +++ b/shared/source/compiler_interface/compiler_interface.cpp @@ -80,6 +80,13 @@ TranslationOutput::ErrorCode CompilerInterface::build( auto fclOptions = CIF::Builtins::CreateConstBuffer(igcMain.get(), input.apiOptions.begin(), input.apiOptions.size()); auto fclInternalOptions = CIF::Builtins::CreateConstBuffer(igcMain.get(), input.internalOptions.begin(), input.internalOptions.size()); + auto idsBuffer = CIF::Builtins::CreateConstBuffer(igcMain.get(), nullptr, 0); + auto valuesBuffer = CIF::Builtins::CreateConstBuffer(igcMain.get(), nullptr, 0); + for (const auto &specConst : input.specConstants.specializedValues) { + idsBuffer->PushBackRawCopy(specConst.first); + valuesBuffer->PushBackRawCopy(specConst.second); + } + CIF::RAII::UPtr_t intermediateRepresentation; if (srcCodeType == IGC::CodeType::oclC) { @@ -124,7 +131,7 @@ TranslationOutput::ErrorCode CompilerInterface::build( auto igcTranslationCtx = createIgcTranslationCtx(device, intermediateCodeType, IGC::CodeType::oclGenBin); - auto igcOutput = translate(igcTranslationCtx.get(), intermediateRepresentation.get(), input.specConstants.idsBuffer, input.specConstants.valuesBuffer, + auto igcOutput = translate(igcTranslationCtx.get(), intermediateRepresentation.get(), idsBuffer.get(), valuesBuffer.get(), fclOptions.get(), fclInternalOptions.get(), input.GTPinInput); if (igcOutput == nullptr) { @@ -250,19 +257,13 @@ TranslationOutput::ErrorCode CompilerInterface::getSpecConstantsInfo(const NEO:: auto inSrc = CIF::Builtins::CreateConstBuffer(igcMain.get(), srcSpirV.begin(), srcSpirV.size()); output.idsBuffer = CIF::Builtins::CreateConstBuffer(igcMain.get(), nullptr, 0); output.sizesBuffer = CIF::Builtins::CreateConstBuffer(igcMain.get(), nullptr, 0); - output.valuesBuffer = CIF::Builtins::CreateConstBuffer(igcMain.get(), nullptr, 0); - auto retVal = getSpecConstantsInfoImpl(igcTranslationCtx.get(), inSrc.get(), output.idsBuffer.get(), output.sizesBuffer.get(), output.valuesBuffer.get()); + auto retVal = getSpecConstantsInfoImpl(igcTranslationCtx.get(), inSrc.get(), output.idsBuffer.get(), output.sizesBuffer.get()); if (!retVal) { return TranslationOutput::ErrorCode::UnknownError; } - output.valuesBuffer->Resize(output.idsBuffer->GetSizeRaw() * 2); - for (uint32_t i = 0; i < output.valuesBuffer->GetSize(); i++) { - output.valuesBuffer->GetMemoryWriteable()[i] = 0u; - } - return TranslationOutput::ErrorCode::Success; } diff --git a/shared/source/compiler_interface/compiler_interface.h b/shared/source/compiler_interface/compiler_interface.h index 6f721b628e..a6983dcf2e 100644 --- a/shared/source/compiler_interface/compiler_interface.h +++ b/shared/source/compiler_interface/compiler_interface.h @@ -41,9 +41,7 @@ struct TranslationInput { void *GTPinInput = nullptr; struct SpecConstants { - CIF::Builtins::BufferLatest *idsBuffer = nullptr; - CIF::Builtins::BufferLatest *sizesBuffer = nullptr; - CIF::Builtins::BufferLatest *valuesBuffer = nullptr; + std::map specializedValues; } specConstants; }; @@ -94,7 +92,6 @@ struct TranslationOutput { struct SpecConstantInfo { CIF::RAII::UPtr_t idsBuffer; CIF::RAII::UPtr_t sizesBuffer; - CIF::RAII::UPtr_t valuesBuffer; }; class CompilerInterface { diff --git a/shared/source/compiler_interface/compiler_interface.inl b/shared/source/compiler_interface/compiler_interface.inl index c639cc3b89..ad92efdc52 100644 --- a/shared/source/compiler_interface/compiler_interface.inl +++ b/shared/source/compiler_interface/compiler_interface.inl @@ -59,9 +59,8 @@ template inline bool getSpecConstantsInfoImpl(TranslationCtx *tCtx, CIFBuffer *src, CIFBuffer *outSpecConstantsIds, - CIFBuffer *outSpecConstantsSizes, - CIFBuffer *outSpecConstantsValues) { - if (!NEO::areNotNullptr(tCtx, src, outSpecConstantsIds, outSpecConstantsSizes, outSpecConstantsValues)) { + CIFBuffer *outSpecConstantsSizes) { + if (!NEO::areNotNullptr(tCtx, src, outSpecConstantsIds, outSpecConstantsSizes)) { return false; } return tCtx->GetSpecConstantsInfoImpl(src, outSpecConstantsIds, outSpecConstantsSizes); diff --git a/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp b/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp index 0a4db9f7fd..259278c770 100644 --- a/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp +++ b/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp @@ -725,6 +725,36 @@ struct WasLockedListener { bool wasLocked = false; }; +TEST_F(CompilerInterfaceTest, givenUpdatedSpecConstValuesWhenBuildProgramThenProperValuesArePassed) { + struct MockTranslationContextSpecConst : public MockIgcOclTranslationCtx { + IGC::OclTranslationOutputBase *TranslateImpl( + CIF::Version_t outVersion, + CIF::Builtins::BufferSimple *src, + CIF::Builtins::BufferSimple *specConstantsIds, + CIF::Builtins::BufferSimple *specConstantsValues, + CIF::Builtins::BufferSimple *options, + CIF::Builtins::BufferSimple *internalOptions, + CIF::Builtins::BufferSimple *tracingOptions, + uint32_t tracingOptionsCount, + void *gtPinInput) override { + EXPECT_EQ(10u, specConstantsIds->GetMemory()[0]); + EXPECT_EQ(100u, specConstantsValues->GetMemory()[0]); + return new MockOclTranslationOutput(); + } + }; + + auto specConstCtx = CIF::RAII::UPtr(new MockCompilerDeviceCtx()); + pCompilerInterface->setDeviceCtx(*pDevice, specConstCtx.get()); + + std::map specConst{{10, 100}}; + inputArgs.specConstants.specializedValues = specConst; + + TranslationOutput translationOutput; + auto err = pCompilerInterface->build(*pDevice, inputArgs, translationOutput); + + EXPECT_EQ(TranslationOutput::ErrorCode::Success, err); +} + TEST_F(CompilerInterfaceTest, GivenRequestForNewFclTranslationCtxWhenDeviceCtxIsNotAvailableThenCreateNewDeviceCtxAndUseItToReturnValidTranslationCtx) { auto device = this->pDevice; auto ret = this->pCompilerInterface->createFclTranslationCtx(*device, IGC::CodeType::oclC, IGC::CodeType::spirV); @@ -1039,7 +1069,7 @@ struct SpecConstantsTranslationCtxMock { }; TEST(GetSpecConstantsTest, givenNullptrTranslationContextAndBuffersWhenGetSpecializationConstantsThenErrorIsReturned) { - EXPECT_FALSE(NEO::getSpecConstantsInfoImpl(nullptr, nullptr, nullptr, nullptr, nullptr)); + EXPECT_FALSE(NEO::getSpecConstantsInfoImpl(nullptr, nullptr, nullptr, nullptr)); } TEST(GetSpecConstantsTest, whenGetSpecializationConstantsSuccedThenSuccessIsReturnedAndBuffersArePassed) { @@ -1048,9 +1078,8 @@ TEST(GetSpecConstantsTest, whenGetSpecializationConstantsSuccedThenSuccessIsRetu auto mockSrc = CIF::RAII::UPtr_t(new MockCIFBuffer()); auto mockIds = CIF::RAII::UPtr_t(new MockCIFBuffer()); auto mockSizes = CIF::RAII::UPtr_t(new MockCIFBuffer()); - auto mockValues = CIF::RAII::UPtr_t(new MockCIFBuffer()); - auto ret = NEO::getSpecConstantsInfoImpl(&tCtxMock, mockSrc.get(), mockIds.get(), mockSizes.get(), mockValues.get()); + auto ret = NEO::getSpecConstantsInfoImpl(&tCtxMock, mockSrc.get(), mockIds.get(), mockSizes.get()); EXPECT_TRUE(ret); EXPECT_EQ(mockSrc.get(), tCtxMock.receivedSrc); @@ -1065,9 +1094,8 @@ TEST(GetSpecConstantsTest, whenGetSpecializationConstantsFailThenErrorIsReturned auto mockSrc = CIF::RAII::UPtr_t(new MockCIFBuffer()); auto mockIds = CIF::RAII::UPtr_t(new MockCIFBuffer()); auto mockSizes = CIF::RAII::UPtr_t(new MockCIFBuffer()); - auto mockValues = CIF::RAII::UPtr_t(new MockCIFBuffer()); - auto ret = NEO::getSpecConstantsInfoImpl(&tCtxMock, mockSrc.get(), mockIds.get(), mockSizes.get(), mockValues.get()); + auto ret = NEO::getSpecConstantsInfoImpl(&tCtxMock, mockSrc.get(), mockIds.get(), mockSizes.get()); EXPECT_FALSE(ret); EXPECT_EQ(mockSrc.get(), tCtxMock.receivedSrc);