SWDEV-319375 - Avoid global var size query

Currently COMGR doesn't provide global variable size and runtime
parses ELF binary directly. Avoid parsing for HIP. That can save
5% in hipModuleLoad() time.

Change-Id: I47540d1e957bdb0c2406b6b848222de2920b2504
Этот коммит содержится в:
German Andryeyev
2022-02-23 21:18:35 -05:00
родитель f1d55767a8
Коммит 2664d8cf9e
+34 -30
Просмотреть файл
@@ -2743,36 +2743,47 @@ bool Program::createKernelMetadataMap(void* binary, size_t binSize) {
bool Program::FindGlobalVarSize(void* binary, size_t binSize) {
#if defined(USE_COMGR_LIBRARY)
size_t progvarsTotalSize = 0;
size_t dynamicSize = 0;
size_t progvarsWriteSize = 0;
// HIP doesn't need information about global variable size.
// Hence runtime can skip expensive Elf object creation for parsing
if (!amd::IS_HIP) {
size_t progvarsTotalSize = 0;
size_t dynamicSize = 0;
size_t progvarsWriteSize = 0;
amd::Elf elfIn(ELFCLASSNONE, reinterpret_cast<const char *>(binary), binSize,
nullptr, amd::Elf::ELF_C_READ);
amd::Elf elfIn(ELFCLASSNONE, reinterpret_cast<const char *>(binary), binSize,
nullptr, amd::Elf::ELF_C_READ);
if (!elfIn.isSuccessful()) {
buildLog_ += "Creating input amd::Elf object failed\n";
return false;
}
auto numpHdrs = elfIn.getSegmentNum();
for (unsigned int i = 0; i < numpHdrs; ++i) {
amd::ELFIO::segment* seg = nullptr;
if (!elfIn.getSegment(i, seg)) {
continue;
if (!elfIn.isSuccessful()) {
buildLog_ += "Creating input amd::Elf object failed\n";
return false;
}
// Accumulate the size of R & !X loadable segments
if (seg->get_type() == PT_LOAD && !(seg->get_flags() & PF_X)) {
if (seg->get_flags() & PF_R) {
progvarsTotalSize += seg->get_memory_size();
auto numpHdrs = elfIn.getSegmentNum();
for (unsigned int i = 0; i < numpHdrs; ++i) {
amd::ELFIO::segment* seg = nullptr;
if (!elfIn.getSegment(i, seg)) {
continue;
}
if (seg->get_flags() & PF_W) {
progvarsWriteSize += seg->get_memory_size();
// Accumulate the size of R & !X loadable segments
if (seg->get_type() == PT_LOAD && !(seg->get_flags() & PF_X)) {
if (seg->get_flags() & PF_R) {
progvarsTotalSize += seg->get_memory_size();
}
if (seg->get_flags() & PF_W) {
progvarsWriteSize += seg->get_memory_size();
}
}
else if (seg->get_type() == PT_DYNAMIC) {
dynamicSize += seg->get_memory_size();
}
}
else if (seg->get_type() == PT_DYNAMIC) {
dynamicSize += seg->get_memory_size();
progvarsTotalSize -= dynamicSize;
setGlobalVariableTotalSize(progvarsTotalSize);
if (progvarsWriteSize != dynamicSize) {
hasGlobalStores_ = true;
}
}
@@ -2780,13 +2791,6 @@ bool Program::FindGlobalVarSize(void* binary, size_t binSize) {
buildLog_ += "Error: create kernel metadata map using COMgr\n";
return false;
}
progvarsTotalSize -= dynamicSize;
setGlobalVariableTotalSize(progvarsTotalSize);
if (progvarsWriteSize != dynamicSize) {
hasGlobalStores_ = true;
}
#endif // defined(USE_COMGR_LIBRARY)
return true;
}