从中获得良好性能mdrun软件#

在这里,我们概述了GROMACS所采用的并行化和加速方案。目的是了解使GROMACS成为最快的分子动力学软件包。提供的信息应该有助于选择适当的并行化选项、运行配置、,以及加速选项,以实现最佳仿真性能。

GROMACS构建系统和gmx mdrun这个工具有很多内置的和可配置智能来检测您的硬件有效使用。对于大量随意和严肃使用gmx mdrun,这台自动机器运转得很好。但是为了得到从您的硬件中最大限度地提高您的科学质量,请继续阅读!

硬件背景信息#

现代计算机硬件复杂且异构,因此我们需要讨论一些背景信息并设置一些定义。经验丰富的HPC用户可以跳过此部分。

核心#

实际执行的硬件计算单元说明。通常处理器,通常更多。

隐藏物#

内核本地的一种特殊内存,速度快得多访问主内存,有点像人类的顶部桌子,与他们的文件柜相比。通常有与核心相关联的几层缓存。

插座#

共享某种局部性的一组核心,例如共享缓存。这使得传播效率更高套接字内核心的计算工作量高于核心在不同的插槽中。现代处理器通常有超过一个插座。

节点#

共享粗级别局部性的一组套接字,例如无需任何网络即可共享对同一内存的访问硬件。普通笔记本电脑或台式电脑是一个节点。A类节点通常是大型计算集群的最小数量用户可以请求使用的。

线#

核心要执行的指令流。有很多创建和管理的不同编程抽象将计算分散到多个线程上,例如OpenMP,pthreads、winthreads、CUDA、SYCL、OpenCL和OpenACC。某些类型的硬件可以将多个软件线程映射到一个内核;英特尔x86处理器这被称为“超线程”,而更一般的概念通常称为SMT“同时多线程”。例如,IBM Power8可以使用每个内核最多8个硬件线程。此功能通常可以在中启用或禁用硬件BIOS或通过Linux操作中的设置系统。GROMACS通常可以利用这一点免费性能提升。在大多数情况下默认情况下启用,例如在新的x86处理器上,但在某些情况下系统管理员可能已禁用它。如果是如果是这样,询问他们是否可以为您重新启用它。如果你不确定如果已启用,请检查中CPU信息的输出并与联机找到的CPU规格进行比较。

线程亲和力(固定)#

默认情况下,大多数操作系统都允许软件线程迁移在内核(或硬件线程)之间帮助自动平衡工作量。然而gmx mdrun会恶化如果这是允许的,并且会显著降低,特别是当依赖一个列中的多线程。为了避免这种情况,gmx mdrun将默认设置其线程与各个内核/硬件线程的关联,除非用户或软件环境已经这样做了(或不是整个节点都用于运行,即有可能用于节点共享)。设置线程相关性有时被称为线程“固定”。

MPI(消息传递接口)#

主要的多节点并行化方案,它提供一种标准化语言,可以用它编写程序跨多个节点工作。

等级#

在MPI中,秩是用于多节点并行化方案。该分组可以是由用户控制,可能对应于核心套接字、一个节点或一组节点。最佳选择各不相同硬件、软件和计算任务。有时是MPI秩称为MPI进程。

通用分组#

图形处理单元,通常速度更快对于特定类型的计算工作负载。GPU始终与特定节点,通常是其中的特定套接字节点。

开放式多媒体播放器#

许多编译器支持的一种标准化技术,用于共享多核计算工作负载。通常与MPI实现混合MPI/OpenMP并行。

CUDA公司#

NVIDIA开发的专有并行计算框架和API这允许瞄准他们的加速器硬件。GROMACS使用CUDA为NVIDIA硬件提供GPU加速支持。

开放运算语言#

一个开放的基于标准的并行计算框架,包括基于C99的编译器和针对异构的编程API和加速器硬件。GROMACS使用OpenCL进行GPU加速在AMD设备(包括GPU和APU)、英特尔集成GPU和苹果上硅集成GPU;还支持一些NVIDIA硬件。在GROMACS中,OpenCL被弃用,取而代之的是SYCL。

SYCL公司#

一个基于C++17的开放标准,用于针对异构系统。SYCL有几种实现,其中GROMACS支持两种:英特尔oneAPI DPC++自适应Cpp.GROMACS使用SYCL进行GPU加速在AMD和Intel GPU上。NVIDIA GPU也有实验支持。

SIMD(单指令多数据)#

一种CPU指令,现代CPU内核可以通过它执行多个单循环中的浮点指令。

GROMACS中基于并行化的工作分配#

中的算法gmx mdrun它们的实现最为相关在选择如何充分利用硬件时。有关详细信息,请参阅参考手册。其中最重要的是

域分解#

域分解(DD)算法将非键相互作用的(短程)成分共享空间位置的域,允许使用高效算法。每个域处理所有其成员的粒子-粒子(PP)相互作用映射到单个MPI列组。在PP列组中,OpenMP线程可以共享工作负载,并且可以将一些工作卸载到GPU。PP等级还处理其域的成员。GPU可以执行超过一个PP等级,但通常使用单个每个GPU的PP排名,该排名有数千粒子。当PP列的工作在CPU上完成时,MD运行将广泛使用SIMD核心能力。有各种各样的命令行选项控制DD算法的行为。

颗粒米埃瓦尔德#

粒子-梅什-埃瓦尔德(PME)算法处理长期非键相互作用的组分(库仑,可能还有伦纳德-琼斯)。要么全部,要么只是队伍的一个子集参与计算远程组件的工作(通常不准确地简单称为“PME”组件)。因为该算法使用的3D FFT需要全球通信,其并行效率随着等级的增加而降低参与,这意味着只使用子集是最快的等级(例如四分之一到二分之一的等级)。如果有单独的PME等级,然后剩下的等级处理PP工作。否则,所有级别都会同时进行PP和PME工作。

并行化方案#

GROMACS以性能为导向,非常注重高效的并行化。有多种可用的并行化方案,因此可以在具有不同运行配置选择的给定硬件。

通过SIMD:SSE、AVX等实现核内并行。#

GROMACS中的一个性能改进级别是通过使用单个 说明 多个 数据 (SIMD)说明。详细信息对于那些可以在下面找到的SIMD支持在安装中指南。

在GROMACS中,SIMD指令用于将具有对性能影响最大(无粘结力和粘结力计算,PME和邻居搜索)。这些构成了可用的三个非键合内核级别之一:参考或通用内核(速度慢,但对生成测试参考值很有用),优化的纯C内核(可以跨平台使用,但速度仍然很慢)和SIMD内部函数加速了内核。

SIMD内部代码由编译器编译。从技术上讲,可以将不同级别的加速度编译成一个二进制,但在代码的许多部分,很难通过加速来管理这一点。因此,您需要为目标CPU的SIMD功能配置和编译GROMACS。默认情况下,构建系统将检测支持的最高执行编译的主机的加速。用于交叉编译具有不同最高SIMD指令集的机器,以便设置目标加速度,这个-DGMX_SIMD可以使用CMake选项。使用单个安装在多台不同的机器上,使用最低的通用SIMD指令集(因为这些指令集几乎不依赖SIMD加速),但最好性能mdrun软件应使用最高(最新)本地的目标体系结构的SIMD指令集(由GROMACS支持)。

最新的英特尔CPU体系结构在CPU(即其速度)和它执行的SIMD指令的宽度(即其吞吐量以给定的速度)。特别是Intel天湖级联 湖泊处理器(例如,Xeon SP Gold/Platinum),在使用更窄的SIMD时可以提供更好的吞吐量,因为更好的时钟频率。考虑建造mdrun软件配置为GMX_SIMD=AVX2_256而不是GMX_SIMD=AVX512为了更好GPU加速或高度并行MPI运行中的性能。

一些最新的基于ARM的CPU,如富士通A64fx,支持可伸缩向量扩展(SVE)。尽管SVE可以用于生成相当有效的矢量长度不可知(VLA)码,这不适合GROMACS(因为SIMD向量长度假定为已知C拍摄时间)。因此,SVE矢量长度必须在CMake时间固定。默认值是在CMake时间自动检测默认矢量长度(通过/proc/sys/abi/sve_default_vector_length伪文件,可以通过以下方式进行更改使用配置GMX_SIMD_ARM_SVE_LENGTH=<len>支持的矢量长度为128、256、512和1024。由于SIMD短程非键核每个SIMD矢量最多支持16个浮点数,1024位矢量长度仅为双精度有效(例如。-DGMX_DOUBLE=开).请注意,即使mdrun软件在运行时使用不同的比CMake时间使用的向量长度是未定义的行为,并且mdrun软件可能在到达之前崩溃检查(将中止并显示用户友好的错误消息)。

通过OpenMP实现进程(或)级并行#

GROMACS公司mdrun软件支持所有部件的OpenMP多线程代码的。OpenMP默认启用可以在配置时使用GMX_打开CMake变量并在运行时使用-恩托普选项(或OMP_NUM_螺纹环境变量)。OpenMP实现非常高效,可扩展到上最多12-24个线程英特尔和AMD CPU上的6-8个线程。

通过GPU卸载和线程-MPI实现节点级并行#

带螺纹的多线程-MPI#

thread-MPI库实现了MPI 1.1规范的一个子集,基于系统线程支持。支持POSIX pthread和Windows线程,从而为大多数UNIX/Linux和Windows操作系统提供了很好的可移植性。作为MPI的替代品,thread-MPI支持编译和运行mdrun软件在没有MPI的单台机器上(即不跨网络)。此外,它不仅提供了使用具有多核CPU的计算机的方便方法,但在某些情况下,线程MPI可以箱子制造mdrun软件运行速度略快于使用MPI。

线程MPI包含在GROMACS源中,它是默认的并行化模式,实际渲染序列mdrun软件已弃用。使用线程MPI进行编译由GMX_THREAD_MPI公司CMake变量。

Thread-MPI与大多数mdrun软件功能和并行化方案,包括OpenMP、GPU;它与MPI和多模拟运行不兼容。

默认情况下,螺纹-MPImdrun软件通过启动,将使用机器中所有可用的核心占用所有列组或OpenMP线程的适当数量。数量可以使用-纳特-恩姆皮选项。-纳特表示线程总数要使用的线程(可以是线程-MPI和OpenMP线程的混合)。

混合/异构加速#

混合加速意味着在可用CPU和GPU之间分配计算工作以提高仿真性能。新的非绑定算法开发的目的是在CPU和GPU上高效加速。

模拟中计算最密集的部分,非结合力计算,以及与PME一样,粘结力计算、更新和约束可以卸载到GPU并与剩余的CPU工作同时执行。中最常用的算法支持本机GPU加速格鲁马科斯。有关GPU内核的更多信息,请参阅安装指南

可以在运行时使用mdrun软件 -编号选项,或在配置时使用GMX_通用处理器CMake变量。

为了有效地使用所有可用的计算资源,CPU和GPU计算是同时进行的。与OpenMP多线程结合力和PME远程静电计算重叠在CPU上,在GPU上计算非键合力。多个GPU,均位于单个节点中以及跨多个节点,都支持使用域分解。分配了一个GPU因此,使用的GPU数量必须与该数量匹配开始模拟的MPI进程(或线程-MPI线程)的个。可用的CPU内核在进程(或线程-MPI线程)和一组内核之间进行分区使用GPU在各自的域上进行计算。

使用PME静电,mdrun软件通过以下方式支持CPU-GPU的自动负载平衡将工作负载从在CPU上完成的PME网格计算转移到粒子-粒子非绑定计算,在GPU上完成。启动时会执行几次调整迭代在前100到1000 MD步骤中。这些迭代包括缩放静电截止和PME网格间距,以确定提供最佳CPU-GPU负载平衡的值。截止日期使用提供的值库伦 =rvdw 多学科发展计划选项表示最小值静电切断调谐开始,因此应选择小到可能(但对于模拟的物理仍然合理)。Lennard-Jones截止线rvdw型保持固定。我们不允许缩放到更短的截止线,因为我们不想更改rvdw型而且性能也不会提高。

虽然自动CPU-GPU负载平衡总是试图找到最佳的截止设置,可能并不总是能够平衡CPU和GPU工作负载。当CPU执行线程时会发生这种情况比GPU非键合力计算更快地完成键合力和PME的计算,即使是最短的截止时间。在这种情况下,CPU将等待GPU时间将显示为等待 通用分组 地方的在最后的周期和定时汇总表中日志文件的。

通过MPI在多个节点上进行并行化#

GROMACS中MPI并行化的核心是中性错误区域分解使用动态负载平衡。跨多台机器(例如集群的节点)并行模拟mdrun软件需要使用MPI进行编译,可以使用GMX_MPI公司CMake变量。

控制区域分解算法#

本节列出了影响域的方式的选项分解算法将工作负载分解为可用的并行硬件。

-关系型数据

可用于设置inter所需的最大距离电荷组键合相互作用。双体通信低于非键合截止距离的键合相互作用总是免费提供非绑定通信。粒子超出只有在非保税截止日期缺失键相互作用;这意味着额外的费用是次要且几乎独立于-关系型数据.带动态负载平衡,选项-关系型数据还设置了区域分解单元大小。默认情况下-关系型数据已确定通过gmx mdrun基于初始坐标。所选值将在互动范围和沟通成本之间取得平衡。

-dd检查

默认情况下启用。当电荷组间键合相互作用超出粘结截止距离,gmx mdrun错误消息。对于成对相互作用和表列键不生成排除,可以使用关闭此检查选项-节点检查

-雷达控制单元

当存在约束时,选项-雷达控制单元影响单元格大小限制也是如此。由NC约束连接的粒子,其中NC是LINCS顺序加1,不应超过最小单元格大小。一个错误发生这种情况时会生成消息,用户应该更改分解或降低LINCS顺序并增加LINCS迭代次数。默认情况下gmx mdrun估计保守情况下P-LINCS所需的最小单元尺寸时尚。对于高度并行化,设置P-LINCS所需的距离-雷达控制单元

-分布式数据库

设置单元格的最小允许x、y和/或z缩放比例动态负载平衡。gmx mdrun将确保细胞能够至少按这个因素缩小。此选项用于自动空间分解(不使用时-日)以及用于确定栅极脉冲数,从而设置允许的最小单元格大小。在某些情况下,价值属于-分布式数据库可能需要进行调整以适应高或低系统的空间不均匀性。

多级并行化:MPI和OpenMP#

CPU开发中的多核趋势证实了多级并行化的需要。目前的多处理器机器可以有2-4个CPU,核心数量高达64个。作为记忆而缓存子系统越来越落后于多核演化,这就强调了非均匀内存访问(NUMA)效应,这可能成为性能瓶颈。在同一时间所有核心共享一个网络接口。在纯MPI并行方案中,所有MPI进程使用相同的网络接口,尽管MPI节点内通信通常是高效的,节点之间的通信可能成为并行化的一个限制因素。这是特别的在使用PME进行高度并行仿真的情况下(这是一种非常通信的方式密集型)和“脂肪”节点通过慢速网络连接。多级并行旨在通过高效的节点内并行,通常是多线程。

将OpenMP与MPI结合会产生额外的开销尤其是在运行单独的多线程PME列组时。根据体系结构,输入系统大小以及其他因素,MPI+OpenMP的运行速度可以越来越快已经有少量进程(例如多处理器Intel Westmere或Sandy Bridge),但速度也可能慢得多(例如多处理器AMD Interlagos机器)。然而,在高度并行的运行中,多级并行的好处更为明显。

独立PME等级#

在CPU列组上,粒子-粒子(PP)和PME计算在同一进程中依次完成另一个。由于PME需要全方位的全球沟通,这在大多数情况下都是有限的在大量核心上扩展的因素。通过指定PME等级子集只有通过计算,才能大大提高并行运行的性能。

也可以在PME列中使用OpenMP多线程。在PME中使用多线程可以提高高性能并行化。原因是当N>1个线程时,进程的数量通信,因此消息数量减少了N倍。但请注意,现代通信网络可以同时处理多条消息,这样,有更多的进程进行通信可能是有利的。

低并联时不使用单独的PME列,高并联时使用开关自动发生(在>16个进程时)。PME等级的数量由mdrun估算。如果PME负载高于PP负载,mdrun将自动平衡负载,但这导致了额外的(非键合的)计算。这样可以避免大量空转等级;通常3/4的排名是PP排名。但为了确保最佳的绝对性能对于高度并行的运行,建议调整此数字,此数字由这个音乐_时间工具。

PME等级的数量可以在mdrun软件命令行使用-核动力装置选项,则可以在命令行上使用指定PME线程数-ntomp_pme(P)或者使用GMX_PME_NUM_THREADS公司环境变量。后者尤其如此在具有不同内核数的计算节点上运行时非常有用,因为它支持在不同节点上设置不同数量的PME线程。

正在运行mdrun软件在单个节点内#

gmx mdrun可以用几种不同的方式进行配置和编译可以在单个节点。默认配置使用合适的编译器将部署多级混合并行使用CUDA/SYCL/OpenCL、OpenMP和本机线程平台硬件。为了编程方便,在GROMACS中线程用于在单个节点上实现与将在节点之间使用,但效率更高;这个叫做螺纹-MPI。从用户的角度来看,真正的MPI和线程MPI外观几乎相同,GROMACS指的是MPI等级,表示任何一种,除非另有说明。真正的外部MPI可用于gmx mdrun在内部单个节点,但运行速度比线程MPI版本慢。

默认情况下,gmx mdrun将在运行时检查可用的硬件并尽最大努力合理高效地使用整个节点。这个日志文件、stdout和stderr用于打印诊断告知用户所做的选择和可能的后果。

可以使用许多命令行参数修改默认值行为。

-纳特

要使用的线程总数。默认值0的开始形式为许多线程作为可用内核。螺纹是否线程-MPI列组和/或此类列组中的OpenMP线程取决于其他设置。

-ntmpi接口

要使用的线程MPI列组总数。默认值为0,将为每个GPU启动一个列组(如果存在),否则为一个列每个核心。

-ntomp公司

每个列组要启动的OpenMP线程总数。这个默认值0将在每个可用内核上启动一个线程。或者,mdrun软件将遵守适当的制度环境变量(例如。OMP_NUM_螺纹)如果设置。请注意,OpenMP线程的最大数量(每列)为,出于效率原因,限制为64。虽然它很少有益于使用大于此值的线程数,GMX_OPENMP_MAX_threads CMake变量可用于增加限制。

-核动力装置

为长期目标贡献的等级总数PME组件(如果使用)。默认值为-1,将奉献等级只有当线程总数至少为12个时,才会使用远程组件的排名约为四分之一。

-ntomp_pme(P)

当使用具有单独PME等级的PME时,每个单独PME列组的OpenMP线程总数。默认值0从-ntomp公司

-销

可以设置为“自动”、“打开”或“关闭”以控制mdrun软件将尝试设置线程与核心的关联性。默认为“auto”,这意味着如果mdrun软件检测到所有节点上的内核用于mdrun软件,那么它应该表现良好如“on”,并尝试设置相关性(除非它们是已经被其他东西设置)。

-皮诺夫塞特

如果-销 ,将逻辑核心编号指定为哪一个mdrun软件应该钉住第一根螺纹。当运行超过一个实例mdrun软件在节点上,使用此选项可以避免固定不同的螺纹mdrun软件实例到同一个内核。

-针状步幅

如果-销 ,指定逻辑核心中的步幅核心的编号mdrun软件应将其螺纹固定。什么时候?运行的多个实例mdrun软件在节点上,使用此选项避免钉住不同的螺纹MD运行实例到相同的核心。使用默认值0来最小化线程数每个物理核心-这让mdrun软件管理硬件、操作系统和如何将逻辑核心映射到的特定于配置的详细信息物理核心。

-dd订单

可以设置为“interleave”、“pp_pme”或“cartesian”默认为“交错”,这意味着任何单独的PME排列将按PP、PP、PME、PP、PP,PME等。这通常会充分利用可用的硬件。“pp_pme”首先映射所有pp排名,然后映射所有pme排名。“笛卡尔”是一种特殊用途的映射,通常很有用仅在全局加速的特殊环面网络上笛卡尔通信器的通信。如果有,则无效没有单独的PME级别。

-编号

用于设置执行短程非绑定交互的位置。可以设置为“自动”、“cpu”、“gpu”默认为“auto”,它使用兼容的GPU(如果可用)。设置“cpu”要求不使用GPU。设置“gpu”需要可以使用兼容的GPU。

-项目经理

用于设置执行远程非绑定交互的位置。可以设置为“自动”、“cpu”、“gpu”默认为“auto”,它使用兼容的GPU(如果可用)。设置“gpu”需要一个兼容的gpu可用。GPU上的PME不支持多个PME列组,因此如果使用GPU对于PME计算-npme必须设置为1。

-粘结的

用于设置在何处执行作为域的PP工作负载。可以设置为“自动”、“cpu”、“gpu”默认为“自动”,仅当一个兼容的CUDA或SYCL GPU可用,GPU正在处理短程交互,并且CPU正在处理远程交互工作(静电或LJ)。键合相互作用的工作发生在同一个GPU作为短程交互,不能独立分配。设置“gpu”要求有兼容的gpu可用,并且使用。

-更新

用于设置执行更新和约束的位置(如果存在)。可以设置为“自动”、“cpu”、“gpu”默认为“auto”,当前总是使用CPU。设置“gpu”要求提供兼容的CUDA或SYCL gpu,模拟使用一个等级。当前不支持GPU上的更新和约束具有质量和约束的自由能扰动,域分解、虚拟场地、Ewald曲面校正、,副本交换、约束拉动、方向约束和计算电生理学。

-gpu id

一个字符串,指定GPU的ID号可供每个节点上的列组使用。例如,“12”指定ID为1和2的GPU(如报告所示(由GPU运行时使用)mdrun软件。这很有用与其他计算共享节点时,或者如果GPU专用于GROMACS不应使用的显示器。如果不指定此参数,mdrun软件将使用所有GPU。当许多GPU现在,可以使用逗号分隔ID,因此“12,13”将使GPU 12和13可用于mdrun软件可能有必要在不同的GPU上使用不同的GPU模拟节点,在这种情况下,环境变量GMX_GPU_ID可以为列组设置不同的在不同的节点上实现该结果。在2018年之前的GROMACS版本中,此参数用于指定GPU可用性和GPU任务分配。后者现在用-gputasks公司参数。

-gputasks公司

一个字符串,指定GPU的ID号为由该节点上相应的GPU任务使用。例如,“0011”指定前两个GPU任务将使用GPU 0,另外两个使用GPU 1。使用此选项时必须知道列数mdrun软件,以及在哪里应该运行不同类型的任务,例如使用-编号 通用程序单元-仅设置为在GPU上运行的任务解析映射的计数。请参见将任务分配给GPU了解更多详细信息。请注意-gpu id-gputasks公司不能同时使用!在2018年之前的GROMACS版本中,只有一种类型GPU任务(“PP”)可以在任何列组上运行。现在有一些支持在GPU上运行PME,GPU任务的数量(以及-gputasks公司字符串)对于单秩模拟,实际上可以是3。ID在这种情况下仍然必须相同,因为使用多个GPU每一个等级尚未实现。串中每个秩的GPU任务的顺序是PP优先,PME第二。不同类型GPU任务的排名顺序默认情况下是相同的,但可以受-dd订单选项,并且在使用多个节点时变得非常复杂。请注意,PP任务的键合交互可能在与短期工作相同的GPU上运行,或在CPU上运行,可以使用控制-保税的标志。GPU任务分配(无论是手动设置还是自动设置),将在中报告mdrun软件输出打开模拟的第一个物理节点。例如:

gmx公司 mdrun软件 -gputasks公司 0001 -编号 通用程序单元 -项目经理 通用程序单元 -核动力装置 1 -ntmpi接口 4

将在日志文件/终端中生成以下输出:

打开 主办 tcbl14号机组 2 GPU(全球生产单位) 挑选出来的 对于  运行
映射 属于 通用分组 标识  这个 4 通用分组 任务 在里面 这个 4 等级   节点:
聚丙烯:0聚丙烯:0聚丙烯:0项目管理工程师:1

在这种情况下,用户设置3个等级来计算PP功在GPU 0上,1排名以计算GPU 1上的PME。日志文件中还报告了GPU的详细索引。

有关GPU任务的更多信息,请参阅GPU任务类型

-设备快速傅立叶变换

允许选择是在CPU还是GPU上执行3D FFT计算。可以设置为“自动”、“cpu”、“gpu”。当PME卸载到GPU时-pmefft系统 全球采购单位是默认值,整个PME计算在GPU上执行。然而,在某些情况下,例如使用相对较慢或较老一代的GPU与运行中的快速CPU内核相结合,将一些工作移出GPU通过计算CPU上的FFT返回CPU可以提高性能。

的示例mdrun软件在一个节点上#

gmx公司 mdrun软件

开始mdrun软件使用所有可用资源。mdrun软件将自动选择一个相当高效的部门进入线程-MPI列组、OpenMP线程和分配工作兼容GPU。细节因硬件而异以及正在运行的模拟类型。

gmx公司 mdrun软件 -纳特 8

开始mdrun软件使用8个螺纹,可能是螺纹-MPI或OpenMP线程,具体取决于硬件和类型模拟正在运行。

gmx公司 mdrun软件 -ntmpi接口 2 -ntomp公司 4

启动mdrun软件使用八个总螺纹,两个螺纹-MPI列组和每个列组四个OpenMP线程。你应该只使用寻求最佳性能时的这些选项,以及必须注意你创建的队伍它们的所有OpenMP线程都在同一个套接字上运行。等级数应为套接字,每个节点的内核数应为每列线程数的倍数。

gmx公司 mdrun软件 -ntmpi接口 4 -编号 通用程序单元 -项目经理 中央处理器

开始mdrun软件使用四个线程-MPI列。CPU可用的核心将使用OpenMP在列组之间平均分配线程。力的长程分量计算如下CPU。这在CPU相对较多的硬件上可能是最佳的与GPU相比功能强大。力计算的粘结部分将自动分配给GPU,因为远程力的分量在CPU上计算。

gmx公司 mdrun软件 -ntmpi接口 1 -编号 通用程序单元 -项目经理 通用程序单元 -保税的 通用程序单元 -更新 通用程序单元

开始MD运行使用单个线程-MPI列将使用所有可用的CPU内核。可以运行的所有交互类型在GPU上可以做到这一点。这可能在CPU所在的硬件上是最佳的与GPU相比非常弱。

gmx公司 mdrun软件 -ntmpi接口 4 -编号 通用程序单元 -项目经理 中央处理器 -gputasks公司 0011

开始mdrun软件使用四个线程-MPI秩,并对其进行映射ID为0和1的GPU。可用的CPU内核将在使用OpenMP线程的列,前两个列卸载短程非键合力计算到GPU 0,最后两列卸载到GPU 1。力的远程分量是在CPU上计算的。这可能是最佳的在CPU与GPU相比功能相对强大的硬件上。

gmx公司 mdrun软件 -ntmpi接口 4 -编号 通用程序单元 -项目经理 通用程序单元 -核动力装置 1 -gputasks公司 0001

开始mdrun软件使用四个线程MPI列,其中一个是专门用于长期PME计算。前3个线程卸载了它们的ID为0的GPU的短程非键合计算,第四(PME)线程将其计算卸载到ID为1的GPU。

gmx公司 MD运行 -ntmpi接口 4 -编号 通用程序单元 -设备设备 通用程序单元 -npme公司 1 -gputasks公司 0011

与上述示例类似,分配了3个等级用于计算短程非结合力和一个等级,用于计算远程力。在这种情况下,3个短程列中的2个卸载了非绑定部队计算到GPU 0。ID为1的GPU计算第三近程部队,以及PME专用的远程部队排名。此示例或上述示例是否最佳取决于功能单个GPU和系统组成。

gmx公司 mdrun软件 -gpu id 12

开始mdrun软件使用ID为1和2的GPU(例如,因为GPU 0专用于运行显示器)。这需要两个线程MPI列,并将拆分可用的它们之间使用OpenMP线程的CPU内核。

gmx公司 mdrun软件 -纳特 6 -大头针  -皮诺夫塞特 0 -针状步幅 1
gmx公司 mdrun软件 -纳特 6 -大头针  -皮诺夫塞特 6 -针状步幅 1

启动两个mdrun软件进程,每个进程总共有六个线程通过以下方式安排,使过程尽可能少地相互影响分配给不相交的物理核心集。线程的亲缘关系将设置为特定逻辑核心,分别从第一个和第七个逻辑核心开始。这个以上内容在具有六个物理内核的Intel CPU上运行良好已启用超线程。仅使用这种设置如果限制mdrun软件到核心子集以共享节点与其他进程。注意:逻辑CPU/核心到物理CPU/内核的映射不同操作系统的内核可能不同。在Linux上, /进程/cpuinfo可以检查以确定此映射。

mpirun运行 -净现值 2 gmx_mpi(gmx _ mpi) mdrun软件

当使用gmx mdrun使用外部MPI编译,这将启动两个列和相同数量的OpenMP线程在硬件和MPI设置允许的情况下。如果MPI设置仅限于一个节点,然后生成gmx mdrun将位于该节点的本地。

正在运行mdrun软件在多个节点上#

这需要配置GROMACS以使用外部MPI进行构建库。默认情况下,此mdrun软件可执行文件使用运行gmx_mpi(gmx _ mpi) mdrun软件.运行单节点的所有注意事项mdrun软件仍然适用,除了-ntmpi接口-纳特造成致命事故错误,而列数由MPI环境。设置,如-核动力装置更重要的是使用多个节点。将MPI环境配置为每个核心产生一个等级通常是好的,直到一个接近强尺度极限。此时,使用OpenMP将MPI列组的工作分散到多个核心需要继续提高绝对性能。缩放限制的位置取决于处理器,存在GPU、网络和模拟算法,但如果你想测量大约200个粒子/核,这是值得的需要最大吞吐量。

以下是与之相关的其他命令行参数案例。

-调谐

默认为“on”。如果“on”,模拟将优化PME和DD算法的各个方面列组和/或GPU之间的负载以最大化吞吐量。一些mdrun软件特性与此不兼容,这些特性将被忽略此选项。

-数字图书馆

可以设置为“自动”、“否”或“是”默认为“自动”。在MPI列组之间执行动态负载平衡需要最大化性能。这一点尤其重要对于具有异质粒子或相互作用的分子系统密度。当性能损失的特定阈值为超过,DLB激活并在级别之间移动粒子以提高性能。如果可用,使用-保税的 通用程序单元应为以提高DLB最大化性能的能力。DLB与驻留在GPU的并行化(与-更新 通用程序单元)因此,在这种模拟中,它仍然处于关闭状态。

在模拟过程中gmx mdrun必须在所有PP排名用于计算日志文件的动能等数量报告,或者可能是温度耦合。默认情况下,会发生这种情况只要有必要mdp选项因此,通信阶段之间的周期最不常见的分母nstcalcenergy公司nstt联轴器、和nstp耦合器

请注意-调谐当有多个时有更多效果节点,因为PP和PME的通信成本等级不同。它仍然在PP和PME级别之间转移负载,但确实如此不更改正在使用的单独PME列组的数量。

另请注意-数字图书馆-调谐会相互干扰,所以如果您遇到可能由此导致的性能变化,您可能希望单独调优PME,并使用运行结果mdrun软件 -通知 -数字图书馆

这个gmx音乐文件实用程序可用于搜索更广泛的参数空间的范围,包括确保安全对的修改tpr公司文件,并且变化-核动力装置它只知道由MPI环境,并且不显式管理优化期间OpenMP的任何方面。

的示例mdrun软件在多个节点上#

单节点的示例和说明mdrun软件仍然相关,但-ntmpi接口不再是这样了选择MPI列数。

mpirun运行 -净现值 16 gmx_mpi(gmx _ mpi) mdrun软件

开始gmx mdrun有16个等级,映射到MPI库中的硬件,如指定的在MPI主机文件中。可用的核心将是使用OpenMP线程在列组之间自动拆分,取决于硬件和任何环境设置例如OMP_NUM_螺纹

mpirun运行 -净现值 16 gmx_mpi(gmx _ mpi) mdrun软件 -核动力装置 5

开始gmx mdrun排名16,如上所述,以及要求其中5个专用于PME组件。

mpirun运行 -净现值 11 gmx_mpi公司 mdrun软件 -ntomp公司 2 -npme公司 6 -ntomp_pme(P) 1

启动gmx mdrun排名11,如上所述,以及要求其中六个专门用于PME每个组件都有一个OpenMP线程。剩下的五个执行PP组件,两个OpenMP线程每个。

mpirun运行 -净现值 4 gmx_mpi(gmx _ mpi) mdrun软件 -ntomp公司 6 -编号 通用程序单元 -gputasks公司 00

开始gmx mdrun在具有两个节点的计算机上,使用总共四个列,每个列有六个OpenMP线程,并且两者都位于ID为0的共享GPU的节点上。

mpirun运行 -净现值 8 gmx_mpi(gmx _ mpi) mdrun软件 -ntomp公司  -gputasks公司 0000

使用与上述相同/类似的硬件,开始gmx mdrun在具有两个节点的计算机上,使用总共八个列,每个列有三个OpenMP线程,以及ID为0的共享GPU的节点上的所有四个列组。这可能比以前的设置快,也可能不快在相同的硬件上。

mpirun运行 -净现值 20 gmx_mpi(gmx _ mpi) MD运行 -ntomp公司 4 -gputasks公司 00

启动gmx mdrun具有20个等级,并平均分配CPU核心跨列每个到一个OpenMP线程。此设置可能是适用于有十个节点,每个节点有一个GPU,每个节点有两个插座,每个插座有四个芯。

mpirun运行 -净现值 10 gmx_mpi(gmx _ mpi) mdrun软件 -gpu id 1

开始gmx mdrun20列,平均分配CPU内核跨列每个到一个OpenMP线程。此设置可能是适用于有十个节点,每个节点有两个GPU,但另一个节点每个节点上的作业都使用GPU 0。作业调度程序应设置两个作业的线程与其分配的内核的亲缘关系,或性能mdrun软件将遭受巨大痛苦。

mpirun运行 -净现值 20 gmx_mpi(gmx _ mpi) mdrun软件 -gpu id 01

开始gmx mdrun排名20。这种设置很可能适用于有十个节点,每个节点有两个GPU,但无需指定-gpu id对于节点上所有GPU都可用的正常情况供使用。

避免因约束而进行沟通#

由于执行MD步骤所需的时间很短,特别是接近缩放限制时,任何通信都将由于延迟开销对性能有负面影响以及同步。大多数沟通都是不可避免的,但有时可以完全避免坐标通信用于约束。下面列出的要点将提高性能通常,在缩放时会产生特别强烈的影响极限约为~100个原子/核或~10000个原子/GPU。仿真这需要尽快完成,或者需要强大的基准应该牢记这些要点。

如果可能,应避免使用约束 = 所有债券带P-LINCS。这不仅需要大量沟通,而且设置域大小的人工最小值。如果您正在使用一个原子力场,积分时间步长为2fs,通常可以更改为约束约束 = 氢键而不更改其他设置。这些是实际上,大多数力场的参数化设置,所以这在科学上也更好。

完全避免因约束和/或更新运行在GPU上,系统需要支持所谓的“更新组”(或根本没有约束)。更新组是当涉及耦合约束的所有原子直接耦合到一个中心原子并连续有序,不与非应变原子相互分散。例如紧凑地描述了甲基。对于原子论力场具有约束 = h键这意味着在实践中在拓扑结构中,氢与其相连的重原子相邻。此外当存在虚拟站点时,构造原子应该全部约束在一起虚拟位点和构建原子应该是连续的,但顺序无关紧要。TIP4P水模型就是一个例子。日志文件中记录了是否使用了更新组。当它们无法使用时,还应说明禁用它们的原因。

了解如何运行mdrun软件更好的#

Wallcycle模块用于运行时性能测量gmx mdrun在每次运行的日志文件末尾,“实时周期和时间统计”部分为的不同部分提供了一个包含运行时统计信息的表gmx mdrun代码在表的行中。该表包含指示以下列的列:执行运行、墙时间和循环的相应部分count聚合(跨所有线程和列组)在整个运行期间的平均值。最后一列还显示了每行所占总运行时的百分比。请注意gmx mdrun定时器重置功能(-重置通道-重置步骤)重置性能计数器,因此对于避免启动开销和运行开始时性能不稳定(例如,由于负载平衡)。

性能计数器包括:

  • 粒子网格Ewald期间的粒子-粒子

  • 区域分解

  • 域分解通信负载

  • 域分解通信边界

  • 虚拟站点约束

  • 将X发送到粒子网格Ewald

  • 邻居搜索

  • 启动GPU操作

  • 坐标的交流

  • 武力

  • 等待+武力沟通

  • 颗粒网格Ewald

  • PME再贴现。X/F(X/F)

  • PME价差

  • PME集合

  • PME 3D-FFT公司

  • PME 3D-FFT通信

  • PME解决Lennard-Jones

  • PME解决LJ

  • PME解决方案

  • PME等待粒子粒子

  • 等待+接收PME强制

  • 等待GPU非本地

  • 等待GPU本地

  • 等待PME GPU扩散

  • 等待PME GPU收集

  • 减少PME GPU力量

  • 非绑定位置/力缓冲操作

  • 虚拟站点分布

  • COM拉力

  • AWH(加速重量直方图法)

  • 写入轨迹

  • 更新

  • 约束条件

  • 能量的传播

  • 强制旋转

  • 添加旋转力

  • 位置交换

  • 交互式MD

  • MD图

由于每次运行都会收集性能数据,因此这些数据对于评估和调整的性能gmx mdrun性能。因此,他们受益代码开发人员和程序用户。计数器是模拟拍摄的不同部分的时间/周期的平均值,因此,无法直接揭示单个运行期间的波动(尽管多次运行仍然非常有用)。

仅当代码的相关部分gmx mdrun运行。还有一个称为“Rest”的特殊计数器表示上面任何计数器都没有考虑的时间量。因此,大量的“休息”时间(超过百分之几)通常表示并行化效率低下(例如串行代码),建议向开发人员。

另外一组子计数器可以提供更精细的性能检查。他们是:

  • 域分解再分配

  • DD邻居搜索网格+排序

  • DD设置通信

  • DD生成拓扑

  • DD制造约束

  • DD拓扑其他

  • 本地邻居搜索网格

  • NS网格非本地

  • NS搜索本地

  • NS搜索非本地

  • 粘结力

  • 粘结FEP力

  • 约束力

  • 列出的缓冲操作

  • 非粘结修剪

  • 非结合力

  • 启动非绑定GPU任务

  • 启动PME GPU任务

  • 埃瓦尔德力修正

  • 非绑定位置缓冲操作

  • 非绑定力缓冲操作

子计数器面向开发人员,必须在编译期间启用。请参见构建系统概述了解更多信息。

正在运行mdrun软件带GPU#

GPU任务类型#

为了更好地理解以下关于不同GPU用例的章节计算短程项目管理工程师键合相互作用更新和约束我们首先介绍了不同GPU任务的概念。当思考运行一个模拟,原子之间的几种不同的相互作用必须进行计算(有关更多信息,请参阅参考手册)。因此,计算可以分为几个基本独立的不同部分(因此可以按任何顺序计算,例如顺序或并发计算),最后将他们各自的信息合并获得每个原子的最终作用力并传播系统的时间步长到下一个时间点。有关更好的理解,另请参阅部分区域分解

在MD步骤所需的所有计算中,GROMACS旨在自下而上优化每个步骤的性能从最低级别(SIMD单元、核心、插槽、加速器等)。因此,许多单独的计算单位是针对最低级别的硬件并行性进行了高度优化:SIMD单元。此外,GPU加速器用作联合处理器,一些工作可以是卸载的,与CPU同时计算在加速器设备上,结果被传送到CPU。目前,GROMACS支持GPU加速器卸载两个任务:短程实空间中的非键相互作用项目管理工程师

GROMACS支持两种主要的卸载模式:强制卸载和GPU驻留。前者涉及通过集成卸载部分或所有交互计算在CPU上(因此需要逐步数据移动)。在GPU驻留模式下通过卸载集成和约束(使用时),可以减少数据移动必要的。

强制浮出模式是更广泛支持的GPU加速模式支持多种GPU加速器的短程非保税卸载(NVIDIA、AMD和Intel)。这与大多数功能和并行模式,可用于扩展到大型机器。同时卸载短程非保税和远程PME对GPU加速器的工作在功能和并行化方面有一些限制兼容性(请参阅下面的部分).CUDA和SYCL支持卸载(大多数类型)绑定交互。CUDA和SYCL支持GPU驻留模式,但它还有其他限制中描述的GPU更新部分

近程非键相互作用的GPU计算#

使用GPU进行短程非键相互作用可以提供与仅使用CPU运行相比,大多数可用的加速。在这里,GPU充当了一个加速器,可以有效地并行化这样就减少了计算时间。

GPU加速PME计算#

GROMACS允许卸载PME计算到GPU,以进一步减少CPU上的负载并改善两者之间的使用重叠CPU和GPU。这里,除计算外,还将进行PME的求解与短程相互作用在同一GPU上的短程交互作用。

已知限制#

请再次注意以下列出的限制!

  • GPU上仅支持4的PME顺序。

  • 计算PME的多列(因此多个GPU)支持有限:混合模式下的实验PME分解(-pmefft系统 中央处理器)带有2022年发布的CUDA和自2023年发布CUDA或SYCL(当GROMACS使用袖珍咖啡豆赫夫特).

  • 仅支持动态积分器(即跳跃程序、Velocity Verlet、,随机动力学)

  • GPU上不支持LJ PME。

  • 构建GROMACS时没有GPU FFT库(-DGMX_GPU_FFT_LIBRARY=无),仅混合动力模式(-pmefft系统 中央处理器)支持。

GPU加速计算键合相互作用(CUDA和SYCL)#

GROMACS允许卸载PP的粘合部分兼容GPU的工作负载。这被视为PP的一部分工作,并要求短期非绑定任务也运行在GPU。通常,卸载具有性能优势绑定交互,特别是当每个GPU的CPU资源量相对较少(可能是因为CPU较弱或CPU很少在运行中分配给GPU的内核)或CPU上有其他计算时。后者的典型例子是自由能计算。

GPU加速约束计算和坐标更新(仅限CUDA和SYCL)#

GROMACS还可以执行坐标更新和(如果要求)GPU上的约束计算。这种并行化模式被称为“GPU-resident”,作为所有力和坐标数据可以在多个步骤(通常在温度/压力耦合或邻居搜索步骤)。GPU驻留模式允许在GPU上执行模拟步骤的所有(支持的)计算。这样做的好处是CPU主机和GPU之间的耦合更少在典型的MD步骤上,不需要在CPU和GPU之间传输数据与浮力方案相反,需要传递坐标和力CPU和GPU之间的每一步。然而,GPU驻留方案仍然能够进行部分计算CPU上同时进行GPU计算。这有助于支持GROMACS的广泛功能,但并非所有功能都是移植到GPU。同时,它还允许通过使用通常空闲的CPU。移动粘结的或PME计算返回到CPU,但其详细信息取决于如果CPU内核与GPU在模拟中配对,则为相对性能。

默认情况下(如果支持)启用GPU驻留模式在生成配置或模拟设置时回退到CPU更新与之不兼容。可以通过设置GMX_FORCE_UPDATE_DEFAULT_CPU环境变量。在这个遵循默认行为的案例模拟(即。-更新 汽车)将在CPU上运行更新。

在快速GPU与较慢的CPU一起使用,特别是当只有一个模拟分配给GPU时。然而,在典型的吞吐量情况下,将多个运行分配给每个GPU,卸载所有任务,尤其是在不将部分工作移回CPU的情况下与只卸载力计算的并行化模式相比,它的性能更差。

将任务分配给GPU#

根据应在哪个硬件上执行的任务根据信息,可以在相同或不同的GPU上组合计算为运行提供mdrun软件

可以将不同计算任务的计算分配给相同的GPU,这意味着它们将共享同一设备上的计算资源,或共享给不同的处理单元每个都将执行一项任务。

下面概述了可能的任务分配:

2018年GROMACS版本:

有两种不同类型的可分配GPU加速任务可用,(短程)非绑定任务和PME。每个PP列组都有一个可以卸载到GPU的非绑定任务。如果PME任务只有一个列组(包括如果该列组是PME-only rank),则可以将该任务卸载到GPU。这样的PME任务可以完全在GPU上运行,也可以使其后期阶段仅在CPU上运行。

限制是GPU上的PME不支持PME域分解,这样,只有一个PME任务可以卸载到单个GPU分配给单独的PME列组,而非绑定的可以分解并卸载到多个GPU。

2019年版GROMACS:

没有新的可分配GPU任务可用,但有任何绑定的交互可以在与PP任务的短期交互相同的GPU上运行。这可能受到-保税的标志。

GROMACS 2020版:

更新和约束可以在与PP任务的短期非绑定和绑定交互相同的GPU上运行。这可能受到-更新标志。

GROMACS版本2021/2022:

通信和辅助任务也可以在CUDA构建中卸载。在域分解晕交换和PP-PME通信中,代替通过CPU在GPU之间进行转移,直接GPU–可以进行GPU通信。作为光环交换的辅助任务,执行数据打包和解包也会卸载到GPU。在2021版本中,这由thread-MPI和2022版本支持它还支持使用支持GPU的MPI。默认情况下不启用直接GPU通信,可以使用触发这个GMX_ENABLE_DIRECT_GPU_COMM公司环境变量(只起作用在支持的系统上)。

GROMACS 2023版:

默认情况下,更新在GPU上运行,支持模拟设置;请注意,这仅适用于CUDA和SYCL,而不适用于OpenCL。

PME分解支持添加了额外的与并行化相关的辅助GPU任务,包括网格打包和缩减操作以及分布式GPU FFT计算。

添加了对CUDA-graphs调度的实验支持,它支持大多数不需要CPU强制计算的GPU驻留运行。

GPU任务的性能注意事项#

  1. 性能平衡取决于您的CPU内核的速度和数量与GPU的速度和数量相比。

  2. 驻留在GPU的并行化模式(卸载更新/约束)较少与强制卸载模式相比,对适当的CPU-GPU平衡更敏感。

  3. 使用慢速/老式GPU和/或快速/现代CPU核心,让CPU进行PME计算可能更有意义,GPU专注于非绑定计算。

  4. 使用快速/现代GPU和/或慢速/旧CPU,内核很少,让GPU进行PME通常会有所帮助。

  5. 将绑定工作卸载到GPU通常不会提高模拟性能因为高效的基于CPU的内核可以完成绑定计算在GPU完成其他卸载工作之前。因此,gmx mdrun当PME卸载时,将默认为无保税卸载。保税卸载可以提高性能的典型案例有:具有显著的结合功(例如纯脂质或大部分具有少量溶剂的聚合物系统),每个GPU的CPU内核非常少和/或很慢,或者当CPU其他计算(例如PME、自由能)。

  6. 在大多数现代硬件上,GPU驻留模式(默认)比强制卸载模式更快,尽管它可能会使CPU空闲。将绑定工作移回CPU(-保税的 中央处理器)是一个使用快速CPU的更好方法,而不是在CPU上留下集成和约束。唯一的例外可能是为每个GPU分配了大量仿真的多仿真。

  7. 在大多数情况下,直接GPU通信将优于分段通信(使用线程-MPI和MPI)。理想情况下,它应该与GPU驻留模式相结合,以实现最大效益。

  8. 唯一能确定哪种选择最适合你的机器是用来测试和检查性能的。

减少GPU加速运行的开销#

为了使CPU内核和GPU同时执行,任务如下在CPU核心时在GPU上异步启动和执行执行非卸载力计算(如计算结合力或自由能计算)。异步任务启动由GPU设备驱动程序和需要CPU参与。因此,调度GPU任务需要可以与其他CPU任务竞争的CPU资源并造成可能导致经济放缓的干扰。

CPU执行延迟是由启动GPU任务的延迟引起的,随着模拟ns/天的增加,开销可能变得很大(即每个步骤的墙时间更短)。启动GPU工作的成本由gmx mdrun并在演出中报道日志文件的摘要部分(“启动PP GPU ops.”/“启动PME GPU ops”行)。启动工作所花费的运行时间的百分之几是正常的,但在快速迭代和多GPU并行运行中,可以观察到10%或更高的成本。这是否会对性能产生重大影响取决于工作量在主MD步骤中分配给CPU。卸载了大部分或全部力计算,以及CPU不参与通信时(例如启用线程MPI和直接GPU通信)这可能是因为巨大的发射成本不会导致巨大的性能损失。然而,当CPU被分配计算时(例如在自由能或拉动/AWH模拟中)或者从CPU启动MPI通信(即使使用GPU感知的MPI)GPU启动成本将与其他CPU工作竞争,因此代表间接费用。一般来说,用户几乎无法避免此类开销,但在一些情况下,调整可以带来性能优势。在OpenCL运行中,默认情况下启用GPU任务计时,虽然在大多数情况下,它的影响很小,但在快速运行中,性能可能会受到影响。在这些情况下,当观察到超过百分之几的“启动GPU操作”时间时,建议通过设置GMX_DISABLE_GPU_TIMING公司环境变量。在多个列组共享GPU的并行运行中,启动更少的线程也可以减少启动开销-MPI或每个GPU的MPI等级;例如,通常每个线程或核心只有一个等级不是最佳的。CUDA图形功能(添加在GROMACS 2023中)旨在减少管理费用和提高GPU工作调度效率它可以提供显著的改进,特别是对于小型仿真系统在快速GPU上运行。由于它是一个新特性,在2023版本中支持CUDA-graph需要使用GMX_自定义_图形环境变量。

第二类开销,GPU运行时或驱动程序对CPU计算的干扰,是由GPU任务的调度和协调引起的。单独的GPU运行时/驱动程序线程需要CPU资源可能与同时运行的非卸载任务(如果存在)竞争,可能会降低此CPU工作的性能。为了最大限度地减少开销启动时至少保留一个未使用的CPU硬件线程gmx mdrun尤其是在启用了高内核数和/或同时多线程的CPU上。例如,在具有16核CPU和32个线程的机器上,尝试gmx公司 mdrun软件 -ntomp公司 31 -销 这将为GPU任务调度留下一些CPU资源可能减少对CPU计算的干扰。请注意,将较少的资源分配给gmx mdrunCPU计算涉及一种折衷,在每个GPU有许多CPU核的情况下,这种折衷可能并不显著,但在某些情况下(例如,多列MPI运行),这可能会导致复杂资源分配,并且可能超过减少GPU调度开销的益处,因此,我们建议在采用此类技术之前测试替代方案。

运行mdrun的OpenCL版本#

当前支持的硬件架构包括:

  • 基于GCN和基于CDNA的AMD GPU;

  • Volta之前的NVIDIA GPU;

  • Intel iGPU。

确保安装了最新的驱动程序。对于AMD GPU,面向计算机净资产收益率建议堆叠;或者,AMDGPU-PRO堆栈也兼容;使用过时的且不受支持fglrx公司不建议使用专用驱动程序和运行时(但对于某些较旧的硬件,这可能是获得支持的唯一途径)。此外,还支持带有LLVM 4.0或更新版本的Mesa版本17.0或更新版本。对于NVIDIA GPU,使用专用驱动程序是因为开源新驱动程序(在Mesa中可用)不需要提供OpenCL支持。对于Intel集成GPUNeo驱动程序推荐。

所需的最低OpenCL版本未知。请参见也包括已知限制

AMD GCN架构(所有系列)中的设备兼容并定期测试;NVIDIA开普勒及更高版本(计算能力3.0)已知是有效的,但在进行生产运行之前,始终确保GROMACS测试在硬件上成功通过。

OpenCL GPU内核是在运行时编译的。因此,构建OpenCL程序可能需要几秒钟的时间延迟gmx mdrun启动。这通常不是长时间生产MD的问题,但您可能更喜欢做一些只在CPU上运行很少的步骤(例如,请参阅-编号以上)。

相同的-gpu id选项(或GMX_GPU_ID环境变量)用于选择CUDA或SYCL设备,或定义GPU到PP的映射列组,用于OpenCL设备。

其他一些OpenCL管理环境开发人员可能会对变量感兴趣。

OpenCL支持的已知限制#

GROMACS用户感兴趣的当前OpenCL支持的局限性:

  • 支持Intel集成GPU。不支持Intel CPU和Xeon Phi。设置-DGMX_GPU_NB_CLUSTER_SIZE=4编译GROMACS以在使用者上运行时Intel GPU(与Ponte Vecchio/数据中心Max GPU相对)。

  • 由于一些异步任务排队函数的阻塞行为在NVIDIA OpenCL运行时中,受影响的驱动程序版本有使用NVIDIA GPU时几乎没有性能提升。该问题会影响NVIDIA驱动程序版本(349系列之前),但它已知已修复352和更高版本的驱动程序。

  • 在NVIDIA GPU上,OpenCL内核的性能要低得多由于NVIDIA OpenCL的限制,与等效的CUDA内核相比编译器。

  • 在NVIDIA Volta和Turing架构上,OpenCL代码可以生成驱动程序版本高达440.x时的错误结果(很可能是由于编译器问题)。这些体系结构上的运行通常会失败。

正在运行mdrun的SYCL版本#

确保安装了最新的驱动程序,并检查安装指南以获取兼容硬件和软件的列表以及推荐的编译时选项。

请记住以下可能有用的环境变量:

  • 使用oneAPI运行时时:

    • SYCL_CACHE_PERSISTENT=1:启用GPU内核缓存,减少gmx mdrun启动时间。

除了-gpu id选项,特定于后端的环境变量,如SYCL_DEVICE_过滤器ROCR_VISIBLE_DEVICES报告,可用于选择GPU。

性能检查表#

影响仿真性能的因素有很多格鲁马科斯。因此,大多数模拟需要大量计算资源优化这些资源的使用是值得的。几个问题以下列表中提到的可能会导致某个因素的性能差异第页,共2页。因此,仔细阅读检查表会很有用。

GROMACS配置#

  • 除非你确信自己需要,否则不要使用双精度。

  • 使用x86上的正确标志(大多数情况下)编译FFTW库在这种情况下,将自动配置正确的标志)。

  • 在x86上,使用gcc作为编译器(而不是icc、pgi或Cray编译器)。

  • 在POWER上,使用gcc而不是IBM的xlc。

  • 使用新的编译器版本,特别是对于gcc(例如从版本5到版本6编译后的代码的性能提高了很多)。

  • MPI库:OpenMPI通常具有良好的性能,并且几乎不会造成麻烦。

  • 确保编译器支持OpenMP(Clang的某些版本不支持)。

  • 如果您有支持CUDA、OpenCL或SYCL的GPU,请使用它们。

    • 使用配置-DGMX_GPU=古巴-DGMX_GPU=打开CL,或-DGMX_GPU=SYCL

    • 对于GPU,请使用适用于GPU的最新SDK来利用最新的性能增强。

    • 使用最新的GPU驱动程序。

    • 确保使用gmx mdrun具有GMX_SIMD公司适用于CPU建筑;如果使用次优设置,日志文件将包含警告注释。然而,更喜欢AVX2(平均值2)结束AVX512型在GPU或高度并行的MPI运行中(有关更多信息信息请参见核内并行化信息).

    • 如果在集群头节点上编译,请确保GMX_SIMD公司适用于计算节点。

运行安装程序#

  • 对于近似球形的溶质,使用菱形十二面体单元。

  • 当使用<=2.5 fs的时间步长时,使用约束=氢键(而不是约束=所有债券),自:

    • 这速度更快,尤其是使用GPU时;

    • 必须能够使用GPU驻留模式;

    • 大多数力场都是参数化的,只包含约束氢的键。

  • 通过重新分配氢,通常可以将时间步长增加到4 fs质量使用质量分割系数mdp选项。这不是影响平衡分布,但使动力学稍慢。

  • 使用虚拟交互时,可以将时间步长增加到4或5 fs站点(通用管理系统 pdb2gmx -辉橄榄岩 小时).

  • 对于与PME大规模并行运行,您可能需要尝试不同的数字PME排名(gmx公司 mdrun软件 -核动力装置 ???)实现最佳绩效;gmx音乐文件可以帮助自动化此搜索。

  • 对于大规模并行运行(也gmx公司 mdrun软件 -多对),或者用慢速网络,全球沟通可能成为瓶颈,你可以减少它通过为算法(如温度和压力联轴器)。

检查和改进性能#

  • 看一下md.log文件文件查看性能和周期MD计算不同部分的计数器和墙锁时间。这个PP/PME负载比也会打印出来,当大量性能由于不平衡而丢失。

  • 在以下情况下调整PME等级和/或截止线和PME网格间距PP/PME存在很大的不平衡。请注意,即使有少量报告不平衡,自动PME调整可能已经减少了初始不平衡。您仍然可以通过更改mdp参数或增加PME排名的数量。

  • (特别是)GPU驻留运行(-更新 全球采购单位):

    • 频繁的维里或能量计算可能会有很大的开销(这不会显示在循环计数器中)。要减少此开销,请增加非标准计算能量;

    • 频繁的温度或压力耦合可能会产生大量开销;为了减少这种情况,请确保在算法允许的范围内尽可能少地进行耦合(通常>=50-100步)。

  • 如果邻居搜索和/或域分解需要大量时间,请增加非甾体抗炎药列表如果是Verlet使用缓冲区容差,这由自动完成gmx mdrun增加对列表缓冲区以保持能量漂移恒定。

    • 特别是在多GPU运行时非甾体抗炎药列表mdrun软件启动可以是保守的,较大的值通常是最优的(例如。nstlist=200-300带有PME和默认Verlet缓冲区容差)。

    • 使用CUDA图时应避免nstlist的奇数值以最小化与图实例化相关的开销。

  • 如果通信。 能量花费大量时间(日志中会打印注释文件),增加nstcalcenergy公司

  • 如果所有的沟通都需要很多时间,那么你可能会占用太多时间或者您可以尝试使用2运行MPI/OpenMP并行化组合或每个MPI进程4个OpenMP线程。

  • 在多GPU运行中,避免使用与内核(或硬件线程)相同数量的列组,因为由于与多个MPI列组共享GPU相关的开销,这导致了一个主要的低效率。每个GPU最多使用几个等级,1-3级通常是最佳的;使用GPU驻留模式和直接GPU通信,通常1列/GPU是最好的。