我在GPU設備上創建了2個隊列,並且想要並行執行內核。這不需要在不同隊列中的內核之間設置事件,但是必須按順序執行同一隊列中的內核。另外,I創建了2個CPU線程,每個CPU線程控制1個隊列,並且CPU線程並行執行。現在似乎不同隊列之間的內核並不是並行執行的。所以有人可以給我一些建議嗎?opencl:同一設備上的不同隊列可以並行執行內核嗎?
感謝您的回答。以下是關於我的平臺的一些信息。
有關Driver
鋨:Centos的5.X
我在GPU設備上創建了2個隊列,並且想要並行執行內核。這不需要在不同隊列中的內核之間設置事件,但是必須按順序執行同一隊列中的內核。另外,I創建了2個CPU線程,每個CPU線程控制1個隊列,並且CPU線程並行執行。現在似乎不同隊列之間的內核並不是並行執行的。所以有人可以給我一些建議嗎?opencl:同一設備上的不同隊列可以並行執行內核嗎?
感謝您的回答。以下是關於我的平臺的一些信息。
有關Driver
鋨:Centos的5.X
大多數的GPU不能夠在同一時間運行多個內核。這只是硬件限制,而不是軟件問題。您可以並行執行多個內核,但可以在多個GPU(即多個OpenCL設備)上執行。
無論如何,在您的場景中,無論如何,許多GPU都能夠重疊內存傳輸(CPU < => GPU)和內核執行。這取決於OpenCL驅動程序,但我看到AMD驅動程序重疊來自一個隊列的內存傳輸和另一個隊列的內核執行。
設備上可能只有一個計算單元,會一次執行一個內核。如果是這樣,內核可能必須由主機應用程序分區並交替排隊以允許其「並行」執行。對於CL_DEVICE_MAX_COMPUTE_UNITS
參數,計算單元的數量由clGetDeviceInfo
返回。
如果存在多個計算單元,則設備可以支持分區,如果設備參數CL_DEVICE_PARTITION_MAX_SUB_DEVICES
的值大於1.在這種情況下,設備可以「拆分」爲多個子設備(例如兩個)使用clCreateSubDevices
與單獨的命令隊列。每個子設備將獨立於(並且與其他子設備並行)地執行內核。
請注意,如果需要更優化的負載,則可能需要主機應用程序解決子設備的不平衡負載。