第六篇:GPU 並行優化的幾種典型策略


前言

       如何對現有的程序進行並行優化,是 GPU 並行編程技術最為關注的實際問題。本文將提供幾種優化的思路,為程序並行優化指明道路方向。

優化前准備

       首先,要明確優化的目標 - 是要將程序提速 2 倍?還是 10 倍?100倍?也許你會不假思索的說當然是提升越高越好。

       但這里存在一個優化成本的問題。在同樣的技術水平硬件水平下,提升 2 倍也許只要一個下午的工作量,但提高 10 倍可能要考慮到更多的東西,也許是一周的工作量。提高 100 倍, 1000 倍需要的成本,時間就更多了。

       然后,需要將這個問題進行分解。通常來說先對數據集進行分解,然后將任務進行分解。這里要從數據集這樣的矩陣角度來分析數據,將輸入集和輸出集中各個格點的對應關系找出來,然后分派給各個塊,各個線程。

策略一:識別代碼中的瓶頸所在

       分析程序效率的瓶頸所在一方面靠的是分析。這種方式對於代碼結構比較簡單的程序非常有用,但對於實際應用中的復雜項目,人腦分析往往會導致錯誤的結論 - 也許你費盡心思想出來了瓶頸,然后對它做了優化,之后卻發現效率僅僅提升了 1%。

       因此更有效的方法是使用分析工具來找出瓶頸,可以使用 CUDA Profiler 或者 Parallel Nsight。

       使用 Parallel Nsight 分析並行程序的方法請參考我的這篇文章:(准備中...)

       還有一點要特別說明的是,在 GPU 進行數據處理的時候,CPU 可以考慮做點別的事情,比如去服務器取數之類的,這樣就將 CPU 並行和 GPU 並行結合起來了,程序效率自然會大大提高。

策略二:合理的利用內存

       首先,要靈活的使用顯卡中的各類內存結構,如共享內存,常量內存等。特別要注意共享內存的使用,它的速度可是接近一級緩存的。

       此外,必要時對多個內核函數進行融合。因為這樣可以避免啟動新的內核函數時需要進行的數據傳遞問題,還可以重用前面的任務遺留下的一些有用的數據。不過,如果是對別人寫的多個內核函數進行融合的話,一定要注意其中隱含的同步問題 - 上個內核函數的代碼徹底執行完畢之后,下個內核函數才會開始執行。

       然后,對於數據的訪問應該采取合並訪問的方式 - 盡量使用 cudaMalloc 函數。一次訪問的數據應當大於 128 字節,這樣才能充分地利用顯卡的帶寬。

策略三:傳輸過程的優化

       前面的文章已經提到過很多次了,數據在內存和顯存之間進行交換是非常費時的。

       對於這樣的問題,首先我們可以以鎖頁內存的方式使用主機端內存。所謂鎖頁內存,是指該區域內存和顯卡的傳遞不需要 CPU 來干預,如果某區域不聲明為鎖頁內存,那么在內存往顯存中或者顯存往內存中傳遞數據前,會發生一些開銷不小的鎖定操作(表示該區域內存正在和顯存發生數據傳遞,CPU勿擾)。

       使用方法是調用 cudaHostAlloc 函數。這個函數的功能不單單是聲明鎖頁內存那么簡單。通過設置函數的參數,該函數還能實現很多非常實用的功能,個人非常推薦。

       然后,還需要重點推薦的是零復制內存。它是一種特殊的鎖頁內存,一種特殊的內存映射。它允許你將主機內存映射到 GPU 的內存空間。如果你的程序是計算密集型的,那么這個機制就會非常有用,它會自動將數據傳輸和計算重疊。具體用法請參考我的這 篇文章。

策略四:線程結構布局的優化

       建立科學的計算網格,通過設定合適的維數,塊數,以及塊內線程數來盡量實現合並的內存訪問,保證最大的內存帶寬。

       要學會靈活使用多維度的計算網格,而不是僅僅局限於一維。多維計算網格的使用請參考我的這篇文章。

       尤其在單維度的塊數受到限制的時候,多維網格就必須被考慮進來了。

策略五:從算法本身進行任務級的分解

       將算法的步驟分解各個不相關的部分,步驟內采用GPU並行,這幾個步驟則采用CPU並行。

策略六:靈活使用 CUDA C 的一些庫還有 API

       CUDA C 提供了很多實用的 API,且提供相當多的C++支持 (非全部)。能大大地提高開發效率。如原子操作函數等等,很方便。

       CUDA 提供了許多實用的庫:如 cuBlas cuSparse等,不在此一一介紹。尤其是 Thrust 庫,簡直就是 STL 的並行實現,拿來直接用非常方便。

小結

       優化思路可以說是 CUDA 並行編程最為核心,也是最為關鍵所在。

       本文僅僅是提供優化的總體策略和思路,至於具體的實現方法,請參考相關資料實現之。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM