對CUDA內核使用不同的流可以使併發內核執行成爲可能。因此,n
內核上的n
流理論上可以併發運行,如果它們適合硬件,對吧?CUDA並行內核執行,每個流有多個內核
現在我面臨以下問題:沒有n
不同的內核,但n*m
其中m
內核需要按順序執行。例如n=2
和m=3
會導致下面的執行方案與流:
Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>>
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>>
我天真的假設是,內核X.0和Y.1至少應該同時執行(從一個理論點)或不是連續的(從實際的角度來看)。但是我的測量結果告訴我,情況並非如此,似乎是執行了連續執行(即K0.0,K1.0,K2.0,K0.1,K1.1,K2.1)。內核本身非常小,所以併發執行不應該成爲問題。
現在我的方法是完成一種調度,以確保內核以交錯方式進入GPU上的調度器。但是當處理大量的流/內核時,這可能會造成更多的傷害而不是好處。
好吧,直接點:什麼是適當的(或至少不同)的方法來解決這種情況?
編輯:測量通過使用CUDA事件完成。我測量了完全解決計算所需的時間,即GPU必須計算所有的n * m
內核。假設是:在完全併發的內核執行上,執行時間大致(理想情況下)是按順序執行所有內核所需的時間的1/n
倍,因此必須有兩個或多個內核可以同時執行的時間。我現在只用兩種不同的流來確保這一點。
我可以測量使用所描述的流和調度內核交錯的執行時間之間的明顯差異, Ë:
Loop: i = 0 to m
EnqueueKernel(Kernel i.1, Stream 1)
EnqueueKernel(Kernel i.2, Stream 2)
與
Loop: i = 1 to n
Loop: j = 0 to m
EnqueueKernel(Kernel j.i, Stream i)
後者導致更長的運行時間。
編輯#2:更改流號碼開頭1(而不是0,請參閱下面的註釋)。
編輯#3:硬件是NVIDIA的Tesla M2090(即費米,計算能力2.0)
您可能需要使用某些流同步基元來執行您所需的執行順序。但是,您是否可以擴展一些關於如何在您的問題中進行測量的問題,並且您是否還可以確認,在編寫「數據流0」時,您不一定是指CUDA數據流0? – talonmies 2012-02-16 12:42:03
我澄清了測量(至少我希望如此)。對於流,我意指'cudaStream_t'的實例,如[CUDA C編程指南](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)中所述。第3.2.5節(異步併發執行)。 – 2012-02-16 12:57:13
也許你誤解了我的要求 - 我的意思是你的一個流CUDA流0,因爲流0(默認流)是同步的。 – talonmies 2012-02-16 13:09:28