我打電話給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控制運行內核的設備。爲什麼操作系統會強制設備? –