基于CUDA的GPU計(jì)算PI值
訪問(wèn)【W(wǎng)RITE-BUG數(shù)字空間】_[內(nèi)附完整源碼和文檔]
基于CUDA的GPU計(jì)算PI值。本項(xiàng)目使用CUDA編程模型并行計(jì)算PI值,研究GPU與CPU效率的比較,分析不同GPU線程分塊對(duì)性能的影響。
異構(gòu)計(jì)算試驗(yàn)報(bào)告
---實(shí)驗(yàn)1:基于CUDA的GPU計(jì)算PI值
第一部分:實(shí)驗(yàn)環(huán)境
OS:Windows 10
CPU:intel(R) Core(TM) i7-10510U CPU@mailto:CPU@ 1.80Ghz
GPU:NVIDIA GeForce MX250
編譯器: cl :v19.29.30133
nvcc:Cuda compilationn tools, release 11.4, V11.4.120
第二部分:實(shí)驗(yàn)內(nèi)容
使用 CUDA 編程模型并行計(jì)算 PI 值,研究 GPU 與 CPU 效率的比較,分析不同 GPU 線程分塊對(duì)性能的影響
第三部分:實(shí)驗(yàn)原理
數(shù)學(xué)原理為
1 積分求解

編輯切換為居中
2 冪級(jí)數(shù)求解

編輯切換為居中
使用 CUDA 編程模型,程序執(zhí)行過(guò)程為
CUDAMALLOC -> CUDAMEMCPY(HTOD) ->KERNEL->CUDAMEMCPY(DTOH)
在執(zhí)行和函數(shù)時(shí)指定 <<<grid,block>>> 來(lái)控制線程的數(shù)量和結(jié)構(gòu)
第四部分:性能分析
# define N 迭代次數(shù)
1 CPU VS GPU
1.1 單核比較
N = (10001000100)=100M
CPU(thread = 1):4.887(s)
GPU(grid = 1,block=1):用時(shí)過(guò)長(zhǎng)..無(wú)法測(cè)量
1.2 多核比較
首先要發(fā)揮出最大的 CPU 性能,由于機(jī)器的 CPU 是邏輯 8 核的,所以理論上開啟 8 個(gè)線程可以發(fā)揮最大性能。所以我寫了一個(gè) 8 線程并行的程序來(lái)計(jì)算,同樣循環(huán) N=(10001000100)次

編輯切換為居中
可以看出新的時(shí)間為 0.768s 快了不少
(PS:這里的程序是使用 GCC 編譯的,而 CUDA 程序 NVCC 調(diào)用的是 MSCV 的編譯器,Windows 平臺(tái)上 NVCC 不支持 GCC,但是結(jié)果應(yīng)該是差不多的)
2 GPU 性能分析
接下來(lái)就是找出 GPU 的最高性能了。
首先在 grid = 1 下探究 block 里的線程數(shù)對(duì)性能的影響。這里可以直接用 nvprof 分析,非常方便。
2.1 grid = (1,1,1) block = (10,1,1)

編輯切換為居中
一共用時(shí):34.5556s 線程數(shù):10
可以注意到,在本程序中,主要的時(shí)間是消耗在計(jì)算上的,由于沒有什么要拷貝的內(nèi)存,所以瓶頸只會(huì)出現(xiàn)在計(jì)算上
2.2 grid=(1,1,1) block=(100,1,1)

編輯切換為居中
一共用時(shí):2.58383s 線程數(shù):100
2.3 grid=(1,1,1) block=(1000,1,1)

編輯切換為居中
一共用時(shí):1.543s 線程數(shù):1000
每個(gè) block 的最大線程數(shù)限制是 1024,這里就不能再增加 block 了