使用CUDA C++编写平均MSD计算

最近在学习C++和CUDA C++,刚好我的动力学过程需要计算MSD,无奈于原子多步数多,计算太慢,于是编写了这个基于CUDA C++的mean square displacement (MSD)计算程序。仅适用于本人自己的体系,如果要用其他体系得改一下相关参数。

代码已经上传到仓库了:GitHub - whitecrn/MSD_GPU: a CUDA C++ program to calculate averaged mean-square-displacement.,下载全部文件,在当前有文件的目录用:make命令即可,然后自己选用哪张卡算(网上有教程,一行命令的事情),然后运行编译出来的可执行文件即可。不过我编译时选的是仅支持计算能力为7.0或8.0以上的卡,具体查询自己的卡能不能算可以查询这个网站:CUDA GPUs - Compute Capability | NVIDIA Developer,不行的话可以自己改Makefile的编译内容。确保自己已经安装了CUDA,并且可以使用nvcc命令,如果不能使用nvcc命令,需要把CUDA的bin加入环境变量(具体看网上教程)。软件用法:./msd_gpu,后面加参数:

-h: 获得参数帮助

-i: 设置需要计算原子的id,默认:1

-f: 输入文件的名称,默认: dump.atom

-p: 时间间隔,单位ps,默认: 0.1

仅测试下GPU并行下的表现,没有具体对GPU代码做深入优化。GPU使用的是CUDA C++,CPU使用的是Fortran二者在数值计算上不会差别特别大,这个是本次比较的基础(后面也会看到,使用GPU并行会比CPU单核计算本身快非常多,如果二者有差异也不会大到数量级的差别)。

下面的测试CPU使用的是第10代i9,GPU使用3090Ti;使用的动力学体系是:12000原子(实际扩散离子8000原子),共10001步,数据文件大小3.69GB:

i9 CPU:

只需要看红框内部的内容,第一个是对周期边界的处理:150 s;第二个是计算时间平均MSD:650 s!时间非常长,一次计算要15分钟左右,况且一次还要计算多个温度下的MSD,等的很着急♪(^∇^*)。(因为读取文件没有用上GPU并行处理,这里就不展示读取文件的速度了,读取文件大概都在80 s左右,不算特别久。

3090Ti:

只需要看红框内部的内容,第一个是对于周期边界的处理:1.07 s!!!这个时间,只占原来的0.7%!!!!!极大减少了需要计算的时间。第二个是计算时间平均MSD:111 s,时间缩短了83%!!!!!(^_^),并行速度明显比单核运行的Fortran代码快非常多(这里还要说一下因为比较懒,Fortran的cpu代码用的单精度浮点数,CUDA C++我用的全都是double双精度浮点数,所以二者如果统一一下的话,实际上会更快更快)而且经过数据和作图验证,二者得到的MSD数据和图像是一致的(这里就不放MSD的图了,我用的自己课题的数据做验证的)

(再也不能以等数据为理由摸鱼力/(ㄒoㄒ)/~~)拜拜啦ヾ(•ω•`)o,下次见!

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2025 白色的蜡笔
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信