mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-19 16:24:18 +08:00
fix(ocloc): optimize accesses to cache when building source code
when binary is zebin then don't look for separate debug binary Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
fcef00969e
commit
a28d6557ad
@@ -3124,19 +3124,25 @@ TEST(OfflineCompilerTest, givenDefaultOfflineCompilerObjectWhenNoOptionsAreChang
|
||||
EXPECT_FALSE(mockOfflineCompiler->inputFileSpirV);
|
||||
}
|
||||
|
||||
TEST(OfflineCompilerTest, givenIntermediateRepresentationInputWhenBuildSourceCodeIsCalledThenProperTranslationContextIsUsed) {
|
||||
TEST(OfflineCompilerTest, givenSpirvRepresentationInputWhenBuildSourceCodeIsCalledThenProperTranslationContextIsUsed) {
|
||||
MockOfflineCompiler mockOfflineCompiler;
|
||||
|
||||
Source source{reinterpret_cast<const uint8_t *>(spirvMagic.data()), spirvMagic.size(), "some_file.spv"};
|
||||
static_cast<MockOclocArgHelper *>(mockOfflineCompiler.argHelper)->inputs.push_back(source);
|
||||
std::vector<std::string> argv = {
|
||||
"ocloc",
|
||||
"-file",
|
||||
clFiles + "emptykernel.cl",
|
||||
"some_file.spv",
|
||||
"-device",
|
||||
gEnvironment->devicePrefix.c_str()};
|
||||
|
||||
testing::internal::CaptureStdout();
|
||||
struct StdoutCaptureRAII {
|
||||
~StdoutCaptureRAII() {
|
||||
testing::internal::GetCapturedStdout();
|
||||
auto output = testing::internal::GetCapturedStdout();
|
||||
if (HasFatalFailure()) {
|
||||
printf("%s", output.c_str());
|
||||
}
|
||||
}
|
||||
} stdoutCaptureRAII;
|
||||
auto retVal = mockOfflineCompiler.initialize(argv.size(), argv);
|
||||
@@ -3150,8 +3156,34 @@ TEST(OfflineCompilerTest, givenIntermediateRepresentationInputWhenBuildSourceCod
|
||||
ASSERT_EQ(1U, mockIgcOclDeviceCtx->requestedTranslationCtxs.size());
|
||||
NEO::MockIgcOclDeviceCtx::TranslationOpT expectedTranslation = {IGC::CodeType::spirV, IGC::CodeType::oclGenBin};
|
||||
ASSERT_EQ(expectedTranslation, mockIgcOclDeviceCtx->requestedTranslationCtxs[0]);
|
||||
}
|
||||
|
||||
TEST(OfflineCompilerTest, givenLlvmBcRepresentationInputWhenBuildSourceCodeIsCalledThenProperTranslationContextIsUsed) {
|
||||
MockOfflineCompiler mockOfflineCompiler;
|
||||
|
||||
Source source{reinterpret_cast<const uint8_t *>(llvmBcMagic.data()), llvmBcMagic.size(), "some_file.bc"};
|
||||
static_cast<MockOclocArgHelper *>(mockOfflineCompiler.argHelper)->inputs.push_back(source);
|
||||
std::vector<std::string> argv = {
|
||||
"ocloc",
|
||||
"-file",
|
||||
"some_file.bc",
|
||||
"-device",
|
||||
gEnvironment->devicePrefix.c_str()};
|
||||
|
||||
testing::internal::CaptureStdout();
|
||||
struct StdoutCaptureRAII {
|
||||
~StdoutCaptureRAII() {
|
||||
auto output = testing::internal::GetCapturedStdout();
|
||||
if (HasFatalFailure()) {
|
||||
printf("%s", output.c_str());
|
||||
}
|
||||
}
|
||||
} stdoutCaptureRAII;
|
||||
auto retVal = mockOfflineCompiler.initialize(argv.size(), argv);
|
||||
auto mockIgcOclDeviceCtx = new NEO::MockIgcOclDeviceCtx();
|
||||
mockOfflineCompiler.mockIgcFacade->igcDeviceCtx = CIF::RAII::Pack<IGC::IgcOclDeviceCtxTagOCL>(mockIgcOclDeviceCtx);
|
||||
ASSERT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
mockOfflineCompiler.inputFileSpirV = false;
|
||||
mockOfflineCompiler.inputFileLlvm = true;
|
||||
mockIgcOclDeviceCtx->requestedTranslationCtxs.clear();
|
||||
retVal = mockOfflineCompiler.build();
|
||||
@@ -3161,7 +3193,7 @@ TEST(OfflineCompilerTest, givenIntermediateRepresentationInputWhenBuildSourceCod
|
||||
EXPECT_FALSE(mockOfflineCompiler.isSpirV);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_EQ(1U, mockIgcOclDeviceCtx->requestedTranslationCtxs.size());
|
||||
expectedTranslation = {IGC::CodeType::llvmBc, IGC::CodeType::oclGenBin};
|
||||
NEO::MockIgcOclDeviceCtx::TranslationOpT expectedTranslation = {IGC::CodeType::llvmBc, IGC::CodeType::oclGenBin};
|
||||
ASSERT_EQ(expectedTranslation, mockIgcOclDeviceCtx->requestedTranslationCtxs[0]);
|
||||
}
|
||||
|
||||
|
||||
@@ -579,8 +579,17 @@ int OfflineCompiler::buildSourceCode() {
|
||||
if (sourceCode.empty()) {
|
||||
return OCLOC_INVALID_PROGRAM;
|
||||
}
|
||||
auto inputTypeWarnings = validateInputType(sourceCode, inputFileLlvm, inputFileSpirV);
|
||||
this->argHelper->printf(inputTypeWarnings.c_str());
|
||||
bool inputIsIntermediateRepresentation = inputFileLlvm || inputFileSpirV;
|
||||
if (false == inputIsIntermediateRepresentation) {
|
||||
if (inputIsIntermediateRepresentation) {
|
||||
|
||||
storeBinary(irBinary, irBinarySize, sourceCode.c_str(), sourceCode.size());
|
||||
auto asBitcode = ArrayRef<const uint8_t>::fromAny(irBinary, irBinarySize);
|
||||
isSpirV = NEO::isSpirVBitcode(asBitcode);
|
||||
|
||||
pBuildInfo->intermediateRepresentation = isSpirV ? IGC::CodeType::spirV : IGC::CodeType::llvmBc;
|
||||
} else {
|
||||
retVal = buildIrBinary();
|
||||
if (retVal != OCLOC_SUCCESS)
|
||||
return retVal;
|
||||
@@ -589,26 +598,24 @@ int OfflineCompiler::buildSourceCode() {
|
||||
const std::string igcRevision = igcFacade->getIgcRevision();
|
||||
const auto igcLibSize = igcFacade->getIgcLibSize();
|
||||
const auto igcLibMTime = igcFacade->getIgcLibMTime();
|
||||
const bool generateDebugInfo = CompilerOptions::contains(options, CompilerOptions::generateDebugInfo);
|
||||
|
||||
if (allowCaching) {
|
||||
genHash = cache->getCachedFileName(getHardwareInfo(), ArrayRef<const char>(irBinary, irBinarySize), options, internalOptions, ArrayRef<const char>(), ArrayRef<const char>(), igcRevision, igcLibSize, igcLibMTime);
|
||||
genBinary = cache->loadCachedBinary(genHash, genBinarySize).release();
|
||||
|
||||
const bool generateDebugInfo = CompilerOptions::contains(options, CompilerOptions::generateDebugInfo);
|
||||
if (generateDebugInfo) {
|
||||
dbgHash = cache->getCachedFileName(getHardwareInfo(), irHash, options, internalOptions, ArrayRef<const char>(), ArrayRef<const char>(), igcRevision, igcLibSize, igcLibMTime);
|
||||
debugDataBinary = cache->loadCachedBinary(dbgHash, debugDataBinarySize).release();
|
||||
}
|
||||
|
||||
genBinary = cache->loadCachedBinary(genHash, genBinarySize).release();
|
||||
|
||||
if (genBinary) {
|
||||
bool isZebin = isDeviceBinaryFormat<DeviceBinaryFormat::zebin>(ArrayRef<uint8_t>(reinterpret_cast<uint8_t *>(genBinary), genBinarySize));
|
||||
|
||||
auto asBitcode = ArrayRef<const uint8_t>::fromAny(irBinary, irBinarySize);
|
||||
isSpirV = NEO::isSpirVBitcode(asBitcode);
|
||||
|
||||
if (!generateDebugInfo) {
|
||||
if (!generateDebugInfo || isZebin) {
|
||||
return retVal;
|
||||
} else if (debugDataBinary || isZebin) {
|
||||
}
|
||||
debugDataBinary = cache->loadCachedBinary(dbgHash, debugDataBinarySize).release();
|
||||
|
||||
if (debugDataBinary) {
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
@@ -620,24 +627,13 @@ int OfflineCompiler::buildSourceCode() {
|
||||
|
||||
UNRECOVERABLE_IF(!igcFacade->isInitialized());
|
||||
|
||||
auto inputTypeWarnings = validateInputType(sourceCode, inputFileLlvm, inputFileSpirV);
|
||||
this->argHelper->printf(inputTypeWarnings.c_str());
|
||||
auto igcTranslationCtx = igcFacade->createTranslationContext(pBuildInfo->intermediateRepresentation, IGC::CodeType::oclGenBin);
|
||||
|
||||
CIF::RAII::UPtr_t<IGC::OclTranslationOutputTagOCL> igcOutput;
|
||||
auto igcSrc = igcFacade->createConstBuffer(irBinary, irBinarySize);
|
||||
auto igcOptions = igcFacade->createConstBuffer(options.c_str(), options.size());
|
||||
auto igcInternalOptions = igcFacade->createConstBuffer(internalOptions.c_str(), internalOptions.size());
|
||||
if (false == inputIsIntermediateRepresentation) {
|
||||
auto igcTranslationCtx = igcFacade->createTranslationContext(pBuildInfo->intermediateRepresentation, IGC::CodeType::oclGenBin);
|
||||
auto igcSrc = igcFacade->createConstBuffer(irBinary, irBinarySize);
|
||||
igcOutput = igcTranslationCtx->Translate(igcSrc.get(), igcOptions.get(), igcInternalOptions.get(), nullptr, 0);
|
||||
auto igcOutput = igcTranslationCtx->Translate(igcSrc.get(), igcOptions.get(), igcInternalOptions.get(), nullptr, 0);
|
||||
|
||||
} else {
|
||||
storeBinary(irBinary, irBinarySize, sourceCode.c_str(), sourceCode.size());
|
||||
isSpirV = inputFileSpirV;
|
||||
auto igcSrc = igcFacade->createConstBuffer(sourceCode.c_str(), sourceCode.size());
|
||||
auto igcTranslationCtx = igcFacade->createTranslationContext(inputFileSpirV ? IGC::CodeType::spirV : IGC::CodeType::llvmBc, IGC::CodeType::oclGenBin);
|
||||
igcOutput = igcTranslationCtx->Translate(igcSrc.get(), igcOptions.get(), igcInternalOptions.get(), nullptr, 0);
|
||||
}
|
||||
if (igcOutput == nullptr) {
|
||||
return OCLOC_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user