作业三:基于CUDA编程——加速和优化N体模拟器
本次作业重点关注使用CUDA编程实现N体模拟器的加速计算。N体模拟器是在物理和天文学中必不可少的工具,可以预测通过引力相互作用的物体在三维空间中的个别运动。目前基于CPU的实现(实验材料中的01-nbody.cu
文件),虽然功能上是可行的,但面临着显著的性能限制:模拟4,096个天体大约需要5秒,而65,536个天体则需要约20分钟的计算时间。
GPU的并行计算能力可以显著提升N体模拟器的性能。本次作业的目标是体验使用CUDA GPU加速技术优化N体模拟器。本次作业提供了以下两种基于CUDA的加速实现:
nbody_parallel.cu
:基于CUDA的实现,加入了并行设计,性能较好。nbody_shared.cu
:基于CUDA的实现,在并行设计的基础上,加入了共享内存,性能更好。
实验材料
- 代码:下载
作业代码核心文档
为便于同学们快速理解N体问题的实现,我们提供了代码实现关键逻辑的介绍。
- 天体结构(第15-18行):表示一个具有位置坐标
(x, y, z)
和速度分量(vx, vy, vz)
的天体。 randomizeBodies
函数(第25-31行):随机初始化所有天体的位置和速度。bodyForce
函数(第38-64行):计算作用于每个天体上的引力并更新其速度。- 主函数(第66-158行):
- 初始化:分配内存并初始化对象位置和速度。
- 模拟循环:调用
bodyForce
计算引力并更新速度,根据更新后的速度更新天体的位置。
作业步骤
- 环境配置 (10%)
**提示:**如果你在本系作业的GPU集群上发生GPU相关报错,请执行:
nvidia-smi
如果你发现:
Failed to initialize NVML: Unknown Error
请在备份好数据(基于你初次登陆服务器以后的改动),然后私信助教Jiayi,帮忙重启服务器。
本次作业需要使用CUDA编程,因此需要配置nvcc
编译器。
- 对于在本系列作业专属的GPU集群上,CUDA环境已经配置完毕,可以通过导入如下环境变量来使用CUDA编程:
export PATH=/usr/local/cuda-12.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH
- 对于在其他GPU集群上,需要自行配置CUDA环境。以下是使用Anaconda配置CUDA环境的步骤:
conda install nvidia/label/cuda-12.4.0::cuda
export CUDA_HOME=$CONDA_PREFIX
得分点: 成功配置CUDA环境
- 基线运行 (20%):
- 编译原始CPU代码
nvcc -std=c++11 -o nbody 01-nbody.cu
- 编译nbody_parallel.cu,这是基础的GPU加速版本
nvcc -arch=sm_80 -o nbody_GPU_basic nbody_parallel.cu
- 编译nbody_shared.cu, 这是做了内存优化的GPU加速版本
nvcc -arch=sm_80 -o nbody_GPU_shared nbody_shared.cu
- 执行编译后的代码,默认是4096个body
./nbody
./nbody_GPU_basic
./nbody_GPU_shared
得分点: 成功编译和运行代码,在报告中记录初始基线代码的执行时间
- 性能分析与理解 (30%)
- 哪几行代码的修改,使得
nbody_parallel.cu
比01-nbody.cu
执行快?为什么? nbody_shared.cu
比nbody_parallel.cu
执行快多少倍,为什么?- 哪几行代码的修改,使得
nbody_shared.cu
比nbody_parallel.cu
执行快?为什么? nbody_shared.cu
比01-nbody.cu
执行快多少倍,为什么?
评价标准为:
- 回答的正确性
- 回答与课程讲授内容的契合度
得分点: 上述问题每问的得分上限为10%,总得分上限为30%,在报告中言简意赅地回答上述问题。
- 参数分析与优化 (40%)
该部分需要同学们分析如下内容:
- 分析
nbody_parallel.cu
中BLOCK_SIZE
的取值对性能的影响。 - 分析
nbody_shared.cu
中BLOCK_SIZE
、BLOCK_STRIDE
的取值对性能的影响。
建议: CUDA提供了内置的GPU分析工具Nsight Compute,同学们可以尝试使用该工具分析代码性能。
在命令行终端输入
ncu
即可查看该工具。分析后的结果将保存在服务器上,同学们可以自行下载至本地进行可视化分析。同学们可以参考用户文档学习使用该工具。由于该工具使用有难度,不强制要求同学们使用。使用该工具且分析得当,可适当获得加分。
评价标准为:
- 回答的正确性
- 是否进行了系统级的分析
- 是否进行了内核级的分析
- 是否对系统级和内核级的分析进行了对比
得分点: 上述问题每问的得分上限为20%,总得分上限为40%,在报告中言简意赅地回答上述问题。
- 代码优化以及其他Bonus Points (20%)
- 加速优化:在进行完上述分析后,同学们可以尝试查阅CUDA文档,使用其他优化方法,进一步优化代码,例如在保持相同运行时长的情况下,减少内存访问次数,减少内存拷贝次数,减少内核启动次数等。
- 深入理解:同学们可以尝试搜索更多参数,例如,分析在不同加速方法、加速参数设定下,计算耗时、显存占用随着天体数量变化的趋势,分析不同加速方法的性能瓶颈,分析不同加速方法的适用场景等。
- 其他Bonus Points:同学们可以尝试在其他方面挖掘本次作业与课程内容相关的问题,助教将根据同学们回答的新颖度、深度和广度进行评分。
参考资料
- NVIDIA CUDA文档:https://docs.nvidia.com/
- NVIDIA Nsight用户指南:https://developer.nvidia.com/nsight-systems
作业提交
需要提交的材料包括PDF发送到指定邮箱,具体来说包括:
- 以PDF为格式的实验报告(中英文形式都可,编写方式自由,可以根据个人偏好使用word或latex),PDF文件需要发送至[email protected]。
- 作业的分析、case等结果(不超过10MB),放于results文件夹中。
- 注意最后你需要提交的内容为:实验报告(pdf格式),支撑材料(文件夹),打包为压缩文件后发送至邮箱中即可。