CUDA是NVIDIA于2006年11月推出的,用于發揮NVIDIA GPU通用計算能力的編程環境,目前支持CUDA C和OpenCL(Open Computing Language)語言,計算效率高,常可加速十幾倍到幾十倍。相比OpenCL和Brook+,CUDAC更易于使用。另外NVIDIA對CUDA的大力支持是其他廠商所不能比擬的。
CUDA認為系統上可以用于計算的硬件包含兩個部分:一個是CPU(稱為主機),一個是GPU(稱為設備),CPU控制/指揮GPU工作,GPU只是CPU的協處理器。目前CUDA只支持NVIDIA的GPU,而CPU由主機端編程環境負責。
CUDA是一種架構,也是一種語言。作為一種架構,它包括硬件的體系結構(G80、GT200、Fermi、Kepler)、硬件的CUDA計算能力及CUDA程序是如何映射到GPU上執行;作為一種語言,CUDA提供了能夠利用GPU計算能力的方方面面的功能。CUDA的架構包括其編程模型、存儲器模型和執行模型。CUDA C語言主要說明了如何定義計算內核(kernel)。CUDA架構在硬件結構、編程方式與CPU體系有極大不同,關于CUDA的具體細節讀者可參考CUDA相關的書籍。
CUDA以C/C++語法為基礎而設計,因此對熟悉C系列語言的程序員來說,CUDA的語法比較容易掌握。另外CUDA只對ANSI C進行了最小的擴展,以實現其關鍵特性:線程按照兩個層次進行組織、共享存儲器(shared memory)和柵欄(barrier)同步。
目前CUDA提供了兩種API以滿足不同人群的需要:運行時API和驅動API。運行時API基于驅動API構建,應用也可以使用驅動API。驅動API通過展示低層的概念提供了額外的控制。使用運行時API時,初始化、上下文和模塊管理都是隱式的,因此代碼更簡明。一般一個應用只需要使用運行時API或者驅動API中的一種,但是可以同時混合使用這兩種。筆者建議優先使用運行時API。
6.2.5 OpenCL
OpenCL(Open Computing Language,開放計算語言),先由Apple設計,后來交由Khronos Group維護,是異構平臺并行編程的開放的標準,也是一個編程框架。Khronos Group是一個非盈利性技術組織,維護著多個開放的工業標準,并且得到了業界的廣泛支持。OpenCL的設計借鑒了CUDA的成功經驗,并盡可能地支持多核CPU、GPU或其他加速器。OpenCL不但支持數據并行,還支持任務并行。同時OpenCL內建了多GPU并行的支持。這使得O