摘要:本文介绍了Gaussian系列电子结构软件Gaussian 16的特性。G16是Gaussian 16的简称,最新版本为Gaussian 16 A.03。G16的重大更新包括:1) TD频率、TS优化与IRC计算;2)EOMCC优化计算;3)非简谐振动光谱;4)电子振动光谱;5) 支持GPU计算; 6) 提供Fortran、C、Perl与Python接口。本文还详细介绍了G16的几个方面特性:应用特性、硬件支持、参数输入、用户界面、预设值、并行与性能。

G16 A.03特性速览

一. G16的主要更新

Gaussian系列软件最新的版本为Gaussian 16(G16, 高斯16) Revision A.03, 简称G16 A.03。G16的主要更新包括:

  1. 支持TD频率、TS优化与IRC计算
  2. 非简谐振动光谱
  3. 电子振动光谱等
  4. EOMCC优化
  5. 支持GPU计算提高性能
  6. 支持Fortran、C、Perl与Python的接口

二. 关于应用

  1. NVIDIA GPU支持Hartree-Fock与DFT计算,性能细节参见性能部分。
  2. 提高了大量CPU并行的性能,更多细节与如何优化多CPU、集群与GPU性能参见性能部分。
  3. link0(%)部分的输入参数与Default.Route文件的输入参数现在也可以通过命令行或环境变量来设定,更多细节可参见输入部分。
  4. 除了图形界面外与命令行界面外,还提供了Fortran,C,Perl与Python接口。

三. 关于预设值的改变(与Gaussian 09比)

  1. 在Gaussian 16里使用了不同于Gaussian 09的预设参数/值:
  2. a. 积分精度由10^-10变为10^-12

    b. DFT格点(DFT grid)由FineGrid变为UltraFine; CPHF的预设格点由CoarseGrid变为SG1

    c. SCRF预设为IEFPCM的对称形式(symmetric form, 在Gaussian 09里没有)而不是原先的非对称版本(non-symmetric)

    d. 物理常数不再使用2006版的值而是使用2010版的值

    e. 使用G09Defaults关键字可以将预设值设为Gaussian 09的值(与Gaussian 09兼容),但是在新的研究中强烈建议使用新的参数。

  3. G16预设的内存为%mem=100mw。但对于更大的分子获更多的CPU核心数时,应当使用更大的值,详情参见性能部分
  4. 注:对32BIT机器而言1mw=3.81mb;对64BIT机器而言1mw=7.63mb。

  5. TDDFT频率计算默认情况下采用解释解,比Gaussian 09的数值解速度更快。

四. 关于输入部分的改变

大部分控制Gaussian 16操作的选项有4种方式:

  1. 通过输入文件的link0输入(%-行)
  2. 通过命令行输入
  3. 通过环境变量输入
  4. 通过Default.Route文件输入

在搜索Default.Route文件时候,先搜索默认目录,再搜索Gaussian 16可执行路径的目录(环境变量GAUSS_EXEDIR, 指向$g16root/g16)。

控制G16预设值的参数如下:

输入行 命令行 环境变量 Default.Route 含义
%cpu=… -c=”…” GAUSS_CDEF “…” -C- … which CPUs to use
%gpucpu=… -g=”…” GAUSS_GDEF “…” -G- … which GPUs to use and bind to which CPUs.
%usersh -s=”rsh” GAUSS_SDEF “rsh” -S- rsh Linda should use rsh to start workers
%usessh -s=”ssh” GAUSS_SDEF “ssh” -S- ssh Linda should use ssh to start workers
%lindaworkers=… -w=”…” GAUSS_WDEF “…” -W- … which nodes to use with Linda
-r=”…” GAUSS_RDEF “…” -R- … defaults for route
-h=”…” GAUSS_HDEF “…” -H- … hostname for archive entry
-o=”…” GAUSS_ODEF “…” -O- … organization/site for archive entry
GAUSS_FDEF “…” -F- … default type for formchk (-c, -3, etc.)
GAUSS_UDEF “…” -U- … default memory size for utilities.
# -x=”…” GAUSS_XDEF “…” complete route for job (no route section will be read from the input file).
%chk= -y=”…” GAUSS_YDEF “…” checkpoint file for job.
%rwf= -z=”…” GAUSS_ZDEF “…” read-write file for job.

在G16中不再推荐使用%nprocshared与%nprolinda来控制作业。

五. 并行与性能部分

I.共享内存并行(Shared-memory parallelism, SMP)

  1. 大的内存有利于大的分子或者基组的计算

    含有50或更多个原子的计算以及500或更多基函数的计算推荐每个核心配4GB的内存。命令freqmem可以用于预估基态频率计算每个核心所需的最优内存,同样的内存大小也适合于激发态频率计算;这个内存大小对于对应的基态与激发态来说时绰绰有余的。

    所需内存的大小随着所用CPU核心数的增加而线性增加:如果每个核心4GB的内存是合理的,那么8个核心的时候,就应该用32GB。

    对于更大的频率计算、大的CCSD以及EOM-CCSD能量计算时,还需要留出足够的内存用于缓冲大文件的硬盘缓冲。所以,给Gaussian作业设定内存大小时不宜超过系统总内存的50~70%。比如,一台机器,其内存为128GB,那么全部的CPU核心数加起来分配的内存需要给出在64-80GB之间,以便为操作系统留出足够的内存作为硬盘缓冲使用。

  2. 线程切换与开销
  3. 线程切换(线程从一个CPU切换到另一个CPU)时存在效率损失,从而使得缓冲失效以及引起其它线程开销。在大部分机器上,Gaussian将线程绑定到特定的CPU上,这是推荐的作业模式,尤其是用大量的CPU核心计算的时候。Link0的%CPU行可以指定特定CPU的核心号。因此,在一个8核的机器芯片上用%cpu=0-7而不用%nproc=8,因为前者将第一个线程指派给CPU 0(核心 0),下一个给CPU 1,如此类推。

    早期的Intel处理器(Nehalem或更早期的处理器)由于内存带宽不够而没有办法让一个芯片(CPU)上的全部CPU核心处于忙碌状态,通常只利用一半的CPU核心,而内存设定为两倍就像全部CPU核心都被使用了一样。比如一台4路12核(4个CPU,每个CPU含有12个核心)、128GB内存的计算机,该机器具有48个CPU核心:第一个CPU的0-11号CPU核心,第二个CPU的12-23号CPU核心, 第三个CPU的24-35号核心,第四个CPU的36-48核心等等。对于这样的机器,最佳的CPU与内存分配方案是:24核心(每个CPU6个核心)、每核心3GB内存(72/24=3GB内存每核心)而不是48核心与1.5GB每核心内存的计算方案。那么输入文件为:

    %mem=72GB
    %CPU=0-47/2

    其中/2的意思是每隔一个核心使用,比如第一个CPU(0 号CPU)核心号为0、2、4、6、8、10的CPU核心,第二个CPU(1号CPU)核心号为12、14、16、18、20、22的CPU核心等等。

    较新的Intel处理器(Haswell或更新的CPU)其内存带宽足够,可以让全部的CPU跑起来。

  4. 只要内存足够,线程绑定到指定的核心,那么对大分子的并行效率在64或更多核心数时相当良好。

  5. 超线程对Gaussian没有用处
  6. 如果超线程没有关闭,那么每个Gaussian作业在一个物理核心上只能用一个线程。在Linux操作系统里,不同处理器的超线程被组合在一起。假设有一个机器有两颗CPU(CPU 0, CPU 1)、每颗有8个物理核心、共32个“核心”。那么,0-7为CPU 0的8个核心,8-15为CPU 2的8个核心; 16-23为CPU 0的第二个超线程,24-31为CPU 1的的第二个超线程。所以,该机器最佳的CPU使用方式为%CPU=0-15。

II.集群并行(Cluster/Linda)并行/跨节点并行

  1. 关于集群并行/跨节点并行
  2. Hatree-Fock与DFT的能量、梯度、频率计算以及MP2的能量、梯度计算支持集群跨节点并行。MP2频率、CCSD、EOM-CCSD能量及优化仅支持SMP并行而不支持集群跨节点并行。诸如DFT不对称频率、CCSD频率的数值解支持集群内跨节点并行计算。

  3. 共享内存与集群并行可以组合使用
  4. 总的来说,可以让集群内每个节点的全部CPU进行共享内存并行。注意,%cpu与%mem指的是集群中每个节点的计算资源。假设有个集群含3个计算节点a、b与c,每个节点配有两颗8核CPU:

    %mem=64GB
    %cpu=0-15
    %lindaworkers=a,b,c
    #p b31yp/6-31g* freq

    上面的输入文件请求到的计算资源为:三个计算节点(a,b,c)、每个节点16核心(共48核心)、每个核心4GB内存。

  5. 在数值微分的计算里(Freq=Anharm, CCSD Freq等),需要设定一个额外的CPU核心去搜集结果
  6. 所以,前面的那个例子,如果进行不对称频率计算,输入文件如下:

    %mem=64GB
    %cpu=0-15
    %lindaworkers=a:2,b,c
    #p b31yp/6-31g* freq=anharm

    其中, 假设g16从节点a开始执行。在节点a会启用两个核心,其中给一个用于收集结果,另一个以及节点b与c的核心用于频率计算。

III. GPU的使用

  1. Linux版的Gaussian 16支持NVIDIA K40与K80 GPU显卡计算
  2. 早期的显卡由于计算性能不足以及内存不够而不能用于Gaussian 16的计算。比之CPU计算,内存对GPU计算显得更加重要。K40或K80具有高达16GB的内存并尽可能的将这个资源用于Gaussian计算,这就需要有同样大小的系统内存用于CPU线程使用。如果12GB的GPU配8或9GB系统内存、16GB的GPU配置11-12GB的系统内存工作的相当好。

  3. 使用GPU时需要有特定的CPU对GPU进行控制,这个CPU应该在物理上越靠近被它控制的GPU越好
  4. 用nvidia-smi命令可以检查硬件配置。比如,一台具有双16核心Haswell CPU、4张K80显卡的机器机器其输出如下:

    G16 NVIDIA-SMI

    重点是其中的CPU亲和力(CPU affinity)。上述输出说明GPU 0与1(在第一个K80卡上)。

  5. 对于小的作业GPU计算并无优势,对于大的分子进行DFT能量、梯度以及频率(基态与激发态)计算时才显示出优势。诸如MP2或CCSD之类的Post-SCF计算效率不高。
  6. 与一个CPU相比,每个GPU的计算速度是CPU的好几倍。但是,一台机器上的CPU数量通常比GPU多很多,尽可能地利用全部的CPU与GPU进行计算是很重要的事,那么从GPU上获得的加速就会减少,因为多CPU计算自身的效率也是很高的。比如,如果1张GPU比一个CPU速度快5倍, 那么从1个CPU到1个CPU+1个GPU的加速将会是5倍, 但是从32CPU到32CPU+8个GPU的加速为32CPU—>24CPUs + 8 GPU, 等于24 + 5 x 8 = 64 CPU, 加速比为64/32或2x。

  7. 可以利用集群中多个节点上的GPU进行计算。因为%cpu与%gpucpu用于集群中的每个节点,因此,每个节点必须配置一模一样(GPU数量,CPU亲和力)。
  8. 注:G16不支持多个GPU跨节点并行计算。

IV. CCSD, CCSD(T)以及EOM-CCSD 计算

这些计算可以使用内存来避免I/O以提高效率。如果有O个活性占据轨道(active occupied orbitals, NOA)与V个虚轨道(virtual orbitals, NVB), 那么所需的内存大约为9 x O^2 x V^2 words (1mw =3.81gb)。这不取决于所用的计算核心数。

六. 软件报价、采购联系我们

请填写下面表格,索要报价,请在留言里注明操作系统:比如Linux版