CUDA

CUDACompute Unified Device Architecture,统一计算架构[1])是由輝達NVIDIA所推出的一種整合技術,是該公司對於GPGPU的正式名稱。透過這個技術,使用者可利用NVIDIA的GeForce 8以後的GPU和較新的Quadro GPU进行计算。亦是首次可以利用GPU作為C-编译器的开发环境。NVIDIA行銷的時候[2],往往將编译器與架构混合推廣,造成混亂。實際上,CUDA可以相容OpenCL或者自家的C-编译器。無論是CUDA C-語言或是OpenCL,指令最終都會被驅動程式轉換成PTX代碼,交由顯示核心計算。[3]

CUDA
開發者Nvidia
初始版本2007年6月23日2007-06-23
穩定版本
11.2.0
(2020年12月15日2020-12-15
操作系统WindowsmacOSLinux
类型GPGPU
许可协议专有软件
网站developer.nvidia.com/cuda-zone

概要

CUDA处理流例子
1.将主存的处理数据复制入显存中
2. CPU指令驅動GPU
3. GPU每一核心并行處理
4. GPU將显存結果傳回主記憶體

GeForce 8800 GTX为例,其核心擁有128个内处理器。利用CUDA技術,就可以將那些内处理器串通起來,成為线程处理器去解决数据密集的计算。而各個内处理器能够交换、同步和共享数据。利用NVIDIA的C-编译器,通過驱动程式,就能利用这些功能。亦能成為流处理器,讓应用程式利用進行運算。

GeForce 8800 GTX显示卡的运算能力可达到520GFlops,如果建設SLI系统,就可以达到1TFlops。[4]

但程序员在利用CUDA技術時,須分開三种不同的暫存器,要面對繁复的线程层次,编译器亦无法自动完成多数任务,以上問題就会提高开发难度。而目前更新的G100以及更高核心型号已採用第二代的CUDA技術,可提高效率,降低开发难度。

目前,已有軟體廠商利用CUDA技術,研發出Adobe Premiere Pro的插件。通過插件,使用者就可以利用顯示核心去加速H.264/MPEG-4 AVC的编码速度。速度是單純利用CPU作軟體加速的7倍左右。

在NVIDIA收購AGEIA後,NVIDIA取得相關的物理加速技術,即是PhysX物理引擎。配合CUDA技術,顯示卡可以模擬成一顆PhysX物理加速晶片[5]。目前,全系列的GeForce 8顯示核心都支援CUDA。而NVIDIA亦不會再推出任何的物理加速卡,顯示卡將會取代相關產品。

為了將CUDA推向民用,NVIDIA舉行一系列的編程比賽,要求参赛者開發程式,充分利用CUDA的計算潛能。但是,要將GPGPU普及化,還要看微軟能否在Windows作業系統中,提供相關的编程接口。[6]

2008年8月,NVIDIA推出CUDA 2.0[7]。2010年3月22日,NVIDIA推出CUDA 3.0,僅支援Fermi及之後的架構[8]

CUDA是一種由NVIDIA提出的並由其製造的圖形處理單元(GPUs)實現的一種平行計算平臺及程式設計模型。CUDA給程式開發人員提供直接訪問CUDA GPUs中的虛擬指令集和平行計算元件的記憶體。

使用CUDA技術,GPUs可以用來進行通用處理(不僅僅是圖形);這種方法被稱為GPGPU。與CPUs不同的是,GPUs有著側重以較慢速度執行大量併發執行緒的並行流架構,而非快速執行單一執行緒。

軟體發展者可以通過CUDA加速庫,編譯器指令(如OpenACC)以及符合工業標準的程式設計語言(如C,C++和Fortran)擴展對CUDA平臺進行操作。C/C++程式師可以使用“CUDA C/C++”,使用“NVCC”——NVIDIA基於LLVM的C/C++編譯器進行編譯;Fortran程式師可以使用“CUDA Fortran”,使用PGI公司的PGI CUDA Fortran編譯器進行編譯。除了庫、編譯器指令、CUDA C/C++和CUDA Fortran,CUDA平臺還支援其它計算介面,如Khronos Group的OpenCL,Microsoft的DirectCompute,以及C++AMP。其協力廠商封裝也可用於Python,Perl,Fortran,Java,Ruby,Lua,Haskell,MATLAB,IDL及Mathematica的原生支持。

在電腦遊戲行業中,GPUs不僅用於進行圖形渲染,而且用於遊戲物理運算(物理效果如碎片、煙、火、流體),比如PhysX和Bullet。在計算生物學與密碼學等領域的非圖形應用上,CUDA的加速效果達到可以用數量級來表示的程度。

CUDA同時提供底層API與高階API。最初的CUDA軟體發展包(SDK)於2007年2月15日公佈,支持Microsoft Windows和Linux。而後在第二版中加入對Mac OS X的支持,取代2008年2月14日發佈的測試版。所有G8x系列及以後的NVIDIA GPUs皆支援CUDA技術,包括GeForce,Quadro和Tesla系列。CUDA與大多數標準作業系統相容。Nvidia聲明:根據二進位相容性,基於G8x系列開發的程式無需修改即可在未來所有的Nvidia顯卡上運行。

優點

在GPUs(GPGPU)上使用圖形APIs進行傳統通用計算,CUDA技術有下列幾個優點:

  • 分散讀取——代碼可以從記憶體的任意位址讀取
  • 統一虛擬記憶體(CUDA 4)
  • 共用記憶體——CUDA公開一個快速的共用存儲區域(每個處理器48K),使之在多個進程之間共用。其作為一個用戶管理的快取記憶體,比使用紋理查找可以得到更大的有效頻寬。
  • 與GPU之間更快的下載與回讀
  • 全面支持整型與位操作,包括整型紋理查找

限制

  • CUDA不支援完整的C語言標準。它在C++編譯器上運行主機代碼時,會使一些在C中合法(但在C++中不合法)的代碼無法編譯。
  • 不支持紋理渲染(CUDA 3.2及以後版本通過在CUDA陣列中引入“表面寫操作”——底層的不透明資料結構——來進行處理)
  • 受系統主線的頻寬和延遲的影響,主機與設備記憶體之間資料複製可能會導致性能下降(通過過GPU的DMA引擎處理,非同步記憶體傳輸可在一定範圍內緩解此現象)
  • 當執行緒總數為數千時,執行緒應按至少32個一組來運行才能獲得最佳效果。如果每組中的32個進程使用相同的執行路徑,則程式分支不會顯著影響效果;在處理本質上不同的任務時,SIMD執行模型將成為一個瓶頸(如在光線追蹤演算法中遍歷一個空間分割的資料結構)
  • 與OpenCL不同,只有NVIDIA的GPUs支援CUDA技術
  • 由於編譯器需要使用優化技術來利用有限的資源,即使合法的C/C++有時候也會被標記並中止編譯
  • CUDA(計算能力1.x)使用一個不包含遞迴、函數指標的C語言子集,外加一些簡單的擴展。而單個進程必須運行在多個不相交的記憶體空間上,這與其它C語言運行環境不同。
  • CUDA(計算能力2.x)允許C++類功能的子集,如成員函數可以不是虛擬的(這個限制將在以後的某個版本中移除)[參見《CUDA C程式設計指南3.1》-附錄D.6]
  • 雙精度浮點(CUDA計算能力1.3及以上)與IEEE754標準有所差異:倒數、除法、平方根僅支持舍入到最近的偶數。單精確度中不支持反常值(denormal)及sNaN(signaling NaN);只支援兩種IEEE舍入模式(舍位與舍入到最近的偶數),這些在每條指令的基礎上指定,而非控制字碼;除法/平方根的精度比單精確度略低。

显卡的受支持情况

不同 CUDA 版本支持的计算能力列表[9]
CUDA 版本 支持的计算能力 微架构 备注
1.0[10] 1.0 – 1.1 Tesla
1.1 1.0 – 1.1+x Tesla
2.0 1.0 – 1.1+x Tesla
2.1 – 2.3.1[11][12][13][14] 1.0 – 1.3 Tesla
3.0 – 3.1[15][16] 1.0 – 2.0 Tesla, Fermi
3.2[17] 1.0 – 2.1 Tesla, Fermi
4.0 – 4.2 1.0 – 2.1+x Tesla, Fermi
5.0 – 5.5 1.0 – 3.5 Tesla, Fermi, Kepler
6.0 1.0 – 3.5 Tesla, Fermi, Kepler
6.5 1.1 – 5.x Tesla, Fermi, Kepler, Maxwell 最后支持计算能力 1.x (Tesla) 的版本
7.0 – 7.5 2.0 – 5.x Fermi, Kepler, Maxwell
8.0 2.0 – 6.x Fermi, Kepler, Maxwell, Pascal 最后支持计算能力 2.x (Fermi) 的版本;GTX 1070Ti 不受支持
9.0 – 9.2 3.0 – 7.2 Kepler, Maxwell, Pascal, Volta Pascal GTX 1070Ti 不受 CUDA SDK 9.0 支持,但受 CUDA SDK 9.2支持
10.0 – 10.2 3.0 – 7.5 Kepler, Maxwell, Pascal, Volta, Turing 最后支持计算能力 3.x (Kepler) 的版本;CUDA SDK 10.2 是最后能用于 macOS 的官方版本,在未来的版本中 macOS 将不被支持
11.0 – 3.5 - 8.6 Maxwell, Pascal, Volta, Turing, Ampere
不同计算能力对应的显卡列表
计算能力(版本) 微架构 GPU GeForce 系列 Quadro NVS 系列 Tesla 系列 Tegra 系列,
Jetson 系列,
DRIVE 系列
1.0 Tesla G80 GeForce 8800 Ultra, GeForce 8800 GTX, GeForce 8800 GTS(G80) Quadro FX 5600, Quadro FX 4600, Quadro Plex 2100 S4 Tesla C870, Tesla D870, Tesla S870
1.1 G92, G94, G96, G98, G84, G86 GeForce GTS 250, GeForce 9800 GX2, GeForce 9800 GTX, GeForce 9800 GT, GeForce 8800 GTS(G92), GeForce 8800 GT, GeForce 9600 GT, GeForce 9500 GT, GeForce 9400 GT, GeForce 8600 GTS, GeForce 8600 GT, GeForce 8500 GT,
GeForce G110M, GeForce 9300M GS, GeForce 9200M GS, GeForce 9100M G, GeForce 8400M GT, GeForce G105M
Quadro FX 4700 X2, Quadro FX 3700, Quadro FX 1800, Quadro FX 1700, Quadro FX 580, Quadro FX 570, Quadro FX 470, Quadro FX 380, Quadro FX 370, Quadro FX 370 Low Profile, Quadro NVS 450, Quadro NVS 420, Quadro NVS 290, Quadro NVS 295, Quadro Plex 2100 D4,
Quadro FX 3800M, Quadro FX 3700M, Quadro FX 3600M, Quadro FX 2800M, Quadro FX 2700M, Quadro FX 1700M, Quadro FX 1600M, Quadro FX 770M, Quadro FX 570M, Quadro FX 370M, Quadro FX 360M, Quadro NVS 320M, Quadro NVS 160M, Quadro NVS 150M, Quadro NVS 140M, Quadro NVS 135M, Quadro NVS 130M, Quadro NVS 450, Quadro NVS 420,[18] Quadro NVS 295
1.2 GT218, GT216, GT215 GeForce GT 340*, GeForce GT 330*, GeForce GT 320*, GeForce 315*, GeForce 310*, GeForce GT 240, GeForce GT 220, GeForce 210,
GeForce GTS 360M, GeForce GTS 350M, GeForce GT 335M, GeForce GT 330M, GeForce GT 325M, GeForce GT 240M, GeForce G210M, GeForce 310M, GeForce 305M
Quadro FX 380 Low Profile, Quadro FX 1800M, Quadro FX 880M, Quadro FX 380M,
Nvidia NVS 300, NVS 5100M, NVS 3100M, NVS 2100M, ION
1.3 GT200, GT200b GeForce GTX 295, GTX 285, GTX 280, GeForce GTX 275, GeForce GTX 260 Quadro FX 5800, Quadro FX 4800, Quadro FX 4800 for Mac, Quadro FX 3800, Quadro CX, Quadro Plex 2200 D2 Tesla C1060, Tesla S1070, Tesla M1060
2.0 Fermi GF100, GF110 GeForce GTX 590, GeForce GTX 580, GeForce GTX 570, GeForce GTX 480, GeForce GTX 470, GeForce GTX 465,
GeForce GTX 480M
Quadro 6000, Quadro 5000, Quadro 4000, Quadro 4000 for Mac, Quadro Plex 7000,
Quadro 5010M, Quadro 5000M
Tesla C2075, Tesla C2050/C2070, Tesla M2050/M2070/M2075/M2090
2.1 GF104, GF106 GF108, GF114, GF116, GF117, GF119 GeForce GTX 560 Ti, GeForce GTX 550 Ti, GeForce GTX 460, GeForce GTS 450, GeForce GTS 450*, GeForce GT 640 (GDDR3), GeForce GT 630, GeForce GT 620, GeForce GT 610, GeForce GT 520, GeForce GT 440, GeForce GT 440*, GeForce GT 430, GeForce GT 430*, GeForce GT 420*,
GeForce GTX 675M, GeForce GTX 670M, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 720M, GeForce GT 620M, GeForce 710M, GeForce 610M, GeForce 820M, GeForce GTX 580M, GeForce GTX 570M, GeForce GTX 560M, GeForce GT 555M, GeForce GT 550M, GeForce GT 540M, GeForce GT 525M, GeForce GT 520MX, GeForce GT 520M, GeForce GTX 485M, GeForce GTX 470M, GeForce GTX 460M, GeForce GT 445M, GeForce GT 435M, GeForce GT 420M, GeForce GT 415M, GeForce 710M, GeForce 410M
Quadro 2000, Quadro 2000D, Quadro 600,
Quadro 4000M, Quadro 3000M, Quadro 2000M, Quadro 1000M,
NVS 310, NVS 315, NVS 5400M, NVS 5200M, NVS 4200M
3.0 Kepler GK104, GK106, GK107 GeForce GTX 770, GeForce GTX 760, GeForce GT 740, GeForce GTX 690, GeForce GTX 680, GeForce GTX 670, GeForce GTX 660 Ti, GeForce GTX 660, GeForce GTX 650 Ti BOOST, GeForce GTX 650 Ti, GeForce GTX 650,
GeForce GTX 880M, GeForce GTX 780M, GeForce GTX 770M, GeForce GTX 765M, GeForce GTX 760M, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GeForce GTX 660M, GeForce GT 750M, GeForce GT 650M, GeForce GT 745M, GeForce GT 645M, GeForce GT 740M, GeForce GT 730M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 735M, GeForce GT 730M
Quadro K5000, Quadro K4200, Quadro K4000, Quadro K2000, Quadro K2000D, Quadro K600, Quadro K420,
Quadro K500M, Quadro K510M, Quadro K610M, Quadro K1000M, Quadro K2000M, Quadro K1100M, Quadro K2100M, Quadro K3000M, Quadro K3100M, Quadro K4000M, Quadro K5000M, Quadro K4100M, Quadro K5100M,
NVS 510, Quadro 410
Tesla K10, GRID K340, GRID K520
3.2 GK20A Tegra K1,
Jetson TK1
3.5 GK110, GK208 GeForce GTX Titan Z, GeForce GTX Titan Black, GeForce GTX Titan, GeForce GTX 780 Ti, GeForce GTX 780, GeForce GT 640 (GDDR5), GeForce GT 630 v2, GeForce GT 730, GeForce GT 720, GeForce GT 710, GeForce GT 740M (64-bit, DDR3), GeForce GT 920M Quadro K6000, Quadro K5200 Tesla K40, Tesla K20x, Tesla K20
3.7 GK210 Tesla K80
5.0 Maxwell GM107, GM108 GeForce GTX 750 Ti, GeForce GTX 750, GeForce GTX 960M, GeForce GTX 950M, GeForce 940M, GeForce 930M, GeForce GTX 860M, GeForce GTX 850M, GeForce 845M, GeForce 840M, GeForce 830M, GeForce GTX 870M Quadro K1200, Quadro K2200, Quadro K620, Quadro M2000M, Quadro M1000M, Quadro M600M, Quadro K620M, NVS 810 Tesla M10
5.2 GM200, GM204, GM206 GeForce GTX Titan X, GeForce GTX 980 Ti, GeForce GTX 980, GeForce GTX 970, GeForce GTX 960, GeForce GTX 950, GeForce GTX 750 SE,
GeForce GTX 980M, GeForce GTX 970M, GeForce GTX 965M
Quadro M6000 24GB, Quadro M6000, Quadro M5000, Quadro M4000, Quadro M2000, Quadro M5500,
Quadro M5000M, Quadro M4000M, Quadro M3000M
Tesla M4, Tesla M40, Tesla M6, Tesla M60
5.3 GM20B Tegra X1,
Jetson TX1,
Jetson Nano,
DRIVE CX,
DRIVE PX
6.0 Pascal GP100 Quadro GP100 Tesla P100
6.1 GP102, GP104, GP106, GP107, GP108 Nvidia TITAN Xp, Titan X,
GeForce GTX 1080 Ti, GTX 1080, GTX 1070 Ti, GTX 1070, GTX 1060, GTX 1050 Ti, GTX 1050,
GT 1030, MX350, MX330, MX250, MX230, MX150
Quadro P6000, Quadro P5000, Quadro P4000, Quadro P2200, Quadro P2000, Quadro P1000, Quadro P400, Quadro P500, Quadro P520, Quadro P600,
Quadro P5000(Mobile), Quadro P4000(Mobile), Quadro P3000(Mobile)
Tesla P40, Tesla P6, Tesla P4
6.2 GP10B[19] Tegra X2, Jetson TX2, DRIVE PX 2
7.0 Volta GV100 NVIDIA TITAN V Quadro GV100 Tesla V100, Tesla V100S
7.2 GV10B[20] Tegra Xavier,
Jetson Xavier NX,
Jetson AGX Xavier, DRIVE AGX Xavier, DRIVE AGX Pegasus
7.5 Turing TU102, TU104, TU106, TU116, TU117 NVIDIA TITAN RTX,
GeForce RTX 2080 Ti, RTX 2080 Super, RTX 2080, RTX 2070 Super, RTX 2070, RTX 2060 Super, RTX 2060,
GeForce GTX 1660 Ti, GTX 1660 Super, GTX 1660, GTX 1650 Super, GTX 1650
Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Quadro RTX 4000,
Quadro T2000, Quadro T1000
Tesla T4
8.0 Ampere GA100 A100

'*' – 仅限 OEM 产品

详情请参见Nvidia页面存档备份,存于:

應用

利用CUDA技術,配合適當的軟體(例如MediaCoder[21]、Freemake Video Converter),就可以利用顯示核心進行高清视频編碼加速。视频解碼方面,同樣可以利用CUDA技術實現。此前,NVIDIA的顯示核心本身已集成PureVideo單元。可是,實現相關加速功能的一個微軟API-DXVA,偶爾會有加速失效問題。所以利用CoreAVC配合CUDA,變相在顯示核心上實現軟體解碼,解決兼容性問題[22]。另外,配合適當的引擎,顯示核心就可以計算光线跟踪。NVIDIA就放出了自家的Optix实时光线跟踪引擎,透過CUDA技術利用GPU計算光线跟踪[23]

支援的產品

所有基於G80及之後架構的民用與專業顯示卡或運算模組皆支援CUDA技術[24]

示例

下列的範例是如何用C++自GPU的image陣列中取得紋理(texture):

cudaArray* cu_array;
texture<float, 2> tex;

// Allocate array
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaMallocArray(&cu_array, &description, width, height);

// Copy image data to array
cudaMemcpy(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);

// Bind the array to the texture
cudaBindTextureToArray(tex, cu_array);

// Run kernel
dim3 blockDim(16, 16, 1);
dim3 gridDim(width / blockDim.x, height / blockDim.y, 1);
kernel<<< gridDim, blockDim, 0 >>>(d_odata, height, width);
cudaUnbindTexture (tex);

__global__ void kernel(float* odata, int height, int width)
{
   unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
   unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
   float c = tex2D(tex, x, y);
   odata[y*width+x] = c;
}

下列的例子是用Python改寫. Python相關的訊息可取自PyCUDAArchived 2012-03-03 at WebCite.

import pycuda.driver as drv
import numpy
import pycuda.autoinit

mod = drv.SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn (400).astype(numpy.float32)
b = numpy.random.randn (400).astype(numpy.float32)

dest = numpy.zeros_like (a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1))

print dest-a*b

更多的Python的矩陣相乘問題可取自pycublas.

import numpy
from pycublas import CUBLASMatrix
A = CUBLASMatrix(numpy.mat([[1,2,3],[4,5,6]],numpy.float32))
B = CUBLASMatrix(numpy.mat([[2,3],[4,5],[6,7]],numpy.float32))
C = A*B
print C.np_mat()

相關條目

参考文献

  1. . [2010-02-08]. (原始内容存档于2010-02-13).
  2. . [2008-12-26]. (原始内容存档于2008-12-18).
  3. . [2008-12-26]. (原始内容存档于2012-10-17).
  4. 小熊在线-宁道奇. . 小熊在线. [2013-06-18]. (原始内容存档于2013-06-24).
  5. . [2008-05-02]. (原始内容存档于2008-04-17).
  6. . [2008-05-21]. (原始内容存档于2008-05-28).
  7. . [2008-08-26]. (原始内容存档于2008-12-02).
  8. . [2011-05-18]. (原始内容存档于2011-06-29).
  9. . NVIDIA Developer. [2020-07-16]. (原始内容存档于2020-07-09).
  10. (PDF). 2007-06-23 [2020-07-16]. (原始内容存档 (PDF)于2018-04-17).
  11. (PDF). 2008-12-08 [2020-07-16]. (原始内容存档 (PDF)于2020-04-06).
  12. (PDF). 2009-04-02 [2020-07-16]. (原始内容存档 (PDF)于2019-03-06).
  13. (PDF). 2009-05-26 [2020-07-16]. (原始内容存档 (PDF)于2019-09-25).
  14. (PDF). 2009-08-26 [2020-07-16]. (原始内容存档 (PDF)于2012-02-18).
  15. (PDF). 2010-02-20 [2020-07-16]. (原始内容存档 (PDF)于2020-07-29).
  16. (PDF). 2010-07-21 [2020-07-16]. (原始内容存档 (PDF)于2020-06-01).
  17. (PDF). 2010-11-09 [2020-07-16]. (原始内容存档 (PDF)于2020-03-02).
  18. . TechPowerUp GPU Database. [2020-07-16]. (原始内容存档于2020-07-29).
  19. Larabel, Michael. . Phoronix. 2017-03-29 [2017-08-08]. (原始内容存档于2017-08-09).
  20. Nvidia Xavier Specs 页面存档备份,存于 on TechPowerUp (preliminary)
  21. . [2009-09-14]. (原始内容存档于2009-09-18).
  22. . [2009-09-14]. (原始内容存档于2009-11-29).
  23. . [2009-09-14]. (原始内容存档于2009-09-12).
  24. . [2010-04-19]. (原始内容存档于2010-02-18).

外部連結

  • 官方网站
  • 周秉誼. . 台灣大學計算機及資訊網路中心. [2010-12-05]. (原始内容存档于2010-05-16) (中文(繁體)‎).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.