1、CPU和GPU的硬件結構和架構
CPU具有復雜的控制硬件和較少的數據計算硬件,復雜的控制硬件在性能上提供了CPU的靈活性和一個簡單的編程接口,但就功耗而言,這是昂貴的。GPU具有簡單的控制硬件和更多的數據計算硬件,使其具有並行計算的能力,這種結構使得它更節能。
一般來說任何硬件架構的性能都是根據延遲和吞吐量來度量的。延遲是完成給定任務所花費的時間,而吞吐量是在給定時間內完成任務的數量。這兩個概念並不矛盾,通常情況下提高一個,另一個也會隨之提高。在某種程度上,大多數硬件架構旨在提高延遲或吞吐量。比如,從一個地方到240公里以外的另一個地方。你可以開一輛容納5人的汽車,時速60公里,或者開一輛能容納40人的公交車,時速40公里。汽車單次只需要花費4個小時,延遲比公交車的單次6小時更低,但平均每小時只能輸送1.2人,而公交車平均每小時可以輸送6.66人,吞吐量更高。
正常的串行CPU被設計為優化延遲,而GPU被設計為優化吞吐量。要想在相同的鍾速度和功率要求下提高計算性能,可以通過並行計算。GPU通過許多簡單的計算單元並行工作來提供這種能力。為了與CPU交互,並利用其並行計算能力,需要一個由CUDA提供的並行編程架構。
2、CUDA構架
所有的GPU都有許多被稱為核心(Core)的並行處理單元。在硬件方面,這些核心被稱為流處理器和流多處理器。GPU有這些流多處理器的網格。在軟件方面,CUDA程序是作為一系列並行運行的多線程(Thread)來執行的。每個線程都在不同的核心上執行。可以將GPU看作多個快(Block)的組合,每個塊可以執行多個線程。每個塊綁定到GPU上不同的流多處理器。
稱CPU及內存為主機(Host),GPU及其內存稱為設備(Device)。CUDA代碼包含主機和設備代碼。只是這段代碼是在大量內核上並行執行的。
CUDA C程序的開發步驟如下:
1)為主機和設備顯存中的數據分配內存;
2)將數據從主機內存復制到設備顯存;
3)通過指定並行度來啟動內核;
4)所有線程完成以后,將數據從設備顯存復制會主機內存
5)釋放主機和設備上使用的所有內存。
3、一個基本的CUDA C程序
#include<iostream> __global__ void myfirstkernel(void) { } int main(void) { myfirstkernel << <1, 1 >> > (); printf("Hello, CUDA!\n"); return 0; }
__global__是CUDA C在標准C中添加的一個限定符,它告訴編譯器在這個限定符后面的函數定義應該在設備上而不是在主機中運行。main函數沒有被global關鍵字修飾,因此main函數將在主機上運行。
對於空的myfirstkernel函數的調用有一些尖括號和數值表示:從主機代碼調用設備代碼,稱為內核調用。數字表示塊的數量和將在設備上並行運行的線程數。上面的例子中<< <1, 1 >> >表示myfirstkernel將在設備上第一個塊和一個線程或塊上。