Homework 3

作业三:基于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计算引力并更新速度,根据更新后的速度更新天体的位置。

作业步骤

  1. 环境配置 (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环境

  1. 基线运行 (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

得分点: 成功编译和运行代码,在报告中记录初始基线代码的执行时间

  1. 性能分析与理解 (30%)
  • 哪几行代码的修改,使得nbody_parallel.cu01-nbody.cu执行快?为什么?
  • nbody_shared.cunbody_parallel.cu执行快多少倍,为什么?
  • 哪几行代码的修改,使得nbody_shared.cunbody_parallel.cu执行快?为什么?
  • nbody_shared.cu01-nbody.cu执行快多少倍,为什么?

评价标准为:

  • 回答的正确性
  • 回答与课程讲授内容的契合度

得分点: 上述问题每问的得分上限为10%,总得分上限为30%,在报告中言简意赅地回答上述问题。

  1. 参数分析与优化 (40%)

该部分需要同学们分析如下内容:

  • 分析nbody_parallel.cuBLOCK_SIZE的取值对性能的影响。
  • 分析nbody_shared.cuBLOCK_SIZEBLOCK_STRIDE的取值对性能的影响。

建议: CUDA提供了内置的GPU分析工具Nsight Compute,同学们可以尝试使用该工具分析代码性能。

在命令行终端输入

ncu

即可查看该工具。分析后的结果将保存在服务器上,同学们可以自行下载至本地进行可视化分析。同学们可以参考用户文档学习使用该工具。由于该工具使用有难度,不强制要求同学们使用。使用该工具且分析得当,可适当获得加分。

评价标准为:

  • 回答的正确性
  • 是否进行了系统级的分析
  • 是否进行了内核级的分析
  • 是否对系统级和内核级的分析进行了对比

得分点: 上述问题每问的得分上限为20%,总得分上限为40%,在报告中言简意赅地回答上述问题。

  1. 代码优化以及其他Bonus Points (20%)
  • 加速优化:在进行完上述分析后,同学们可以尝试查阅CUDA文档,使用其他优化方法,进一步优化代码,例如在保持相同运行时长的情况下,减少内存访问次数,减少内存拷贝次数,减少内核启动次数等。
  • 深入理解:同学们可以尝试搜索更多参数,例如,分析在不同加速方法、加速参数设定下,计算耗时、显存占用随着天体数量变化的趋势,分析不同加速方法的性能瓶颈,分析不同加速方法的适用场景等。
  • 其他Bonus Points:同学们可以尝试在其他方面挖掘本次作业与课程内容相关的问题,助教将根据同学们回答的新颖度、深度和广度进行评分。

参考资料

  1. NVIDIA CUDA文档:https://docs.nvidia.com/
  2. NVIDIA Nsight用户指南:https://developer.nvidia.com/nsight-systems

作业提交

需要提交的材料包括PDF发送到指定邮箱,具体来说包括:

  1. 以PDF为格式的实验报告(中英文形式都可,编写方式自由,可以根据个人偏好使用word或latex),PDF文件需要发送至[email protected]
  2. 作业的分析、case等结果(不超过10MB),放于results文件夹中。
  3. 注意最后你需要提交的内容为:实验报告(pdf格式),支撑材料(文件夹),打包为压缩文件后发送至邮箱中即可。
Previous
Next