我打电话给clGetDeviceIDs
,传递一组cl_device_id
并获取所有可能的设备。现在从这个列表中我想删除实际上是主机CPU的设备? 有没有任何傻瓜证明的方式来做到这一点? 由于可能安装了2个完全相同的CPU,因此cl_device_info
在区分2个CPU时可能没有帮助?从OpenCL中获取的设备列表中确定主机CPU?
回答
OpenCL中的1.1和更高版本,可以检查设备和主机必须使用CL_DEVICE_HOST_UNIFIED_MEMORY
与clGetDeviceInfo
统一的存储器子系统。
感谢您的回答! –
看起来像只适用于OpenCL 1.1和1.2; OpenCL 2.0中已弃用[clGetDeviceInfo](https://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/clGetDeviceInfo.html)中的“CL_DEVICE_HOST_UNIFIED_MEMORY”选项。参见[规范](https://www.khronos.org/registry/cl/specs/opencl-2.0.pdf)§F.3;我没有看到弃用的理由,也没有明显的替代。进一步混乱,它仍然出现在[refcard](https://www.khronos.org/registry/cl/sdk/2.0/docs/OpenCL-2.0-refcard.pdf)没有资格。 FYI @Cool_Coder也是如此。 –
试试这个代码,它会给你想要的控制客户端设备。
//See how many platforms do we have
int num_platforms;
int ret = clGetPlatformIDs(0, NULL, &num_platforms)
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
//Collect list of platforms
cl_platform_id *platforms = (cl_platform_id*)calloc(num_platforms, sizeof(cl_platform_id));
ret = clGetPlatformIDs(num_platforms, platforms, NULL);
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
//Collecting list of Devices for every platform
for(int i=0; i<num_platforms; i++){
int num_CPUs, num_GPUs;
cl_device_id *CPUs, *GPUs;
//Get number of CPUs & GPUs on client machine
ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_CPU, 0, NULL, &num_CPUs);
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_GPU, 0, NULL, &num_GPUs);
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
//Allocate memory & collect actual information
CPUs = (cl_device_id*)calloc(num_CPUs, sizeof(cl_device_id);
GPUs = (cl_device_id*)calloc(num_GPUs, sizeof(cl_device_id);
ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_CPU,num_CPUs, CPUs, NULL);
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
ret = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_GPU,num_GPUs, GPUs, NULL);
if(ret != CL_SUCCESS) {fprintf(stderr, "%d\n", ret);}
//Do whatever you want with Devices
....
free(CPUs);
free(GPUs);
}
free(platforms);
来自CPU数组,如果我删除了与主机CPU相对应的cl_device_id,则OpenCL不应该在其上运行任何内核,对吧? –
只是不使用相应的cl_device_id,没有必要删除 –
好,但我怎么确定CPU阵列中的哪个cl_device_id是主机CPU? –
- 1. 单个主机上有多个OpenCL CPU设备?
- 2. OpenCL CPU设备vs GPU设备
- 3. 获取设备主机名
- 4. OpenCL:运行CPU/GPU多个设备
- 5. 如何从我的电脑获取相机设备列表C#
- 6. 无法在Android中使用USB主机获取USB设备列表
- 7. 从Azure IoT Hub获取设备列表
- 8. CPU作为主机,intel HD 4000作为设备1,离散gpu作为设备2在opencl
- 9. Android USB主机从设备读取
- 10. 如何确定OpenCL中的可用设备内存?
- 11. 如何根据Zenoss API中的主机名获取设备uid
- 12. 如何从提交的URL列表中获取主机URL
- 13. 获取特定Adb设备文件夹中的文件列表
- 14. 如何从java中的urls数组列表中获取主机站点列表和每个主机实例?
- 15. OpenCL,管理来自主机的设备缓冲区指针?
- 16. 符合OpenCL标准的CPU/GPU列表
- 17. 如何从OpenCL中的设备发送/读取数据?
- 18. 如何从android设备获取主机名
- 19. 获取Linux中的主板设备ID和BIOS序列号
- 20. 机制,从列表中获取元素
- 21. OpenCL:在多次循环调用内核之后从设备获取INVALID_COMMAND_QUEUE到主机内存传输
- 22. 能从容器中确定Docker主机的主机名吗?
- 23. 从C++的MIDI设备中获取ID
- 24. 如何从android中的真实设备获取手机号码?
- 25. 获取CPU或主板序列号?
- 26. OpenCL在1个CPU设备上的并行性
- 27. 如何从设备文件中获取主号码
- 28. cudaErrorLaunchFailure从设备到主机的cudaMemcpy
- 29. 从设备到主机的cudaMemcpy错误
- 30. 从主中获取随机函数
你认为什么是“主机CPU”?您的主机代码正在执行的CPU *现在* *?除非另有说明,否则SMP系统可以并将重新安排您的进程以随意在另一个CPU上执行。 –
Brian是正确的:操作系统调度所有CPU核心的进程,而OpenCL CPU驱动程序也使用所有CPU核心。因此,从OpenCL获得的任何CPU设备都是您正在运行的CPU。如果你不想运行它,那么只能在GPU和ACCELERATOR设备上运行。 – Dithermaster
但是,如果我没有将内核执行的主机CPU cl_device_id排队,那么OpenCL不应该在其上运行任何内容。我的理解是OpenCL控制运行内核的设备。为什么操作系统会强制设备? –