std::pair<std::vector<cl::Context>, std::vector<command_queue>> queue_list(DevFilter &&filter, cl_command_queue_properties properties = 0) { std::vector<cl::Context> context; std::vector<command_queue> queue; std::vector<cl::Platform> platforms; cl::Platform::get(&platforms); for(auto p = platforms.begin(); p != platforms.end(); p++) { std::vector<cl::Device> device; std::vector<cl::Device> dev_list; p->getDevices(CL_DEVICE_TYPE_ALL, &dev_list); for(auto d = dev_list.begin(); d != dev_list.end(); d++) { if (!d->getInfo<CL_DEVICE_AVAILABLE>()) continue; if (!filter(*d)) continue; device.push_back(*d); } if (device.empty()) continue; for(auto d = device.begin(); d != device.end(); d++) try { context.push_back(cl::Context(std::vector<cl::Device>(1, *d))); queue.push_back(command_queue(context.back(), *d, properties)); } catch(const cl::Error&) { // Something bad happened. Better skip this device. } } return std::make_pair(context, queue); }
std::vector<cl::Device> device_list(DevFilter&& filter) { std::vector<cl::Device> device; std::vector<cl::Platform> platforms; cl::Platform::get(&platforms); for(auto p = platforms.begin(); p != platforms.end(); p++) { std::vector<cl::Device> dev_list; p->getDevices(CL_DEVICE_TYPE_ALL, &dev_list); for(auto d = dev_list.begin(); d != dev_list.end(); d++) { if (!d->getInfo<CL_DEVICE_AVAILABLE>()) continue; if (!filter(*d)) continue; device.push_back(*d); } } return device; }