并行計算
并行計算的目的:利用多核或多個計算機來減少程序運行的時間。
基本思路:將一個復(fù)雜的大問題,分解成多個子問題,然后并行或并發(fā)地處理多個子問題。
并行編程通常要考慮兩個方面:
1.Computer architecture (hardware aspect)
2.Parallel programming (software aspect)
早期的時候,一個芯片上只有一個核,現(xiàn)在是一個芯片上多個核multicore。
并行化
1.任務(wù)并行化(多個任務(wù)或者多個函數(shù)間相互獨立,可以同時執(zhí)行)
2.數(shù)據(jù)并行化(不同的數(shù)據(jù)塊可以同時處理)
數(shù)據(jù)并行化
1.塊劃分
2.循環(huán)劃分

塊劃分和循環(huán)劃分可以想象成分蘋果,比如有四個蘋果,分給四個人,塊劃分就是每個人吃一個蘋果,循環(huán)劃分就是每個人吃每個蘋果的四分之一。

計算結(jié)構(gòu)
1.單指令單數(shù)據(jù)
2.單指令多數(shù)據(jù)(多個cores在不同的數(shù)據(jù)流上執(zhí)行相同的指令)
3.多指令單數(shù)據(jù)
4.多指令多數(shù)據(jù)
不同的體系機構(gòu)都應(yīng)該考慮3個指標(biāo)
1.降低延遲(從開始到結(jié)束的執(zhí)行時間)
2.提高帶寬(單位時間內(nèi)讀取或?qū)懭氲臄?shù)據(jù)量)
3.提高吞吐量(單位時間內(nèi)完成的單精度或雙精度計算量)

CPU的大部分晶體管都進行了邏輯控制,更注重延遲,GPU更注重吞吐量,CPU的一個Core計算很快,相當(dāng)于是一個出租車,計算很快,GPU的一個Core計算能力不如CPU,但是GPU勝在有成百上千的Core,GPU相當(dāng)于公交車,雖然速度慢,但是一次可載的人多,計算的吞吐量更高。
異構(gòu)計算
同構(gòu):相同的體系結(jié)構(gòu),比如Spark集群。
異構(gòu):不同體系結(jié)構(gòu)的,比如CPU+GPU。
異構(gòu)應(yīng)用程序包含兩部分:host(主機)串行代碼+device(GPU)并行代碼。
NVIDIA’s GPU computing platform
- Tegra(嵌入式、移動端)
- GeForce(消費級顯卡)
- Quadro(專業(yè)的圖形處理)
- Tesla(通用并行計算)
影響GPU計算能力的要素
- Number of CUDA cores
- Memory size
描述GPU的計算能力: - Peak computational performance(單雙精度計算/s)
-
Memory bandwidth((read/store)/s)
Fermi&Kepler
計算能力(數(shù)字并不能真實的反應(yīng)計算能力)
- Kepler class architecture is major version number 3.
- Fermi class architecture is major version number 2.
- Tesla class architecture is major version number 1.
程序的并行性能
- 并行程度
- 數(shù)據(jù)集的大小
CUDA程序結(jié)構(gòu)
- 分配GPU上的顯存
- 傳輸數(shù)據(jù)CPU到GPU
- 啟動kernel函數(shù),GPU并行計算
- 傳輸數(shù)據(jù)GPU到CPU
- 釋放GPU顯存
編寫CUDA程序要考慮2個局部性
- 時間局部性(線程的層次)
- 空間局部性(存儲器的層次)
example
__global__ void helloFromGPU()
{
printf("Hello World from GPU!\n");
}
int main(int argc, char **argv)
{
printf("Hello World from CPU!\n");
helloFromGPU<<<1, 10>>>();
CHECK(cudaDeviceReset());
return 0;
}
編譯和運行
$ nvcc -arch sm_20 hello.cu -o hello
$ ./hello
如果去掉了cudaDeviceReset()輸出結(jié)果為空。
參考書籍:CUDA C Programing
