From ea22166353290a3e481760a0fcfd820875260d0d Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 22 Aug 2019 12:41:42 -0400 Subject: [PATCH] P4 to Git Change 1987529 by kjayapra@4_HIPWS_RCCM_ROCM on 2019/08/22 12:32:42 SWDEV-200625 - Reverting back CL#1986255. Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/hip_internal.hpp#38 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_module.cpp#35 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_platform.cpp#39 edit --- api/hip/hip_internal.hpp | 14 +----- api/hip/hip_module.cpp | 102 ++++++++++++++------------------------- api/hip/hip_platform.cpp | 59 ++++++++++++---------- 3 files changed, 71 insertions(+), 104 deletions(-) diff --git a/api/hip/hip_internal.hpp b/api/hip/hip_internal.hpp index 7a19813894..0df562065c 100644 --- a/api/hip/hip_internal.hpp +++ b/api/hip/hip_internal.hpp @@ -129,10 +129,6 @@ public: amd::Memory* amd_mem_obj_; }; - struct DeviceModules { - std::vector< std::pair< hipModule_t, bool > >* modules; - }; - struct DeviceFunction { std::string deviceName; std::vector< std::pair< hipModule_t, bool > >* modules; @@ -146,7 +142,6 @@ public: std::vector rvars; }; private: - std::unordered_mapmods_; std::unordered_map functions_; std::unordered_map vars_; @@ -159,11 +154,7 @@ public: return *platform_; } - void registerMod(hipModule_t hmod, const DeviceModules& dmod); - void unregisterMod(hipModule_t hmod); - std::vector< std::pair< hipModule_t, bool > >* findModules(hipModule_t hmod); - - void unregisterVar(std::vector< std::pair >* modules); + void unregisterVar(hipModule_t hmod); void registerVar(const void* hostvar, const DeviceVar& var); void registerFunction(const void* hostFunction, const DeviceFunction& func); @@ -179,9 +170,6 @@ public: void popExec(ihipExec_t& exec); }; -std::vector< std::pair >* ihipModuleLoadModule(const void* image); -bool ihipModuleUnload(std::vector< std::pair >* modules); - extern std::vector g_devices; extern hipError_t ihipDeviceGetCount(int* count); extern int ihipGetDevice(); diff --git a/api/hip/hip_module.cpp b/api/hip/hip_module.cpp index 1a18e1b2dd..3d73891ca3 100644 --- a/api/hip/hip_module.cpp +++ b/api/hip/hip_module.cpp @@ -70,38 +70,27 @@ hipError_t hipModuleLoad(hipModule_t* module, const char* fname) HIP_RETURN(ihipModuleLoadData(module, tmp.data())); } -bool ihipModuleUnload(std::vector< std::pair >* modules) { - - if (modules == nullptr) { - return false; - } - - PlatformState::instance().unregisterVar(modules); - - std::for_each(modules->begin(), modules->end(), [](std::pair module) { - if (module.first != nullptr) { - as_amd(reinterpret_cast(module.first))->release(); - } - }); - - PlatformState::instance().unregisterMod((*modules)[0].first); - delete modules; +bool ihipModuleUnregisterGlobal(hipModule_t hmod) { + PlatformState::instance().unregisterVar(hmod); return true; } -hipError_t hipModuleUnload(hipModule_t hmod) { +hipError_t hipModuleUnload(hipModule_t hmod) +{ HIP_INIT_API(hmod); - std::vector< std::pair >* modules - = PlatformState::instance().findModules(hmod); - if (modules == nullptr) { + if (hmod == nullptr) { HIP_RETURN(hipErrorUnknown); } - if (!ihipModuleUnload(modules)) { + amd::Program* program = as_amd(reinterpret_cast(hmod)); + + if(!ihipModuleUnregisterGlobal(hmod)) { HIP_RETURN(hipErrorUnknown); } + program->release(); + HIP_RETURN(hipSuccess); } @@ -116,19 +105,25 @@ extern bool __hipExtractCodeObjectFromFatBinary(const void* data, const std::vector& devices, std::vector>& code_objs); -bool ihipModuleRegisterGlobal(amd::Program* program, int device_id, - std::vector< std::pair >* modules) { +bool ihipModuleRegisterGlobal(amd::Program* program, hipModule_t* module) { + size_t var_size = 0; + hipDeviceptr_t device_ptr = nullptr; std::vector var_names; device::Program* dev_program - = program->getDeviceProgram(*(g_devices[device_id]->devices()[0])); + = program->getDeviceProgram(*hip::getCurrentContext()->devices()[0]); if (!dev_program->getGlobalVarFromCodeObj(&var_names)) { return false; } for (auto it = var_names.begin(); it != var_names.end(); ++it) { + auto modules = new std::vector >{g_devices.size()}; + for (size_t dev = 0; dev < g_devices.size(); ++dev) { + modules->at(dev) = std::make_pair(*module, false); + } + PlatformState::DeviceVar dvar{nullptr, it->c_str(), 0, modules, std::vector{ g_devices.size()} }; PlatformState::instance().registerVar(it->c_str(), dvar); @@ -137,53 +132,30 @@ bool ihipModuleRegisterGlobal(amd::Program* program, int device_id, return true; } -std::vector< std::pair >* ihipModuleLoadModule(const void* image) { - std::vector devices; +hipError_t ihipModuleLoadData(hipModule_t *module, const void *image) +{ std::vector> code_objs; - for (size_t dev = 0; dev < g_devices.size(); ++dev) { - amd::Context* ctx = g_devices[dev]; - devices.push_back(ctx->devices()[0]->info().name_); + if (__hipExtractCodeObjectFromFatBinary(image, {hip::getCurrentContext()->devices()[0]->info().name_}, code_objs)) + image = code_objs[0].first; + + amd::Program* program = new amd::Program(*hip::getCurrentContext()); + if (program == NULL) { + return hipErrorOutOfMemory; } - if (!__hipExtractCodeObjectFromFatBinary(image, devices, code_objs)) { - return nullptr; - } + program->setVarInfoCallBack(&getSvarInfo); - auto programs = new std::vector< std::pair >{g_devices.size()}; - for (size_t dev = 0; dev < g_devices.size(); ++dev) { - amd::Context* ctx = g_devices[dev]; - amd::Program* program = new amd::Program(*ctx); - if (program == nullptr) { - return nullptr; - } - if (CL_SUCCESS == program->addDeviceProgram(*ctx->devices()[0], code_objs[dev].first, code_objs[dev].second)) { - programs->at(dev) = std::make_pair(reinterpret_cast(as_cl(program)), false); - } - } - - PlatformState::DeviceModules dmod { programs }; - PlatformState::instance().registerMod((*dmod.modules)[0].first, dmod); - - return programs; -} - -hipError_t ihipModuleLoadData(hipModule_t* module, const void* image) { - std::vector< std::pair >* modules = ihipModuleLoadModule(image); - - for (size_t deviceId = 0; deviceId < modules->size(); ++deviceId) { - amd::Program* program = as_amd(reinterpret_cast((*modules)[deviceId].first)); - program->setVarInfoCallBack(&getSvarInfo); - program->build(g_devices[deviceId]->devices(), nullptr, nullptr, nullptr); - (*modules)[deviceId].second = true; - - if (static_cast(ihipGetDevice()) == deviceId) { - *module = reinterpret_cast(as_cl(program)); - } - - if (!ihipModuleRegisterGlobal(program, deviceId, modules)) { + if (CL_SUCCESS != program->addDeviceProgram(*hip::getCurrentContext()->devices()[0], image, ElfSize(image)) || + CL_SUCCESS != program->build(hip::getCurrentContext()->devices(), nullptr, nullptr, nullptr)) { return hipErrorUnknown; - } } + + *module = reinterpret_cast(as_cl(program)); + + if (!ihipModuleRegisterGlobal(program, module)) { + return hipErrorUnknown; + } + return hipSuccess; } diff --git a/api/hip/hip_platform.cpp b/api/hip/hip_platform.cpp index 45f564f00d..dbc1b7fba8 100644 --- a/api/hip/hip_platform.cpp +++ b/api/hip/hip_platform.cpp @@ -139,15 +139,39 @@ extern "C" std::vector< std::pair >* __hipRegisterFatBinary(c return nullptr; } - return ihipModuleLoadModule(fbwrapper->binary); + std::vector devices; + std::vector> code_objs; + for (size_t dev = 0; dev < g_devices.size(); ++dev) { + amd::Context* ctx = g_devices[dev]; + devices.push_back(ctx->devices()[0]->info().name_); } -void PlatformState::unregisterVar(std::vector< std::pair >* modules) { + if (!__hipExtractCodeObjectFromFatBinary((char*)fbwrapper->binary, devices, code_objs)) { + return nullptr; + } + + auto programs = new std::vector< std::pair >{g_devices.size()}; + for (size_t dev = 0; dev < g_devices.size(); ++dev) { + amd::Context* ctx = g_devices[dev]; + amd::Program* program = new amd::Program(*ctx); + if (program == nullptr) { + return nullptr; + } + if (CL_SUCCESS == program->addDeviceProgram(*ctx->devices()[0], code_objs[dev].first, code_objs[dev].second)) { + programs->at(dev) = std::make_pair(reinterpret_cast(as_cl(program)) , false); + } + } + + return programs; +} + +void PlatformState::unregisterVar(hipModule_t hmod) { amd::ScopedLock lock(lock_); auto it = vars_.begin(); while (it != vars_.end()) { DeviceVar& dvar = it->second; - if (dvar.modules == modules) { + if ((*dvar.modules)[0].first == hmod) { + delete dvar.modules; vars_.erase(it++); } else { ++it; @@ -155,28 +179,6 @@ void PlatformState::unregisterVar(std::vector< std::pair >* m } } -void PlatformState::registerMod(hipModule_t hmod, const DeviceModules& rmod) { - amd::ScopedLock lock(lock_); - mods_.insert(std::make_pair(hmod, rmod)); -} - -void PlatformState::unregisterMod(hipModule_t hmod) { - amd::ScopedLock lock(lock_); - auto it = mods_.find(hmod); - if (it != mods_.cend()) { - mods_.erase(it); - } -} - -std::vector< std::pair< hipModule_t, bool > >* PlatformState::findModules(hipModule_t hmod) { - amd::ScopedLock lock(lock_); - const auto it = mods_.find(hmod); - if (it == mods_.cend()) { - return nullptr; - } - return it->second.modules; -} - void PlatformState::registerVar(const void* hostvar, const DeviceVar& rvar) { amd::ScopedLock lock(lock_); @@ -385,7 +387,12 @@ extern "C" void __hipUnregisterFatBinary(std::vector< std::pairbegin(), modules->end(), [](std::pair module){ + if (module.first != nullptr) { + as_amd(reinterpret_cast(module.first))->release(); + } + }); + delete modules; } extern "C" hipError_t hipConfigureCall(