2014-10-01 90 views
0

我希望回答我的問題不需要很多時間,因爲這是關於我對這個主題的理解。CUDA併發執行

所以,問題是關於併發內核執行的塊和網格大小。

首先,讓我告訴我的名片:它是GeForce GTX TITAN,這裏有一些它的特點,我認爲這對於這個問題很重要。

CUDA能力主要/次要版本號:3.5

全局存儲器的總量:6144兆字​​節(6442123264個字節)

(14)多處理器,(192)CUDA內核/ MP:2688個CUDA內核

經大小:32

每個多處理器的最大線程數:2048

的最大數目每塊的讀取數:1024

現在,主要問題:我有一個內核(它執行稀疏矩陣乘法,但它並不重要),我想在一個GPU上同時啓動多個流(!),計算不同的矩陣乘法。 請再次注意同時需求 - 我希望所有內核在一刻開始,並在另一個(所有這些!)完成,所以當這些內核僅部分重疊時的解決方案不能滿足我。 即使我們失去了一些性能,我也希望最大化並行內核的數量也是非常重要的。好吧,讓我們考慮我們已經有了內核,並且我們想用最好的方式指定它的網格和塊大小。

展望卡特性,我們看到它具有14個sm和3.5個性能,允許運行32個併發內核。因此,我在這裏得出的結論是,啓動28個併發內核(每個14個SM兩個)將是最好的決定。第一個問題 - 我在這裏嗎?

現在我們再次想要優化每個內核的塊和網格大小。好吧,讓我們來看看這個特點:

每個多處理器的最大線程數:2048

我的理解是這樣的:如果我們推出一個內核與1024個線程和2個蓋帽,這兩個塊將被同時計算。如果我們啓動一個有1024個線程和4個塊的內核,那麼兩對塊將被一個接一個地計算出來。因此,下一個結論是,啓動28個內核,每個內核有1024個線程也是最好的解決方案 - 因爲這是在每個SM上可以同時執行的唯一方法。第二個問題 - 我在這裏嗎?或者有更好的解決方案如何獲得同時執行?

如果你只說我是對的,這將是非常好的,如果你解釋我錯誤或提出了更好的解決方案,我將非常感激。

感謝您閱讀本文!

+1

CUDA編程模型和您使用的硬件都沒有聲稱它們可以在您請求的指導內執行。編程模型和硬件並不是爲了實現您的目標而設計的。你還沒有說明你爲什麼要強制併發執行。如果這確實是必需的,那麼最好的辦法就是啓動一個可以完成所有工作的單個內核。即使使用單個內核,編程模型也不能保證最佳啓動。 – 2014-10-02 03:16:10

回答

1

關於併發內核已經有很多問題了。你可能會搜索和審查其中的一些。您必須考慮註冊使用情況,塊,線程和共享內存使用情況等。當您不提供有關注冊使用情況或共享內存使用情況的信息時,您的問題不能完全回答。最大化併發內核的部分原因是佔用率問題,所以你應該研究一下。

不過,你想觀察最大的併發內核。正如您已經指出的那樣,即32個。

您有14個SM,每個SM最多可以有2048個線程。每個內核14x2048/32 = 896個線程(即塊/線程/塊)

線程塊大小爲128,即每個內核7個塊。 7個塊* 32個內核=總共224個塊。當我們除以14個SM時,我們得到每個SM 16個塊,恰好匹配spec limit。因此,上面的分析,32個內核,每個內核7個塊,每個塊128個線程,將是分析的範圍,可以僅考慮您提供的數據進行分析。

如果這對你不起作用,我一定要確保我已經解決了concurrent execution的需求,然後關注每個線程或共享內存的寄存器,看看這些情況下這些是否爲限制「佔用」的情況。

老實說,我不抱着很大的希望,你見證你描述的完美場景,但有它。我會喜歡驚訝。僅供參考,如果我試圖做這樣的事情,我一定會在Linux上嘗試它而不是Windows,尤其是考慮到您的顯卡是受Windows下WDDM限制的GeForce顯卡。

你的理解似乎有缺陷。像這樣的語句:

如果我們啓動一個具有1024個線程和2個塊的內核,這兩個塊將被同時計算。如果我們啓動一個有1024個線程和4個塊的內核,那麼兩個塊將會被一個接一個地計算出來

對我來說沒有意義。塊將按照調度程序認爲合適的順序進行計算,但是沒有規定說兩個塊將被同時計算,但是四個塊將被逐個計算。