Skip to content

Commit 8c894fa

Browse files
Change Packed binary Returned in L0 GetNative to be the Target Device binary
- Packed Binary Returned to a customer in L0 GetNative is now the target device's native binary. Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
1 parent 359e848 commit 8c894fa

File tree

6 files changed

+75
-4
lines changed

6 files changed

+75
-4
lines changed

level_zero/api/core/ze_module.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*

level_zero/core/source/module/module_imp.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,14 @@ bool ModuleTranslationUnit::createFromNativeBinary(const char *input, size_t inp
278278
if ((false == singleDeviceBinary.deviceBinary.empty()) && (false == rebuild)) {
279279
this->unpackedDeviceBinary = makeCopy<char>(reinterpret_cast<const char *>(singleDeviceBinary.deviceBinary.begin()), singleDeviceBinary.deviceBinary.size());
280280
this->unpackedDeviceBinarySize = singleDeviceBinary.deviceBinary.size();
281-
this->packedDeviceBinary = makeCopy<char>(reinterpret_cast<const char *>(archive.begin()), archive.size());
282-
this->packedDeviceBinarySize = archive.size();
281+
// If the Native Binary was an Archive, then packedTargetDeviceBinary will be the packed Binary for the Target Device.
282+
if (singleDeviceBinary.packedTargetDeviceBinary.size() > 0) {
283+
this->packedDeviceBinary = makeCopy<char>(reinterpret_cast<const char *>(singleDeviceBinary.packedTargetDeviceBinary.begin()), singleDeviceBinary.packedTargetDeviceBinary.size());
284+
this->packedDeviceBinarySize = singleDeviceBinary.packedTargetDeviceBinary.size();
285+
} else {
286+
this->packedDeviceBinary = makeCopy<char>(reinterpret_cast<const char *>(archive.begin()), archive.size());
287+
this->packedDeviceBinarySize = archive.size();
288+
}
283289
}
284290
}
285291

level_zero/core/test/unit_tests/sources/module/test_module.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "shared/source/compiler_interface/compiler_options/compiler_options.h"
99
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
10+
#include "shared/source/device_binary_format/ar/ar_decoder.h"
11+
#include "shared/source/device_binary_format/ar/ar_encoder.h"
1012
#include "shared/source/device_binary_format/debug_zebin.h"
1113
#include "shared/source/gmm_helper/gmm.h"
1214
#include "shared/source/gmm_helper/gmm_helper.h"
@@ -19,6 +21,7 @@
1921
#include "shared/test/common/mocks/mock_graphics_allocation.h"
2022
#include "shared/test/common/test_macros/test.h"
2123
#include "shared/test/unit_test/compiler_interface/linker_mock.h"
24+
#include "shared/test/unit_test/device_binary_format/patchtokens_tests.h"
2225
#include "shared/test/unit_test/device_binary_format/zebin_tests.h"
2326

2427
#include "level_zero/core/source/context/context.h"
@@ -1975,6 +1978,36 @@ HWTEST_F(ModuleTranslationUnitTest, WhenCreatingFromNativeBinaryThenSetsUpRequir
19751978
EXPECT_FALSE(success);
19761979
}
19771980

1981+
HWTEST_F(ModuleTranslationUnitTest, WhenCreatingFromNativeBinaryThenSetsUpPackedTargetDeviceBinary) {
1982+
PatchTokensTestData::ValidEmptyProgram programTokens;
1983+
const auto &hwInfoConfig = *NEO::HwInfoConfig::get(productFamily);
1984+
NEO::HardwareInfo hwInfo = *NEO::defaultHwInfo;
1985+
auto productConfig = hwInfoConfig.getProductConfigFromHwInfo(hwInfo);
1986+
1987+
NEO::Ar::ArEncoder encoder;
1988+
std::string requiredProduct = NEO::hardwarePrefix[productFamily];
1989+
std::string requiredStepping = std::to_string(programTokens.header->SteppingId);
1990+
std::string requiredPointerSize = (programTokens.header->GPUPointerSizeInBytes == 4) ? "32" : "64";
1991+
std::string requiredProductConfig = NEO::ProductConfigHelper::parseMajorMinorRevisionValue(productConfig);
1992+
1993+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize, programTokens.storage));
1994+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "." + requiredProduct, programTokens.storage));
1995+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "unk." + requiredStepping, programTokens.storage));
1996+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "." + requiredProductConfig, programTokens.storage));
1997+
1998+
NEO::TargetDevice target;
1999+
target.coreFamily = static_cast<GFXCORE_FAMILY>(programTokens.header->Device);
2000+
target.productConfig = hwInfoConfig.getProductConfigFromHwInfo(hwInfo);
2001+
target.stepping = programTokens.header->SteppingId;
2002+
target.maxPointerSizeInBytes = programTokens.header->GPUPointerSizeInBytes;
2003+
2004+
auto arData = encoder.encode();
2005+
L0::ModuleTranslationUnit moduleTuValid(this->device);
2006+
bool success = moduleTuValid.createFromNativeBinary(reinterpret_cast<const char *>(arData.data()), arData.size());
2007+
EXPECT_TRUE(success);
2008+
EXPECT_NE(moduleTuValid.packedDeviceBinarySize, arData.size());
2009+
}
2010+
19782011
HWTEST_F(ModuleTranslationUnitTest, WhenCreatingFromZebinThenAppendAllowZebinFlagToBuildOptions) {
19792012
ZebinTestData::ValidEmptyProgram zebin;
19802013
auto hwInfo = device->getNEODevice()->getHardwareInfo();

shared/source/device_binary_format/device_binary_format_ar.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "shared/source/device_binary_format/ar/ar.h"
99
#include "shared/source/device_binary_format/ar/ar_decoder.h"
1010
#include "shared/source/device_binary_format/device_binary_formats.h"
11+
#include "shared/source/helpers/string.h"
1112

1213
namespace NEO {
1314
void searchForBinary(Ar::Ar &archiveData, const ConstStringRef filter, Ar::ArFileEntryHeaderAndData *&matched) {
@@ -70,7 +71,7 @@ SingleDeviceBinary unpackSingleDeviceBinary<NEO::DeviceBinaryFormat::Archive>(co
7071
unpacked.intermediateRepresentation = unpackedGenericIr.intermediateRepresentation;
7172
}
7273
}
73-
74+
unpacked.packedTargetDeviceBinary = ArrayRef<const uint8_t>(matchedFile->fileData.begin(), matchedFile->fileData.size());
7475
return unpacked;
7576
}
7677
if (binaryForRecompilation.intermediateRepresentation.empty() && (false == unpacked.intermediateRepresentation.empty())) {

shared/source/device_binary_format/device_binary_formats.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct SingleDeviceBinary {
7272
ArrayRef<const uint8_t> deviceBinary;
7373
ArrayRef<const uint8_t> debugData;
7474
ArrayRef<const uint8_t> intermediateRepresentation;
75+
ArrayRef<const uint8_t> packedTargetDeviceBinary;
7576
ConstStringRef buildOptions;
7677
TargetDevice targetDevice;
7778
};

shared/test/unit_test/device_binary_format/device_binary_format_ar_tests.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,36 @@ TEST(UnpackSingleDeviceBinaryAr, WhenBinaryWithProductConfigIsFoundThenChooseItA
9595
EXPECT_EQ(NEO::DeviceBinaryFormat::Patchtokens, unpacked.format);
9696
}
9797

98+
TEST(UnpackSingleDeviceBinaryAr, WhenBinaryWithProductConfigIsFoundThenPackedTargetDeviceBinaryIsSet) {
99+
PatchTokensTestData::ValidEmptyProgram programTokens;
100+
const auto &hwInfoConfig = *NEO::HwInfoConfig::get(productFamily);
101+
NEO::HardwareInfo hwInfo = *NEO::defaultHwInfo;
102+
auto productConfig = hwInfoConfig.getProductConfigFromHwInfo(hwInfo);
103+
104+
NEO::Ar::ArEncoder encoder;
105+
std::string requiredProduct = NEO::hardwarePrefix[productFamily];
106+
std::string requiredProductConfig = NEO::ProductConfigHelper::parseMajorMinorRevisionValue(productConfig);
107+
std::string requiredStepping = std::to_string(programTokens.header->SteppingId);
108+
std::string requiredPointerSize = (programTokens.header->GPUPointerSizeInBytes == 4) ? "32" : "64";
109+
110+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize, programTokens.storage));
111+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "." + requiredProductConfig, programTokens.storage));
112+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "." + requiredProduct + "." + requiredStepping, programTokens.storage));
113+
ASSERT_TRUE(encoder.appendFileEntry(requiredPointerSize + "unk." + requiredStepping, programTokens.storage));
114+
115+
NEO::TargetDevice target;
116+
target.coreFamily = static_cast<GFXCORE_FAMILY>(programTokens.header->Device);
117+
target.productConfig = productConfig;
118+
target.stepping = programTokens.header->SteppingId;
119+
target.maxPointerSizeInBytes = programTokens.header->GPUPointerSizeInBytes;
120+
121+
auto arData = encoder.encode();
122+
std::string unpackErrors;
123+
std::string unpackWarnings;
124+
auto unpacked = NEO::unpackSingleDeviceBinary<NEO::DeviceBinaryFormat::Archive>(arData, requiredProduct, target, unpackErrors, unpackWarnings);
125+
EXPECT_NE(0U, unpacked.packedTargetDeviceBinary.size());
126+
}
127+
98128
TEST(UnpackSingleDeviceBinaryAr, WhenMultipleBinariesMatchedThenChooseBestMatch) {
99129
PatchTokensTestData::ValidEmptyProgram programTokens;
100130
const auto &hwInfoConfig = *NEO::HwInfoConfig::get(productFamily);

0 commit comments

Comments
 (0)