int getOpenCLPlatforms(PlatformsInfo& platforms) { if (!__initialized) initializeOpenCLDevices(); platforms.clear(); for (size_t id = 0; id < global_platforms.size(); ++id) { PlatformInfoImpl& impl = global_platforms[id]; platforms.push_back(&impl.info); } return platforms.size(); }
void checkOpenCL() { PlatformsInfo platforms; getOpenCLPlatforms(platforms); for (size_t p = 0; p < platforms.size(); p++) { DevicesInfo devices; getOpenCLDevices(devices, CVCL_DEVICE_TYPE_GPU, platforms[p]); for (size_t i = 0; i < devices.size(); i++) { const DeviceInfo *info = devices[i]; printf("%s : %s\n", info->deviceName.c_str(), info->deviceVersion.c_str()); } } }
static bool selectOpenCLDevice() { std::string platform; std::vector<std::string> deviceTypes; std::string deviceName; const char* configuration = getenv("OPENCV_OPENCL_DEVICE"); if (configuration) { if (!parseOpenCLDeviceConfiguration(std::string(configuration), platform, deviceTypes, deviceName)) return false; } bool isID = false; int deviceID = -1; if (deviceName.length() == 1) // We limit ID range to 0..9, because we want to write: // - '2500' to mean i5-2500 // - '8350' to mean AMD FX-8350 // - '650' to mean GeForce 650 // To extend ID range change condition to '> 0' { isID = true; for (size_t i = 0; i < deviceName.length(); i++) { if (!isdigit(deviceName[i])) { isID = false; break; } } if (isID) { deviceID = atoi(deviceName.c_str()); CV_Assert(deviceID >= 0); } } const PlatformInfo* platformInfo = NULL; if (platform.length() > 0) { PlatformsInfo platforms; getOpenCLPlatforms(platforms); for (size_t i = 0; i < platforms.size(); i++) { if (platforms[i]->platformName.find(platform) != std::string::npos) { platformInfo = platforms[i]; break; } } if (platformInfo == NULL) { std::cerr << "ERROR: Can't find OpenCL platform by name: " << platform << std::endl; goto not_found; } } if (deviceTypes.size() == 0) { if (!isID) { deviceTypes.push_back("GPU"); deviceTypes.push_back("CPU"); } else { deviceTypes.push_back("ALL"); } } for (size_t t = 0; t < deviceTypes.size(); t++) { int deviceType = 0; if (deviceTypes[t] == "GPU") { deviceType = CVCL_DEVICE_TYPE_GPU; } else if (deviceTypes[t] == "CPU") { deviceType = CVCL_DEVICE_TYPE_CPU; } else if (deviceTypes[t] == "ACCELERATOR") { deviceType = CVCL_DEVICE_TYPE_ACCELERATOR; } else if (deviceTypes[t] == "ALL") { deviceType = CVCL_DEVICE_TYPE_ALL; } else { std::cerr << "ERROR: Unsupported device type for OpenCL device (GPU, CPU, ACCELERATOR): " << deviceTypes[t] << std::endl; goto not_found; } DevicesInfo devices; getOpenCLDevices(devices, deviceType, platformInfo); for (size_t i = (isID ? deviceID : 0); (isID ? (i == (size_t)deviceID) : true) && (i < devices.size()); i++) { if (isID || devices[i]->deviceName.find(deviceName) != std::string::npos) { // check for OpenCL 1.1 if (devices[i]->deviceVersionMajor < 1 || (devices[i]->deviceVersionMajor == 1 && devices[i]->deviceVersionMinor < 1)) { std::cerr << "Skip unsupported version of OpenCL device: " << devices[i]->deviceName << "(" << devices[i]->platform->platformName << ")" << std::endl; continue; // unsupported version of device, skip it } try { setDevice(devices[i]); } catch (...) { std::cerr << "ERROR: Can't select OpenCL device: " << devices[i]->deviceName << "(" << devices[i]->platform->platformName << ")" << std::endl; goto not_found; } return true; } } } not_found: std::cerr << "ERROR: Required OpenCL device not found, check configuration: " << (configuration == NULL ? "" : configuration) << std::endl << " Platform: " << (platform.length() == 0 ? "any" : platform) << std::endl << " Device types: "; for (size_t t = 0; t < deviceTypes.size(); t++) { std::cerr << deviceTypes[t] << " "; } std::cerr << std::endl << " Device name: " << (deviceName.length() == 0 ? "any" : deviceName) << std::endl; return false; }