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
This commit is contained in:
foreman
2019-08-22 12:41:42 -04:00
parent 15685fcc88
commit ea22166353
3 changed files with 71 additions and 104 deletions
+1 -13
View File
@@ -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<RegisteredVar> rvars;
};
private:
std::unordered_map<hipModule_t, DeviceModules >mods_;
std::unordered_map<const void*, DeviceFunction > functions_;
std::unordered_map<std::string, DeviceVar > 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<hipModule_t, bool> >* 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<hipModule_t, bool> >* ihipModuleLoadModule(const void* image);
bool ihipModuleUnload(std::vector< std::pair<hipModule_t, bool> >* modules);
extern std::vector<amd::Context*> g_devices;
extern hipError_t ihipDeviceGetCount(int* count);
extern int ihipGetDevice();
+37 -65
View File
@@ -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<hipModule_t, bool> >* modules) {
if (modules == nullptr) {
return false;
}
PlatformState::instance().unregisterVar(modules);
std::for_each(modules->begin(), modules->end(), [](std::pair<hipModule_t, bool> module) {
if (module.first != nullptr) {
as_amd(reinterpret_cast<cl_program>(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<hipModule_t, bool> >* modules
= PlatformState::instance().findModules(hmod);
if (modules == nullptr) {
if (hmod == nullptr) {
HIP_RETURN(hipErrorUnknown);
}
if (!ihipModuleUnload(modules)) {
amd::Program* program = as_amd(reinterpret_cast<cl_program>(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<const char*>& devices,
std::vector<std::pair<const void*, size_t>>& code_objs);
bool ihipModuleRegisterGlobal(amd::Program* program, int device_id,
std::vector< std::pair<hipModule_t, bool> >* modules) {
bool ihipModuleRegisterGlobal(amd::Program* program, hipModule_t* module) {
size_t var_size = 0;
hipDeviceptr_t device_ptr = nullptr;
std::vector<std::string> 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<std::pair<hipModule_t, bool> >{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<PlatformState::RegisteredVar>{ 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<hipModule_t, bool> >* ihipModuleLoadModule(const void* image) {
std::vector<const char*> devices;
hipError_t ihipModuleLoadData(hipModule_t *module, const void *image)
{
std::vector<std::pair<const void*, size_t>> 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<hipModule_t, bool> >{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<hipModule_t>(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<hipModule_t, bool> >* modules = ihipModuleLoadModule(image);
for (size_t deviceId = 0; deviceId < modules->size(); ++deviceId) {
amd::Program* program = as_amd(reinterpret_cast<cl_program>((*modules)[deviceId].first));
program->setVarInfoCallBack(&getSvarInfo);
program->build(g_devices[deviceId]->devices(), nullptr, nullptr, nullptr);
(*modules)[deviceId].second = true;
if (static_cast<size_t>(ihipGetDevice()) == deviceId) {
*module = reinterpret_cast<hipModule_t>(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<hipModule_t>(as_cl(program));
if (!ihipModuleRegisterGlobal(program, module)) {
return hipErrorUnknown;
}
return hipSuccess;
}
+33 -26
View File
@@ -139,15 +139,39 @@ extern "C" std::vector< std::pair<hipModule_t, bool> >* __hipRegisterFatBinary(c
return nullptr;
}
return ihipModuleLoadModule(fbwrapper->binary);
std::vector<const char*> devices;
std::vector<std::pair<const void*, size_t>> 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<hipModule_t, bool> >* modules) {
if (!__hipExtractCodeObjectFromFatBinary((char*)fbwrapper->binary, devices, code_objs)) {
return nullptr;
}
auto programs = new std::vector< std::pair<hipModule_t, bool> >{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<hipModule_t>(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<hipModule_t, bool> >* 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::pair<hipModule_t, boo
{
HIP_INIT();
ihipModuleUnload(modules);
std::for_each(modules->begin(), modules->end(), [](std::pair<hipModule_t, bool> module){
if (module.first != nullptr) {
as_amd(reinterpret_cast<cl_program>(module.first))->release();
}
});
delete modules;
}
extern "C" hipError_t hipConfigureCall(