2012-07-21 52 views
1

我已經根據經驗測試了塊和線程的多個值,並且可以通過特定值大大減少執行時間。如何調整塊和線程的cuda號以獲得最佳性能

我不明白塊和線程之間有什麼區別。我認爲它可能是一個塊中的線程具有特定的緩存內存,但對我來說很模糊。目前,我將函數並行化爲N個部分,這些部分分配在塊/線程上。

我的目標可能是自動調整關於我要使用的內存大小的塊數和線程數。有可能嗎?謝謝。

+0

優化CUDA很複雜,所以很難自動調整塊和線程的數量 – chaohuang 2012-07-21 14:53:16

+0

受過教育的猜測隨後進行試驗和錯誤。 – 2012-07-21 15:54:35

回答

1

到目前爲止,周鴻舟的回答很好。這裏有一些更詳細的信息:

當使用共享內存時,您可能首先要考慮它,因爲它是一個非常有限的資源,並且內核具有非常特殊的需求並不可能控制並行性的許多變量。 您可能擁有共享較大區域的多個線程的塊或共享較小區域的較少線程的塊(恆定佔用情況下)。

如果你的代碼可以用盡可能少住的每個多處理器共享內存16KB 你可能想選擇更大(48KB)L1-緩存調用

cudaDeviceSetCacheConfig(cudaFuncCachePreferL1); 

另外,L1-緩存可以被禁用使用編譯器選項-Xptxas=-dlcm=cg進行非本地全局訪問,以便在內核仔細訪問全局內存時避免污染。

之前擔心基於佔用你可能還需要檢查 該設備調試支持被關閉CUDA最佳性能> = 4.1(或適當的優化選項中給出,請閱讀我在this thread後一個合適的編譯器 配置)。

現在,我們有一個內存配置和寄存器實際上是積極地使用, 我們可以分析不同的佔用下的性能:

較高的佔有率(每多經紗)的可能性就越小多處理器將不得不等待(用於內存事務或數據依賴性),但線程必須共享相同的L1緩存,共享內存區域和寄存器文件(請參閱CUDA優化指南以及this presentation)。

ABI可以爲可變數量的寄存器生成代碼(更多細節可以在我引用的線程中找到)。然而,在某些情況下,會發生註冊溢出。也就是說,寄存器值暫時存儲在(相對較慢的片外)本地內存堆棧中。

監視探查器中的失速原因,內存統計和算術吞吐量,而 改變啓動界限和參數將幫助您找到合適的配置。

這是理論上可以從一個應用程序中找到的最佳值,但是,具有 客戶端代碼最佳地調整到兩個不同的設備和發射參數 可以是平凡的,將需要重新編譯或內核的不同的變體將被部署爲每個目標設備架構。

0

我有一個很好的答案here,總之,這是計算塊和線程上的最優分佈的一個難題。

1

我相信自動調整塊和線程大小是一個非常困難的問題。如果很容易,CUDA很可能會爲您提供此功能。

原因是因爲最佳配置取決於實現和您正在實施的算法類型。它需要分析和試驗以獲得最佳性能。

以下是您可以考慮的一些限制。

註冊內核中的使用情況。 您當前實施的佔用情況。

注意:擁有更多線程並不等同於最佳性能。通過在應用程序中獲得正確的佔用率並保持GPU內核始終處於忙碌狀態,可以獲得最佳性能。

相關問題