cl_device_id get_gpu_device()
{
cl_uint nr_platforms = 0;
opencl_check(clGetPlatformIDs(0, nullptr, &nr_platforms));//get available platforms
assert(nr_platforms > 0);
std::vector<cl_platform_id> platform_ids(nr_platforms);
printf("%s(%d)\n", __FILE__, __LINE__);
opencl_check(clGetPlatformIDs(nr_platforms, platform_ids.data(), nullptr));//initialize specific platform
#if DEBUG_EN
printf(" number platform %d\n", nr_platforms);
#endif
cl_uint nr_devices = 0;
std::vector<cl_device_id> device_ids;
cl_device_id device;
for (auto pid : platform_ids)
{
#if DEBUG_EN
printf(" platform id %d\n", pid);
#endif
opencl_check(clGetDeviceIDs(pid, CL_DEVICE_TYPE_GPU, 0, nullptr,
&nr_devices));//get available devices of specific platform
if (!nr_devices) {
#if DEBUG_EN
printf(" platform id %d is not GPU\n", pid);
#endif
continue;
}
device_ids.resize(nr_devices);
opencl_check(clGetDeviceIDs(pid, CL_DEVICE_TYPE_GPU, nr_devices,
device_ids.data(), nullptr));//initialize the specific device
#if DEBUG_EN
printf("pid %d nr_devices %d \n", pid, nr_devices);
#endif
break;
}
printf("gpu devices number : %d\n", device_ids.size());
device = device_ids[0];
return device;
}