2014-03-06 87 views
1

我打电话给clGetDeviceIDs,传递一组cl_device_id并获取所有可能的设备。现在从这个列表中我想删除实际上是主机CPU的设备? 有没有任何傻瓜证明的方式来做到这一点? 由于可能安装了2个完全相同的CPU,因此cl_device_info在区分2个CPU时可能没有帮助?从OpenCL中获取的设备列表中确定主机CPU?

+2

你认为什么是“主机CPU”?您的主机代码正在执行的CPU *现在* *?除非另有说明,否则SMP系统可以并将重新安排您的进程以随意在另一个CPU上执行。 –

+0

Brian是正确的:操作系统调度所有CPU核心的进程,而OpenCL CPU驱动程序也使用所有CPU核心。因此,从OpenCL获得的任何CPU设备都是您正在运行的CPU。如果你不想运行它,那么只能在GPU和ACCELERATOR设备上运行。 – Dithermaster

+0

但是,如果我没有将内核执行的主机CPU cl_device_id排队,那么OpenCL不应该在其上运行任何内容。我的理解是OpenCL控制运行内核的设备。为什么操作系统会强制设备? –

回答

1

OpenCL中的1.1和更高版本,可以检查设备和主机必须使用CL_DEVICE_HOST_UNIFIED_MEMORYclGetDeviceInfo统一的存储器子系统。

+0

感谢您的回答! –

+0

看起来像只适用于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也是如此。 –

1

试试这个代码,它会给你想要的控制客户端设备。

//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); 
+0

来自CPU数组,如果我删除了与主机CPU相对应的cl_device_id,则OpenCL不应该在其上运行任何内核,对吧? –

+0

只是不使用相应的cl_device_id,没有必要删除 –

+0

好,但我怎么确定CPU阵列中的哪个cl_device_id是主机CPU? –

相关问题