我希望回答我的問題不需要很多時間,因爲這是關於我對這個主題的理解。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上可以同時執行的唯一方法。第二個問題 - 我在這裏嗎?或者有更好的解決方案如何獲得同時執行?
如果你只說我是對的,這將是非常好的,如果你解釋我錯誤或提出了更好的解決方案,我將非常感激。
感謝您閱讀本文!
CUDA編程模型和您使用的硬件都沒有聲稱它們可以在您請求的指導內執行。編程模型和硬件並不是爲了實現您的目標而設計的。你還沒有說明你爲什麼要強制併發執行。如果這確實是必需的,那麼最好的辦法就是啓動一個可以完成所有工作的單個內核。即使使用單個內核,編程模型也不能保證最佳啓動。 – 2014-10-02 03:16:10