【CUDA】學(xué)習(xí)記錄(1)-異構(gòu)編程

并行計算

并行計算的目的:利用多核或多個計算機來減少程序運行的時間。
基本思路:將一個復(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)劃分可以想象成分蘋果,比如有四個蘋果,分給四個人,塊劃分就是每個人吃一個蘋果,循環(huán)劃分就是每個人吃每個蘋果的四分之一。


二維數(shù)據(jù)的情況

計算結(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 vs GPU

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計算能力的要素

  1. Number of CUDA cores
  2. Memory size
    描述GPU的計算能力:
  3. Peak computational performance(單雙精度計算/s)
  4. Memory bandwidth((read/store)/s)


    Fermi&Kepler

計算能力(數(shù)字并不能真實的反應(yīng)計算能力)

  1. Kepler class architecture is major version number 3.
  2. Fermi class architecture is major version number 2.
  3. Tesla class architecture is major version number 1.

程序的并行性能

  1. 并行程度
  2. 數(shù)據(jù)集的大小

CUDA程序結(jié)構(gòu)

  1. 分配GPU上的顯存
  2. 傳輸數(shù)據(jù)CPU到GPU
  3. 啟動kernel函數(shù),GPU并行計算
  4. 傳輸數(shù)據(jù)GPU到CPU
  5. 釋放GPU顯存

編寫CUDA程序要考慮2個局部性

  1. 時間局部性(線程的層次)
  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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容