其他人寫的中文 CUDA 文章

前一陣子,Heresy 在找資料的時候,意外的找到了一篇別人寫的中文的 CUDA 教學性文章,他的網址是:

http://www.kimicat.com/cuda簡介

他在網路上的暱稱應該是「Hotball」,以此搜尋,也可以找到他以前的網站(應該是)。Heresy 大概看了一下,他應該也是以圖學為主的,不過看來他對硬體方面的東西,應該比 Heresy 了解不少∼

回來講他的介紹吧∼他對於 CUDA 的介紹分成了四個網頁:

  • CUDA 簡介

    先介紹 GPGPU 的優缺點,然後再介紹 CUDA 的架構、執行模式。

  • 安裝 CUDA

    分為「下載及安裝」和「在 Visual Studio 中使用 CUDA」兩部分。在 VisualStudio 的設定部分,他和 Heresy 所提的使用 nVidia Template使用網路上的 Build Rule 的方法不同,是直接去設定 .cu 檔的「Custom Build Tool」。

  • 第一個 CUDA 程式

    以大量數字的平方和為例子,來寫一個簡單的 CUDA 程式。而在這個例子,其實並沒有使用 GPU many thread 的優勢,而是在 GPU 中以一般迴圈的方法,來完成運算。

  • 改良第一個程式

    針對上一項的平方和程式,逐步的來做最佳化的動作。其步驟依序是:平行化、記憶體存取最佳化、大量平行化。而在此篇文章中,提及了不少針對 cuda 最佳化時,記憶體處理上的概念和方法。


其實 Heresy 個人對於硬體的基本概念是比較缺乏的,所以對於很多硬體相關方面的東西,理解的程度會比較差;而偏偏 CUDA 要最佳化的話,其執行、運作上的硬體架構,又顯得額外重要…所以其實在這方面,對於 Heresy 個人的研究上造成了不少困擾。

而這個網頁的內容,到是提供了 Heresy 不少資訊∼像 Heresy 覺得比較有幫助的概念:

  1. 由於 global memory 並沒有 cache,所以要避開巨大的 latency 的方法,就是要利用大量的 threads。假設現在有大量的 threads 在同時執行,那麼當一個 thread 讀取記憶體,開始等待結果的時候,GPU 就可以立刻切換到下一個 thread,並讀取下一個記憶體位置。因此,理想上當 thread 的數目夠多的時候,就可以完全把 global memory 的巨大 latency 隱藏起來了。
  2. 顯示卡上的記憶體是 DRAM,因此最有效率的存取方式,是以連續的方式存取。前面的程式,雖然看起來是連續存取記憶體位置(每個 thread 對一塊連續的數字計算平方和),但是我們要考慮到實際上 thread 的執行方式。前面提過,當一個 thread 在等待記憶體的資料時,GPU 會切換到下一個 thread。也就是說,實際上執行的順序是類似

thread 0 -> thread 1 -> thread 2 -> …

因此,在同一個 thread 中連續存取記憶體,在實際執行時反而不是連續了。要讓實際執行結果是連續的存取,我們應該要讓 thread 0 讀取第一個數字,thread 1 讀取第二個數字…依此類推。

不過說實話,要能完全理解這些,對 Heresy 來說應該還要一些時間來做實測吧∼ ^^"

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。