diff --git a/hipamd/src/hip_fatbin.cpp b/hipamd/src/hip_fatbin.cpp index b9d0434673..c18f65397e 100644 --- a/hipamd/src/hip_fatbin.cpp +++ b/hipamd/src/hip_fatbin.cpp @@ -384,11 +384,26 @@ hipError_t FatBinaryInfo::ExtractFatBinaryUsingCOMGR(const std::vector> compiled_co; + for (auto device : devices) { - LogPrintfInfo("Creating ISA for: %s from spir-v", device->devices()[0]->isa().targetId()); + std::string target_id = device->devices()[0]->isa().targetId(); + if (auto code_iter = compiled_co.find(target_id); code_iter != compiled_co.end()) { + // We have already compiled for it, lets reuse the code object + char* co = new char[code_iter->second.second]; + std::memcpy(co, code_iter->second.first, code_iter->second.second); + LogPrintfInfo("reusing code object for: %s", target_id.c_str()); + fatbin_dev_info_[device->deviceId()] = + new FatBinaryDeviceInfo(co, code_iter->second.second, 0); + fatbin_dev_info_[device->deviceId()]->program_ = new amd::Program(*(device->asContext())); + continue; + } + + LogPrintfInfo("Creating ISA for: %s from spirv", target_id.c_str()); amd_comgr_action_info_t reloc_action; - std::string isa = - std::string{"amdgcn-amd-amdhsa--"} + device->devices()[0]->isa().targetId(); + std::string isa = "amdgcn-amd-amdhsa--" + target_id; if (comgr_status = amd::Comgr::create_action_info(&reloc_action); comgr_status != AMD_COMGR_STATUS_SUCCESS) { LogError("Failed to create action"); @@ -524,9 +539,11 @@ hipError_t FatBinaryInfo::ExtractFatBinaryUsingCOMGR(const std::vectordeviceId()] = - new FatBinaryDeviceInfo(co, CodeObject::ElfSize(co), 0); + auto elf_size = CodeObject::ElfSize(co); + fatbin_dev_info_[device->deviceId()] = new FatBinaryDeviceInfo(co, elf_size, 0); fatbin_dev_info_[device->deviceId()]->program_ = new amd::Program(*(device->asContext())); + // Save the compiled code object + compiled_co[target_id] = std::make_pair(co, elf_size); // cleanup (void)amd::Comgr::release_data(exe_data); @@ -534,8 +551,8 @@ hipError_t FatBinaryInfo::ExtractFatBinaryUsingCOMGR(const std::vector