CUDA 學習(二十一) 優化策略6 資源競爭

2021-07-24 05:50:33 字數 1719 閱讀 3160

一、識別瓶頸

分析瓶頸工具:

(1)、visual profiler

對已實現的**進行分析,我們首先可以考慮的就是sdk 中提供的那些分析工具。比如,nvidia visual profile。這是一款多平台的工具。它能指出在我們核心中哪些是錯誤的,並告訴我們該如何改進。

(2)、parallel nsight

儘管visual profiler 很好用,但遺憾的是,它只能為我們提供這麼多的資訊。如果想進一步得到一些分析資訊,則需要更高階的分析工具,例如 parallel nsight。 parallel nsight 是一款僅支援windows 平台的視覺化分析器與偵錯程式。parallel nsight 是一款比visual profiler 更為深入分析工具。它會展示更多有關核心的資訊以及核心做了哪些工作。

二、解析瓶頸

以下三種常見型別的瓶頸: (1)、pci-e 傳輸瓶頸;(2)、記憶體頻寬瓶頸;(3)、計算瓶頸

1、pci-e 傳輸瓶頸

pci-e 傳輸瓶頸往往是需要考慮的乙個關鍵因素。pci-e 匯流排頻寬是有限的,pci-e 2.0 的匯流排頻寬最高可達到約5gb/s,但這也依賴於主機端硬體。然而,要實現這個峰值,則需要使用鎖頁記憶體並且資料傳輸的大小必須適當。在乙個計算機節點增加更多的gpu 通常會降低總體頻寬,但卻實現了gpu 的數量的增加。

壓縮技術是一種可以明顯增加pci-e 傳輸速率硬限制的技術。

使用流使計算與資料傳輸重疊進行或使用「零複製記憶體」技術。當pci-e 的傳輸時間超過核心執行時間時,使用這種技術可以完全隱藏計算時間。

2、記憶體瓶頸

接下來需要考慮的問題是全域性記憶體的記憶體頻寬。從時間和功率消耗的角度來看,移動資料的開銷是非常大的。因此,考慮高效的資料訪問以及資料重用是在選擇乙個合適演算法的基本標準。

當考慮記憶體時,也需要考慮執行緒間的合作問題,而且執行緒合作最好限制在單一的執行緒塊內。假設執行緒通訊侷限於小範圍的通用演算法比假設每個執行緒可以與所有執行緒對話的通用演算法更有用。

儘管需要大量的記憶體事務,記憶體合併還是實現高記憶體吞吐量的關鍵。在費公尺和克卜勒結構的裝置上,當使用32位數值時獲取全部頻寬需要整個gpu幾乎完全充滿執行緒,不存在任何空閒(每個sm 駐村48-64個執行緒束,即處理1536-2048個執行緒)。通過使用各種向量型別增加事務處理規模,從而優化指令並行及記憶體頻寬。對於許多程式而言,每個執行緒處理4個元素比處理乙個元素的效果好。

3、計算瓶頸

(1)、複雜性

儘管gpu 有巨大的計算吞吐量,但仍有許多超出了gpu 的計算能力範圍。由於使用了快取,通過將一級快取的大小設定為48kb 並且不使用共享記憶體,成功地消除了大量複雜的控制複雜性。複雜性的消除通常有助於對涉及計算邊界的核心進行加速優化。

(2)、指令吞吐量

所有計算能力的計算機幾乎都能實現每個執行緒、每個時鐘週期執行一條指令的吞吐量。記住,是每個執行緒。若按絕對數目計算,則需要用每個執行緒束包含的執行緒乘以每個sm 同時處理的執行緒束在乘以gpu 上sm 的數目。

(3)、同步和原子操作

在許多演算法中都需要同步點。乙個執行緒執行同步的開銷並不大,但卻會潛在地影響效能。除非每個執行緒塊包含的執行緒數特別多,否則cuda 排程程式會試圖使每個sm 最大的限度地排程更多執行緒塊,即每個sm 排程處理16個執行緒塊。隨著每個執行緒塊執行緒數量的增加,sm 能夠排程的執行緒數量也相應減少。這並不會對執行緒造成很糟的影響,但如果結合同步,則可導致sm阻塞。

(4)、控制流

分支產生的每種可能的情況都需要單獨執行,因此會對執行時間產生嚴重影響。編譯器意識到這一點後,於是使用了一種名為分支斷定技術。

CUDA 學習(二十) 優化策略5 演算法

一 概述 如果要考慮演算法,我們需要先思考如下問題 1 如何將問題分解成塊或片,然後如何將這些塊分解成執行緒 2 執行緒如何訪問資料以及產生什麼樣的記憶體模式 3 演算法總共要執行多少工作以及序列化的實現方法有何顯著不同 二 排序 可用的排序演算法有很多,其中有一些可以輕鬆 高效地在gpu 上實現,...

python 學習筆記(二十一)

coding utf8 author liwei windows平台多程序匯入multiprocessing模組 from multiprocessing import process,queue from multiprocessing import pool import os,time,ran...

Linux學習(二十一) 執行緒

每個程序都有自己單獨的位址空間,這樣在程序切換的時候開銷就會比較大,為了提高系統的效能,許多作業系統規範裡引入了輕量級程序的概念,也被稱為執行緒。在同乙個程序中建立的執行緒共享該程序的位址空間。函式原型 int pthread create pthread t thread,const pthrea...