摘抄:在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 | %chk=a.chk |
主要区别在于原来的%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
。详细可以参看文末的参考资料。
注意事项
- 建议一开始先进行一些简单例子的测试,熟悉该过程。
- 再次提醒,G09与G16对于DFT的积分格点默认精度是不一样的,G09默认的是fine,G16默认的是ultrafine;电子积分精度也是不一样的,G09默认acc2e=10,而G16则是12。因此若要进行严格对照或者重复,要使用相同的精度。
- 有的GPU机器上除了Tesla之外,还装了Quadro,并且Quadro与某个Tesla GPU有关联,这时候在gjf文件内即使写对了Tesla的GPU编号可能也会报错,可以尝试换成Quadro的编号。当然,计算时通过nvidia-smi命令可以看到实际上还是Tesla在做计算。这个问题的深层原因笔者并不清楚,可能需要一些硬体架构的知识。
参考资料
网页上的GPU/CPU硬件排列关系图,可以用命令nvidia-smi topo –m看到。