愛悠閑 > CUDA簡介

CUDA簡介

分類: GPU  |  作者: zhucunzeng 相關  |  發布日期 : 2015-01-22  |  熱度 : 95°

 CUDA學習,http://www.dgvxxj.live/catalog/p-127978.html

隨著顯卡的發展,GPU越來越強大,而且GPU為顯示圖像做了優化。在計算上已經超越了通用的CPU。如此強大的芯片如果只是作為顯卡就太浪費了,因此NVidia推出CUDA,讓顯卡可以用于圖像渲染和計算以外的目的(例如這里提到的通用并行計算)CUDA即Compute Unified Device Architecture,是NVidia利用GPU平臺進行通用并行計算的一種架構,它包含了CUDA指令集架構(ISA)以及GPU內部的并行計算引擎。開發人員可以利用C言、OpenCLFortranc++等為CUDA架構編寫程序。它們同CUDA之間的關系如下圖所示:


上圖就很好的反映出了CUDA與應用程序接口(API)以及各種語言編譯器的關系,其中的DX11計算也就是Direct Compute包括CUDA自家編譯器所采用的C語言擴展、OpenCL應用程序接口、Fortran甚至C++等都可以運行在CUDA架構之上,未來CUDA還將支持更多的語言。在整個產業的共同推動下,GPU計算可謂是前途無量! 

      從CUDA體系結構的組成來說,它包含了三個部分:開發庫、運行期環境和驅動。

(1)開發庫是基于CUDA技術所提供的應用開發庫。  

(2)運行期環境提供了應用開發接口和運行期組件,包括基本數據類型的定義和各類計算、類型轉換、內存管理、設備訪問和執行調度等函數。

(3)驅動部分是CUDA-enableGPU的設備抽象層,提供硬件設備的抽象訪問接口。CUDA提供運行期環境也是通過這一層來實現各種功能的。目前于CUDA開發的應用必須有NVIDIA CUDA-enable的硬件支持CPU,GPU,應用程序,CUDA開發庫,運行環境,驅動之間的關系如下圖所示:


在 CUDA 的架構下,一個程序分為兩個部份:host 端和 device 端。Host 端是指在 CPU 上執行的部份,而 device 端則是在顯示芯片(GPU)上執行的部份。Device 端的程序又稱為 "kernel"。通常 host 端程序會將數據準備好后,復制到顯卡的內存中,再由顯示芯片執行 device 端程序,完成后再由 host 端程序將結果從顯卡的內存中取回。由于 CPU 存取顯卡內存時只能透過 PCI Express 接口,因此速度較慢(PCI Express x16 的理論帶寬是雙向各 4GB/s),因此不能經常進行這類動作,以免降低效率。 


在 CUDA 架構下,顯示芯片執行時的最小單位是 thread。數個thread 可以組成一個 block。一個 block 中的 thread 能存取同一塊共享的內存,而且可以快速進行同步的動作。不同 block 中的 thread 無法存取同一個共享的內存,因此無法直接互通或進行同步。因此,不同 block 中的 thread 能合作的程度是比較低的。不過,利用這個模式,可以讓程序不用擔心顯示芯片實際上能同時執行的 thread 數目限制。例如,一個具有很少量執行單元的顯示芯片,可能會把各個 block 中的 thread 順序執行,而非同時執行。不同的 grid 則可以執行不同的程序(即 kernel)。Grid、block 和 thread 的關系,如下圖所示:


每個 thread 都有自己的一份 register 和 local memory 的空間。同一個 block 中的每個 thread 則有共享的一份 share memory。此外,所有的 thread(包括不同 block 的 thread)都共享一份 global memory、constant memory、和 texture memory。不同的 grid 則有各自的 global memory、constant memory 和 texture memory。如下圖所示:


由于顯示芯片大量并行計算的特性,它處理一些問題的方式,和一般 CPU 是不同的。主要的特點包括:

1. 內存存取 latency (等待時間)的問題:CPU 通常使用 cache 來減少存取主內存的次數,以避免內存 latency 影響到執行效率。顯示芯片則多半沒有 cache(或很小),而利用并行化執行的方式來隱藏內存的 latency(即,當第一個 thread 需要等待內存讀取結果時,則開始執行第二個 thread,依此類推)。 

2. 分支指令的問題:CPU 通常利用分支預測等方式來減少分支指令造成的 pipeline(流水線) bubble。顯示芯片則多半使用類似處理內存 latency 的方式。不過,通常顯示芯片處理分支的效率會比較差。 

       因此,最適合利用 CUDA 處理的問題,是可以大量并行化的問題,才能有效隱藏內存的 latency,并有效利用顯示芯片上的大量執行單元。使用 CUDA 時,同時有上千個 thread 在執行是很正常的。因此,如果不能大量并行化的問題,使用 CUDA 就沒辦法達到最好的效率了。在這個過程中,CPU擔任的工作為控制 GPU執行,調度分配任務,并能做一些簡單的計算,而大量需要并行計算的工作都交給 GPU 實現。另外需要注意的是,由于 CPU 存取顯存時只能通過 PCI-Express 接口,速度較慢,因此不能經常進行,以免降低效率。通常可以在程序開始時將數據復制進GPU顯存,然后在 GPU內進行計算,直到獲得需要的數據,再將其復制到系統內存中。



同類文章:GPU
快乐彩中奖说明