天天看點

CUDA實踐指南(二)

在支援CUDA的裝置上運作什麼?

确定應用程式的哪些部分在裝置上運作時應考慮以下問題:

該裝置非常适合可同時并行運作在多個資料元素上的計算。 這通常涉及大資料集(例如矩陣)的算術,其中可以同時在數千甚至數百萬個元素上執行相同的操作。 這是CUDA良好性能的要求:軟體必須使用大量(通常為數千或數萬)并發線程。 并行運作大量線程的支援來自CUDA使用上述輕量級線程模型。

為了獲得最佳性能,裝置上運作的相鄰線程應該在記憶體通路方面保持一緻。 某些記憶體通路模式使硬體能夠将多個資料項的讀取或寫入組合成一個操作。 無法合理布局的資料或者沒有足夠的位置來有效使用L1或紋理緩存的資料在CUDA計算中使用時會看到較小的加速比。

要使用CUDA,必須将資料值從主機傳輸到PCI Express(PCIe)總線上的裝置。 這些傳輸在性能方面成本很高,應該盡量減少。 (請參閱主機和裝置之間的資料傳輸)此成本有幾個影響:

操作的複雜性應該證明将資料移入和移出裝置的成本。 傳輸資料以供少量線程短暫使用的代碼将很少或沒有性能優勢。 理想的情況是許多線程執行大量工作。

例如,将兩個矩陣轉移到器件以執行矩陣加法,然後将結果傳回主機将不會獲得太多的性能好處。這裡的問題是每個傳輸的資料元素執行的操作次數。對于前面的程式,假定大小為N×N的矩陣,有$N^{2}$個操作(加法)和$3N^{2}$個元素被傳送,是以操作與傳送元素的比率為1:3或O(1)。當這個比例更高時,可以更容易實作性能優勢。例如,相同矩陣的矩陣乘法需要$N^{2}$運算(乘加),是以運算元素與傳輸元素的比值為O(N),在這種情況下,矩陣越大,性能優勢越大。操作類型是一個附加因素,因為添加具有不同的複雜度配置檔案,例如三角函數。在确定是在主機上還是在裝置上執行操作時,包括向裝置傳輸資料和從裝置傳輸資料的開銷很重要。

資料應盡可能長時間儲存在裝置上。 因為傳輸應該盡可能小,是以在同一資料上運作多個核心的程式應該傾向于在核心調用之間将資料留在裝置上,而不是将中間結果傳輸到主機,然後将它們發送回裝置進行後續計算。 是以,在前面的例子中,如果以前的計算結果已經将兩個矩陣添加到裝置上,或者如果在一些後續計算中将使用相加結果,則矩陣相加應該在本地執行 裝置。 即使計算序列中的某個步驟可以在主機上更快地執行,也應該使用此方法。 如果避免一個或多個PCIe傳輸,即使是相對較慢的核心也可能是有利的。 主機和裝置之間的資料傳輸提供了更多細節,包括主機和裝置之間以及裝置本身内的帶寬的測量。

繼續閱讀