P4 to Git Change 1341072 by lmoriche@lmoriche_opencl_dev on 2016/11/14 19:13:03

SWDEV-107400 - [OCL-ROCm] GPU_DEVICE_ORDINAL and GPU_DEVICE_NAME implementation missing for the ROCm device
	- Implemented device selection

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#26 edit


[ROCm/clr commit: a4deb0f9b4]
Этот коммит содержится в:
foreman
2016-11-14 19:21:01 -05:00
родитель a88b6d38ef
Коммит 25efc6f7b0
+110 -81
Просмотреть файл
@@ -335,93 +335,15 @@ hsa_status_t Device::iterateAgentCallback(hsa_agent_t agent, void *data) {
if (dev_type == HSA_DEVICE_TYPE_CPU) {
Device::cpu_agent_ = agent;
return HSA_STATUS_SUCCESS;
}
gpu_agents_.push_back(agent);
assert(dev_type == HSA_DEVICE_TYPE_GPU);
Device *roc_device = new Device(agent);
if (!roc_device) {
LogError("Error creating new instance of Device on then heap.");
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
else if (dev_type == HSA_DEVICE_TYPE_GPU) {
gpu_agents_.push_back(agent);
}
uint32_t pci_id;
HsaDeviceId deviceId = getHsaDeviceId(agent, pci_id);
if (deviceId == HSA_INVALID_DEVICE_ID) {
LogError(" Invalid HSA device");
return HSA_STATUS_ERROR_INVALID_AGENT;
}
//Find device id in the table
unsigned sizeOfTable = sizeof(DeviceInfo) / sizeof(AMDDeviceInfo);
uint id;
for (id = 0; id < sizeOfTable; id++) {
if (DeviceInfo[id].hsaDeviceId_ == deviceId){
break;
}
}
//If the AmdDeviceInfo for the HsaDevice Id could not be found return false
if (id == sizeOfTable) {
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
roc_device->deviceInfo_ = DeviceInfo[id];
roc_device->deviceInfo_.pciDeviceId_ = pci_id;
// Query the agent's ISA name to fill deviceInfo.gfxipVersion_. We can't
// have a static mapping as some marketing names cover multiple gfxip. For
// example a Fiji could be 8.0.3 or 8.0.4. Same for Polaris11 and Polaris12.
hsa_isa_t isa = {0};
if (hsa_agent_get_info(agent, HSA_AGENT_INFO_ISA, &isa)
!= HSA_STATUS_SUCCESS) {
return HSA_STATUS_ERROR;
}
uint32_t isaNameLength = 0;
if (hsa_isa_get_info(isa, HSA_ISA_INFO_NAME_LENGTH, 0, &isaNameLength)
!= HSA_STATUS_SUCCESS) {
return HSA_STATUS_ERROR;
}
char *isaName = (char*)alloca((size_t)isaNameLength + 1);
if (hsa_isa_get_info(isa, HSA_ISA_INFO_NAME, 0, isaName)
!= HSA_STATUS_SUCCESS) {
return HSA_STATUS_ERROR;
}
isaName[isaNameLength] = '\0';
std::string str(isaName);
std::vector<std::string> tokens;
size_t end, pos = 0;
do {
end = str.find_first_of(':', pos);
tokens.push_back(str.substr(pos, end-pos));
pos = end + 1;
} while (end != std::string::npos);
assert(tokens.size() == 5 && tokens[0] == "AMD" && tokens[1] == "AMDGPU");
uint major = atoi(tokens[2].c_str());
uint minor = atoi(tokens[3].c_str());
uint stepping = atoi(tokens[4].c_str());
assert(minor < 10 && stepping < 10 && "Invalid ISA string");
roc_device->deviceInfo_.gfxipVersion_ = major * 100 + minor * 10 + stepping;
if (!roc_device->mapHSADeviceToOpenCLDevice(agent)) {
LogError("Failed mapping of HsaDevice to Device.");
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
if (!roc_device->create()) {
LogError("Error creating new instance of Device.");
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
roc_device->registerDevice(); // no return code for this function
return HSA_STATUS_SUCCESS;
}
bool Device::init() {
#if defined(__linux__)
if (amd::Os::getEnvironment("HSA_ENABLE_SDMA").empty()) {
@@ -446,6 +368,113 @@ bool Device::init() {
return false;
}
std::vector<bool> selectedDevices;
selectedDevices.resize(gpu_agents_.size(), true);
if (!flagIsDefault(GPU_DEVICE_ORDINAL)) {
std::fill(selectedDevices.begin(), selectedDevices.end(), false);
std::string ordinals(GPU_DEVICE_ORDINAL);
size_t end, pos = 0;
do {
end = ordinals.find_first_of(',', pos);
size_t index = atoi(ordinals.substr(pos, end-pos).c_str());
selectedDevices.resize(index+1);
selectedDevices[index] = true;
pos = end + 1;
} while (end != std::string::npos);
}
size_t ordinal = 0;
for (auto agent : gpu_agents_ ) {
Device *roc_device = new Device(agent);
if (!roc_device) {
LogError("Error creating new instance of Device on then heap.");
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
uint32_t pci_id;
HsaDeviceId deviceId = getHsaDeviceId(agent, pci_id);
if (deviceId == HSA_INVALID_DEVICE_ID) {
LogPrintfError("Invalid HSA device %x", pci_id);
continue;
}
//Find device id in the table
uint id = HSA_INVALID_DEVICE_ID;
for (uint i = 0; i < sizeof(DeviceInfo) / sizeof(AMDDeviceInfo); ++i) {
if (DeviceInfo[i].hsaDeviceId_ == deviceId){
id = i;
break;
}
}
//If the AmdDeviceInfo for the HsaDevice Id could not be found return false
if (id == HSA_INVALID_DEVICE_ID) {
LogPrintfWarning("Could not find a DeviceInfo entry for %d", deviceId);
continue;
}
roc_device->deviceInfo_ = DeviceInfo[id];
roc_device->deviceInfo_.pciDeviceId_ = pci_id;
// Query the agent's ISA name to fill deviceInfo.gfxipVersion_. We can't
// have a static mapping as some marketing names cover multiple gfxip.
hsa_isa_t isa = {0};
if (hsa_agent_get_info(agent, HSA_AGENT_INFO_ISA, &isa)
!= HSA_STATUS_SUCCESS) {
continue;
}
uint32_t isaNameLength = 0;
if (hsa_isa_get_info(isa, HSA_ISA_INFO_NAME_LENGTH, 0, &isaNameLength)
!= HSA_STATUS_SUCCESS) {
continue;
}
char *isaName = (char*)alloca((size_t)isaNameLength + 1);
if (hsa_isa_get_info(isa, HSA_ISA_INFO_NAME, 0, isaName)
!= HSA_STATUS_SUCCESS) {
continue;
}
isaName[isaNameLength] = '\0';
std::string str(isaName);
std::vector<std::string> tokens;
size_t end, pos = 0;
do {
end = str.find_first_of(':', pos);
tokens.push_back(str.substr(pos, end-pos));
pos = end + 1;
} while (end != std::string::npos);
assert(tokens.size()==5 && tokens[0]=="AMD" && tokens[1]=="AMDGPU");
uint major = atoi(tokens[2].c_str());
uint minor = atoi(tokens[3].c_str());
uint stepping = atoi(tokens[4].c_str());
assert(minor < 10 && stepping < 10 && "Invalid ISA string");
roc_device->deviceInfo_.gfxipVersion_ = major*100 + minor*10 + stepping;
if (!roc_device->mapHSADeviceToOpenCLDevice(agent)) {
LogError("Failed mapping of HsaDevice to Device.");
delete roc_device;
continue;
}
if (!roc_device->create()) {
LogError("Error creating new instance of Device.");
delete roc_device;
continue;
}
if (selectedDevices[ordinal++] && (flagIsDefault(GPU_DEVICE_NAME)
|| GPU_DEVICE_NAME == 0 || GPU_DEVICE_NAME[0] == '\0'
|| !strcmp(GPU_DEVICE_NAME, roc_device->info_.name_))) {
roc_device->registerDevice(); // no return code for this function
}
else {
delete roc_device;
}
}
return true;
}