访问【WRITE-BUG数字空间】_[内附完整源码和文档]
基于CUDA的GPU计算PI值。本项目使用CUDA编程模型并行计算PI值,研究GPU与CPU效率的比较,分析不同GPU线程分块对性能的影响。
异构计算试验报告
<pre class="public-DraftStyleDefault-pre" data-offset-key="cndkn-0-0" style="margin: 1.4em 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 4px; font-size: 0.9em; overflow: auto; padding: 0.88889em; white-space: pre; word-break: normal; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="59olv" data-offset-key="cndkn-0-0" style="margin: 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 0px; font-size: 0.9em; overflow: initial; padding: 0px; white-space: pre; word-break: normal;">
---实验1:基于CUDA的GPU计算PI值
</pre>
</pre>
第一部分:实验环境
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
第二部分:实验内容
使用 CUDA 编程模型并行计算 PI 值,研究 GPU 与 CPU 效率的比较,分析不同 GPU 线程分块对性能的影响
第三部分:实验原理
数学原理为
1 积分求解
[图片上传失败...(image-773e58-1683119399759)]
编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
2 幂级数求解
[图片上传失败...(image-1d049b-1683119399759)]编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
使用 CUDA 编程模型,程序执行过程为
<pre class="public-DraftStyleDefault-pre" data-offset-key="r6kn-0-0" style="margin: 1.4em 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 4px; font-size: 0.9em; overflow: auto; padding: 0.88889em; white-space: pre; word-break: normal; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="59olv" data-offset-key="r6kn-0-0" style="margin: 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 0px; font-size: 0.9em; overflow: initial; padding: 0px; white-space: pre; word-break: normal;">
CUDAMALLOC -> CUDAMEMCPY(HTOD) ->KERNEL->CUDAMEMCPY(DTOH)
</pre>
</pre>
在执行和函数时指定 <<<grid,block>>> 来控制线程的数量和结构
第四部分:性能分析
<pre class="public-DraftStyleDefault-pre" data-offset-key="5jeml-0-0" style="margin: 1.4em 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 4px; font-size: 0.9em; overflow: auto; padding: 0.88889em; white-space: pre; word-break: normal; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="59olv" data-offset-key="5jeml-0-0" style="margin: 0px; overflow-wrap: normal; background: rgb(246, 246, 246); border-radius: 0px; font-size: 0.9em; overflow: initial; padding: 0px; white-space: pre; word-break: normal;">
define N 迭代次数
</pre>
</pre>
1 CPU VS GPU
1.1 单核比较
N = (10001000100)=100M
CPU(thread = 1):4.887(s)
GPU(grid = 1,block=1):用时过长..无法测量
1.2 多核比较
首先要发挥出最大的 CPU 性能,由于机器的 CPU 是逻辑 8 核的,所以理论上开启 8 个线程可以发挥最大性能。所以我写了一个 8 线程并行的程序来计算,同样循环 N=(10001000100)次
[图片上传失败...(image-50a7b7-1683119399759)]
编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
可以看出新的时间为 0.768s 快了不少
(PS:这里的程序是使用 GCC 编译的,而 CUDA 程序 NVCC 调用的是 MSCV 的编译器,Windows 平台上 NVCC 不支持 GCC,但是结果应该是差不多的)
2 GPU 性能分析
接下来就是找出 GPU 的最高性能了。
首先在 grid = 1 下探究 block 里的线程数对性能的影响。这里可以直接用 nvprof 分析,非常方便。
2.1 grid = (1,1,1) block = (10,1,1)
[图片上传失败...(image-a509f4-1683119399759)]
编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
一共用时:34.5556s 线程数:10
可以注意到,在本程序中,主要的时间是消耗在计算上的,由于没有什么要拷贝的内存,所以瓶颈只会出现在计算上
2.2 grid=(1,1,1) block=(100,1,1)
[图片上传失败...(image-420e89-1683119399759)]
编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
一共用时:2.58383s 线程数:100
2.3 grid=(1,1,1) block=(1000,1,1)
[图片上传失败...(image-e8cfe9-1683119399759)]
编辑 切换为居中
<figcaption class="Image-caption is-placeholder Image-captionV2" style="color: rgb(191, 191, 191); font-size: 0.9em; line-height: 1.5; margin-top: 3px; padding: 0px 1em; text-align: center; font-weight: 400;">添加图片注释,不超过 140 字(可选)</figcaption>
一共用时:1.543s 线程数:1000
每个 block 的最大线程数限制是 1024,这里就不能再增加 block 了