摘抄:在Gaussian 16计算中使用GPU

本文介绍如何在G16中使用GPU来加速计算。本文内容是笔者阅读了Gaussian官网关于使用GPU的说明后,按自己的理解写下的,所以有些地方不能保证十分的严谨或正确,只能说是一种参考。官网网页或其他更为详细的参考资料请参见文末。

笔者测试时使用的Gaussian是G16 A.03版本,硬件方面CPU为单路八核8线程,GPU为两块Tesla K80,每块显卡内存(显存)均为12GB,操作系统是CentOS 6.5。首先要强调的是G16的HF和DFT相比于G09是优化过的,即使不用GPU,纯CPU计算也是G09的1.5倍左右(计算精度相同下),用GPU不过是锦上添花。

获得CPU编号

执行命令行top,之后按1,可以看到Cpu0-Cpu7,共8个线程。这里的0-7是接下来会用到的CPU编号。

获得GPU编号

执行命令行nvidia-smi,可以显示出有几块显卡,如果你的机器上除了计算显卡Tesla之外还装有专业绘图显卡Quadro的话,这里也可以看到(示例见下图)。显卡名称下方还显示有温度,右侧还可以看到显存(此处截图无)。

这里的0,1是接下来将会用到的GPU编号。上图中的PID是运行GPU计算任务后可以显示当前有几个计算任务,PID分别是多少。上图中显示此时无GPU进程。

写输入文件

1
2
3
4
5
6
%chk=a.chk
%mem=12GB
%cpu=0-7
%gpucpu=0,1=0,4
#p B3LYP/6-31G(d) int=(fine,acc2e=10)
......

主要区别在于原来的%nprocshared拆分为2行,其中第一行写要用的CPU编号,这里的%cpu=0-7等价于之前的%nprocshared=8,只不过这里用具体的ID号来表示;如果你的机器有16线程,那可以写%cpu=0-15。另外还支持直接指定,如%cpu=0-1, 6-7等等,这样你可以在2-5上交另一个计算任务。

其中第二行%gpucpu=0,1=0,4,顾名思义,第一个等号后写要用的GPU编号,第二个等号后写control cpu的编号,表示让Cpu0控制GPU0,Cpu4控制GPU1,高斯要求每个GPU必须分配其一个controlcpu,仿佛控制、协调其工作一样。同时,这里的control cpu编号必须被包含在上一行的%cpu编号里,比如0,4属于上一行的0-7之中。但是这会带来另一方面的缺憾,高斯官网说control cpu只用于控制,不用于做计算,也就是说0-7之中只有6个线程在做计算(当然GPU也在做计算),和4只用于控制。这意味着什么?假设单个GPU的计算速度是单个CPU的5倍,

方案1:全部用8线程做计算,不用GPU;

方案2:用6线程计算,2线程用来控制2块GPU,相当于6 + 2*5 = 16;

16/8= 2.也就是说,用2块GPU最多2倍的加速而已。笔者测试时,用与不用GPU的G16相对比,也没有超过2倍加速。说明G16 A.03的GPU加速还是一个比较原始的版本,期待后续的改进。当然,如果你用GPU的G16与只能用CPU的G09相比,那就是高铁与长途汽车的差别了。

关于内存的指定,一般做中小体系的DFT计算时不必刻意在乎这个问题。需要大内存时,换算规则是这样的:一块12GB显存的GPU,CPU内存需要约8 GB,如果用6个线程跑,需要指定%mem=48GB。详细可以参看文末的参考资料。

注意事项

  1. 建议一开始先进行一些简单例子的测试,熟悉该过程。
  2. 再次提醒,G09与G16对于DFT的积分格点默认精度是不一样的,G09默认的是fine,G16默认的是ultrafine;电子积分精度也是不一样的,G09默认acc2e=10,而G16则是12。因此若要进行严格对照或者重复,要使用相同的精度。
  3. 有的GPU机器上除了Tesla之外,还装了Quadro,并且Quadro与某个Tesla GPU有关联,这时候在gjf文件内即使写对了Tesla的GPU编号可能也会报错,可以尝试换成Quadro的编号。当然,计算时通过nvidia-smi命令可以看到实际上还是Tesla在做计算。这个问题的深层原因笔者并不清楚,可能需要一些硬体架构的知识。

参考资料

网页上的GPU/CPU硬件排列关系图,可以用命令nvidia-smi topo –m看到。

本文地址:在Gaussian 16计算中使用GPU-量子化学公众号