2011-08-11 18 views
6

我正在研究一個算法,可以做很多次相同的操作。由於該操作由一些線性代數(BLAS)組成,因此我將嘗試使用GPU進行此操作。opencl命令隊列如何工作,我可以問些什麼

我寫了我的內核,並開始在命令隊列上推送內核。由於每次打電話後我都不想等待,我想我會試着用事件串聯我的電話,然後開始在隊列中推送這些電話。

call kernel1(return event1) 
call kernel2(wait for event 1, return event 2) 
... 
call kernel1000000(vait for event 999999) 

現在的問題是,是否所有這一切被推到做驅動程序存儲區的隊列圖形芯片?它對我可以使用的事件的數量或者命令隊列的長度有一個限制,我查看過但我一直無法找到它。

我正在使用atMonitor來檢查我的GPU的利用率,並且很難將它推到20%以上,這可能是因爲我無法以足夠快的速度將呼叫推出去嗎?我的數據已經存儲在GPU上,我傳遞的所有內容都是實際的通話。

回答

4

首先,除非下一個內核對前一個內核具有數據依賴性,否則不應該等待先前內核的事件。設備利用率(通常)取決於隊列中總是有一些準備就緒的東西。只有在需要等待事件時纔等待事件。

「是否所有這些都被推送到驅動程序存儲隊列的圖形芯片?」

這是實現定義的。請記住,OpenCL不僅僅在GPU上工作!就CUDA風格的設備/主機二分法而言,您應該在「主機」上考慮命令隊列操作(對於大多數實現)。

嘗試排隊多個內核調用,而不用等待它們之間的等待。另外,請確保您使用的是最佳工作組大小。如果你這樣做,你應該能夠最大化你的設備。

1

不幸的是,我不知道所有問題的答案,你也讓我現在也想知道同樣的事情,但我可以說我懷疑OpenCL隊列將會變得完整,因爲你的GPU應該完成執行提交至少20條命令之前的最後一個排隊命令。這只是如果你的GPU有一個「看門狗」,因爲這會阻止可執行的長內核(我認爲5秒或更長)的荒謬可笑。

+0

好的,你能告訴我你從哪裏知道嗎?我試圖找出opencl的實際規格,但它並不容易(我正在考慮切換到CUDA)。 你說什麼,驅動程序捆綁的命令,並將它們發送到大塊的GPU? –

+1

我認爲驅動程序根據OpenCL文檔clFinish塊自動捆綁命令,直到傳入的命令隊列中的所有命令都已完成執行,因此除非您調用clFinish OpenCL將決定何時執行命令。然而,呼叫clFinish是昂貴的,應該避免,但我仍然會嘗試。您是否認爲您的GPU可能足夠快以執行您的計算,而不需要100%的功率?我唯一能想到的另一件事是OpenCL限制了GPU的使用,所以你的電腦顯示屏不會鎖定 –

相關問題