2016-06-08 75 views
0

我從頭創建了CUDA的掃描算法,並嘗試將其用於小於80,000字節的較小數據量。內核調用CUDA上的流延遲

創建了兩個單獨的實例,其中一個在可能的情況下使用流運行內核,另一個只在默認流中運行。

我觀察到的是,對於這個數據大小範圍,與其他方法相比,運行流需要更長的時間來完成任務。

當使用nvprofiler分析,什麼觀察到的是,對數據大小較小的量,在數據流上運行將不會單獨kernals

提供並行沒有流 Scan Without Streams

隨着流 Scan With Streams

但是當數據大小增加時,某種並行性可能是ob tained

隨着流爲400,000bytes With Streams for 400,000

我的問題是,是否有一些額外的參數,以減少這個內核調用時間延遲或者是正常的,有這種更小的數據大小的行爲,其中使用流是不利的

UPDATE:

我已經包括了運行時API調用的時間表,以及明確的答案

With Streams with the Runtime API

回答

2

一般來說你的數據太小,無法充分利用你的第一種情況下的GPU。如果您在nvvp中查看'運行時API'的時間線,而您沒有在圖中顯示,則會發現啓動一個內核需要幾微秒。如果流13中的第一個內核太短,流14中的第二個內核可能還沒有啓動,因此跨流沒有並行性。

由於這些開銷,如果數據很小,您可能會發現在CPU上運行程序甚至更快。

+0

這就是我所懷疑的。仍然從時間線上我可以看到第二個內核的cudaLaunch API調用在第一個內核的執行結束之前結束。因此技術上仍然可以在第一個內核完成之前運行第二個內核。我希望是否有可能將API cudaLaunch時間縮短到實際的內核執行時間。但我認爲,正如你所提到的,這個啓動時間對於執行時間來說是相當高的,因爲數據量很小 而你在CPU數據量較低的情況下勝過GPU的事實是正確的。謝謝 – BAdhi