2014-03-06 48 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? –

相關問題