Merge commit d30f2cb6 from release-2020 into master
[alexxy/gromacs.git] / docs / user-guide / mdrun-performance.rst
1 .. _gmx-performance:
2
3 Getting good performance from :ref:`mdrun <gmx mdrun>`
4 ======================================================
5
6 Here we give an overview on the parallelization and acceleration schemes employed by |Gromacs|.
7 The aim is to provide an understanding of the underlying mechanisms that make |Gromacs| one of the
8 fastest molecular dynamics packages. The information presented
9 should help choosing appropriate parallelization options, run configuration,
10 as well as acceleration options to achieve optimal simulation performance.
11
12
13 The |Gromacs| build system and the :ref:`gmx mdrun` tool have a lot of built-in
14 and configurable intelligence to detect your hardware and make pretty
15 effective use of it. For a lot of casual and serious use of
16 :ref:`gmx mdrun`, the automatic machinery works well enough. But to get the
17 most from your hardware to maximize your scientific quality, read on!
18
19 Hardware background information
20 -------------------------------
21 Modern computer hardware is complex and heterogeneous, so we need to
22 discuss a little bit of background information and set up some
23 definitions. Experienced HPC users can skip this section.
24
25 .. glossary::
26
27     core
28         A hardware compute unit that actually executes
29         instructions. There is normally more than one core in a
30         processor, often many more.
31
32     cache
33         A special kind of memory local to core(s) that is much faster
34         to access than main memory, kind of like the top of a human's
35         desk, compared to their filing cabinet. There are often
36         several layers of caches associated with a core.
37
38     socket
39         A group of cores that share some kind of locality, such as a
40         shared cache. This makes it more efficient to spread
41         computational work over cores within a socket than over cores
42         in different sockets. Modern processors often have more than
43         one socket.
44
45     node
46         A group of sockets that share coarser-level locality, such as
47         shared access to the same memory without requiring any network
48         hardware. A normal laptop or desktop computer is a node. A
49         node is often the smallest amount of a large compute cluster
50         that a user can request to use.
51
52     thread
53         A stream of instructions for a core to execute. There are many
54         different programming abstractions that create and manage
55         spreading computation over multiple threads, such as OpenMP,
56         pthreads, winthreads, CUDA, OpenCL, and OpenACC. Some kinds of
57         hardware can map more than one software thread to a core; on
58         Intel x86 processors this is called "hyper-threading", while
59         the more general concept is often called SMT for
60         "simultaneous multi-threading". IBM Power8 can for instance use
61         up to 8 hardware threads per core.
62         This feature can usually be enabled or disabled either in
63         the hardware bios or through a setting in the Linux operating
64         system. |Gromacs| can typically make use of this, for a moderate
65         free performance boost. In most cases it will be
66         enabled by default e.g. on new x86 processors, but in some cases
67         the system administrators might have disabled it. If that is the
68         case, ask if they can re-enable it for you. If you are not sure
69         if it is enabled, check the output of the CPU information in
70         the log file and compare with CPU specifications you find online.
71
72     thread affinity (pinning)
73         By default, most operating systems allow software threads to migrate
74         between cores (or hardware threads) to help automatically balance
75         workload. However, the performance of :ref:`gmx mdrun` can deteriorate
76         if this is permitted and will degrade dramatically especially when
77         relying on multi-threading within a rank. To avoid this,
78         :ref:`gmx mdrun` will by default
79         set the affinity of its threads to individual cores/hardware threads,
80         unless the user or software environment has already done so
81         (or not the entire node is used for the run, i.e. there is potential
82         for node sharing).
83         Setting thread affinity is sometimes called thread "pinning".
84
85     MPI
86         The dominant multi-node parallelization-scheme, which provides
87         a standardized language in which programs can be written that
88         work across more than one node.
89
90     rank
91         In MPI, a rank is the smallest grouping of hardware used in
92         the multi-node parallelization scheme. That grouping can be
93         controlled by the user, and might correspond to a core, a
94         socket, a node, or a group of nodes. The best choice varies
95         with the hardware, software and compute task. Sometimes an MPI
96         rank is called an MPI process.
97
98     GPU
99         A graphics processing unit, which is often faster and more
100         efficient than conventional processors for particular kinds of
101         compute workloads. A GPU is always associated with a
102         particular node, and often a particular socket within that
103         node.
104
105     OpenMP
106         A standardized technique supported by many compilers to share
107         a compute workload over multiple cores. Often combined with
108         MPI to achieve hybrid MPI/OpenMP parallelism.
109
110     CUDA
111         A proprietary parallel computing framework and API developed by NVIDIA
112         that allows targeting their accelerator hardware.
113         |Gromacs| uses CUDA for GPU acceleration support with NVIDIA hardware.
114
115     OpenCL
116         An open standard-based parallel computing framework that consists
117         of a C99-based compiler and a programming API for targeting heterogeneous
118         and accelerator hardware. |Gromacs| uses OpenCL for GPU acceleration
119         on AMD devices (both GPUs and APUs) and Intel integrated GPUs; NVIDIA
120         hardware is also supported.
121
122     SIMD
123         A type of CPU instruction by which modern CPU cores can execute multiple
124         floating-point instructions in a single cycle.
125
126
127 Work distribution by parallelization in |Gromacs|
128 -------------------------------------------------
129
130 The algorithms in :ref:`gmx mdrun` and their implementations are most relevant
131 when choosing how to make good use of the hardware. For details,
132 see the :ref:`Reference Manual <gmx-reference-manual-rst>`. The most important of these are
133
134 .. _gmx-domain-decomp:
135
136 .. glossary::
137
138     Domain Decomposition
139         The domain decomposition (DD) algorithm decomposes the
140         (short-ranged) component of the non-bonded interactions into
141         domains that share spatial locality, which permits the use of
142         efficient algorithms. Each domain handles all of the
143         particle-particle (PP) interactions for its members, and is
144         mapped to a single MPI rank. Within a PP rank, OpenMP threads
145         can share the workload, and some work can be offloaded to a
146         GPU. The PP rank also handles any bonded interactions for the
147         members of its domain. A GPU may perform work for more than
148         one PP rank, but it is normally most efficient to use a single
149         PP rank per GPU and for that rank to have thousands of
150         particles. When the work of a PP rank is done on the CPU,
151         :ref:`mdrun <gmx mdrun>` will make extensive use of the SIMD
152         capabilities of the core. There are various
153         :ref:`command-line options <controlling-the-domain-decomposition-algorithm>`
154         to control the behaviour of the DD algorithm.
155
156     Particle-mesh Ewald
157         The particle-mesh Ewald (PME) algorithm treats the long-ranged
158         component of the non-bonded interactions (Coulomb and possibly also
159         Lennard-Jones).  Either all, or just a subset of ranks may
160         participate in the work for computing the long-ranged component
161         (often inaccurately called simply the "PME"
162         component). Because the algorithm uses a 3D FFT that requires
163         global communication, its parallel efficiency gets worse as more ranks
164         participate, which can mean it is fastest to use just a subset
165         of ranks (e.g.  one-quarter to one-half of the ranks). If
166         there are separate PME ranks, then the remaining ranks handle
167         the PP work. Otherwise, all ranks do both PP and PME work.
168
169 Parallelization schemes
170 -----------------------
171
172 |Gromacs|, being performance-oriented, has a strong focus on efficient parallelization.
173 There are multiple parallelization schemes available, therefore a simulation can be run on a
174 given hardware with different choices of run configuration.
175
176 .. _intra-core-parallelization:
177
178 Intra-core parallelization via SIMD: SSE, AVX, etc.
179 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
180
181 One level of performance improvement available in |Gromacs| is through the use of
182 ``Single Instruction Multiple Data (SIMD)`` instructions. In detail information
183 for those can be found under :ref:`SIMD support <gmx-simd-support>` in the installation
184 guide.
185
186 In |Gromacs|, SIMD instructions are used to parallelize the parts of the code with
187 the highest impact on performance (nonbonded and bonded force calculation,
188 PME and neighbour searching), through the use of hardware specific SIMD kernels.
189 Those form one of the three levels of non-bonded kernels that are available: reference or generic
190 kernels (slow but useful for producing reference values for testing),
191 optimized plain-C kernels (can be used cross-platform but still slow)
192 and SIMD intrinsics accelerated kernels.
193
194 The SIMD intrinsic code is compiled by the compiler.
195 Technically, it is possible to compile different levels of acceleration into one binary,
196 but this is difficult to manage with acceleration in many parts of the code.
197 Thus, you need to configure and compile |Gromacs| for the SIMD capabilities of the target CPU.
198 By default, the build system will detect the highest supported
199 acceleration of the host where the compilation is carried out. For cross-compiling for
200 a machine with a different highest SIMD instructions set, in order to set the target acceleration,
201 the ``-DGMX_SIMD`` CMake option can be used.
202 To use a single
203 installation on multiple different machines, it is convenient to compile the analysis tools with
204 the lowest common SIMD instruction set (as these rely little on SIMD acceleration), but for best
205 performance :ref:`mdrun <gmx mdrun>` should be compiled be compiled separately with the
206 highest (latest) ``native`` SIMD instruction set of the target architecture (supported by |Gromacs|).
207
208 Recent Intel CPU architectures bring tradeoffs between the maximum clock frequency of the
209 CPU (ie. its speed), and the width of the SIMD instructions it executes (ie its throughput
210 at a given speed). In particular, the Intel ``Skylake`` and ``Cascade Lake`` processors
211 (e.g. Xeon SP Gold/Platinum), can offer better throughput when using narrower SIMD because
212 of the better clock frequency available. Consider building :ref:`mdrun <gmx mdrun>`
213 configured with ``GMX_SIMD=AVX2_256`` instead of ``GMX_SIMD=AVX512`` for better
214 performance in GPU accelerated or highly parallel MPI runs.
215
216 Process(-or) level parallelization via OpenMP
217 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
218
219 |Gromacs| :ref:`mdrun <gmx mdrun>` supports OpenMP multithreading for all parts
220 of the code. OpenMP is enabled by default and
221 can be turned on/off at configure time with the ``GMX_OPENMP`` CMake variable
222 and at run-time with the ``-ntomp`` option (or the ``OMP_NUM_THREADS`` environment variable).
223 The OpenMP implementation is quite efficient and scales well for up to 12-24 threads on
224 Intel and 6-8 threads on AMD CPUs.
225
226 Node level parallelization via GPU offloading and thread-MPI
227 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
228
229 Multithreading with thread-MPI
230 ..............................
231
232 The thread-MPI library implements a subset of the MPI 1.1 specification,
233 based on the system threading support. Both POSIX pthreads and Windows threads are supported,
234 thus providing great portability to most UNIX/Linux and Windows operating systems.
235 Acting as a drop-in replacement for MPI, thread-MPI enables compiling and running :ref:`mdrun <gmx mdrun>`
236 on a single machine (i.e. not across a network) without MPI. Additionally, it not only provides a
237 convenient way to use computers with multicore CPU(s), but thread-MPI does in some
238 cases make :ref:`mdrun <gmx mdrun>` run slightly faster than with MPI.
239
240 Thread-MPI is included in the |Gromacs| source and it is the default parallelization since
241 version 4.5, practically rendering the serial :ref:`mdrun <gmx mdrun>` deprecated.
242 Compilation with thread-MPI is controlled by the ``GMX_THREAD_MPI`` CMake variable.
243
244 Thread-MPI is compatible with most :ref:`mdrun <gmx mdrun>` features and parallelization schemes,
245 including OpenMP, GPUs; it is not compatible with MPI and multi-simulation runs.
246
247 By default, the thread-MPI mdrun will use all available cores in the machine by starting
248 an appropriate number of ranks or OpenMP threads to occupy all of them. The number of
249 ranks can be controlled using the
250 ``-nt`` and ``-ntmpi`` options. ``-nt`` represents the total number of threads
251 to be used (which can be a mix of thread-MPI and OpenMP threads.
252
253 Hybrid/heterogeneous acceleration
254 .................................
255
256 Hybrid acceleration means distributing compute work between available CPUs and GPUs
257 to improve simulation performance. New non-bonded algorithms
258 have been developed with the aim of efficient acceleration both on CPUs and GPUs.
259
260 The most compute-intensive parts of simulations, non-bonded force calculation, as well
261 as possibly the PME, bonded force calculation and update and constraints can be
262 offloaded to GPUs and carried out simultaneously with remaining CPU work.
263 Native GPU acceleration is supported for the most commonly used algorithms in
264 |Gromacs|.
265 For more information about the GPU kernels, please see the :ref:`Installation guide <gmx-gpu-support>`.
266
267 The native GPU acceleration can be turned on or off, either at run-time using the
268 :ref:`mdrun <gmx mdrun>` ``-nb`` option, or at configuration time using the ``GMX_GPU`` CMake variable.
269
270 To efficiently use all compute resource available, CPU and GPU computation is done simultaneously.
271 Overlapping with the OpenMP multithreaded bonded force and PME long-range electrostatic calculations
272 on the CPU, non-bonded forces are calculated on the GPU. Multiple GPUs, both in a single node as
273 well as across multiple nodes, are supported using domain-decomposition. A single GPU is assigned
274 to the non-bonded workload of a domain, therefore, the number GPUs used has to match the number
275 of of MPI processes (or thread-MPI threads) the simulation is started with. The available
276 CPU cores are partitioned among the processes (or thread-MPI threads) and a set of cores
277 with a GPU do the calculations on the respective domain.
278
279 With PME electrostatics, :ref:`mdrun <gmx mdrun>` supports automated CPU-GPU load-balancing by
280 shifting workload from the PME mesh calculations, done on the CPU, to the particle-particle
281 non-bonded calculations, done on the GPU. At startup a few iterations of tuning are executed
282 during the first 100 to 1000 MD steps. These iterations involve scaling the electrostatics cut-off
283 and PME grid spacing to determine the value that gives optimal CPU-GPU load balance. The cut-off
284 value provided using the :mdp:`rcoulomb` ``=rvdw`` :ref:`mdp` option represents the minimum
285 electrostatics cut-off the tuning starts with and therefore should be chosen as small as
286 possible (but still reasonable for the physics simulated). The Lennard-Jones cut-off ``rvdw``
287 is kept fixed. We don't allow scaling to shorter cut-off as we don't want to change ``rvdw``
288 and there would be no performance gain.
289
290 While the automated CPU-GPU load balancing always attempts to find the optimal cut-off setting,
291 it might not always be possible to balance CPU and GPU workload. This happens when the CPU threads
292 finish calculating the bonded forces and PME faster than the GPU the non-bonded force calculation,
293 even with the shortest possible cut-off. In such cases the CPU will wait for the GPU and this
294 time will show up as ``Wait GPU local`` in the cycle and timing summary table at the end
295 of the log file.
296
297 Parallelization over multiple nodes via MPI
298 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
299
300 At the heart of the MPI parallelization in |Gromacs| is the neutral-territory
301 :ref:`domain decomposition <gmx-domain-decomp>` with dynamic load balancing.
302 To parallelize simulations across multiple machines (e.g. nodes of a cluster)
303 :ref:`mdrun <gmx mdrun>` needs to be compiled with MPI which can be enabled using the ``GMX_MPI`` CMake variable.
304
305 .. _controlling-the-domain-decomposition-algorithm:
306
307 Controlling the domain decomposition algorithm
308 ..............................................
309
310 This section lists options that affect how the domain
311 decomposition algorithm decomposes the workload to the available
312 parallel hardware.
313
314 ``-rdd``
315     Can be used to set the required maximum distance for inter
316     charge-group bonded interactions. Communication for two-body
317     bonded interactions below the non-bonded cut-off distance always
318     comes for free with the non-bonded communication. Particles beyond
319     the non-bonded cut-off are only communicated when they have
320     missing bonded interactions; this means that the extra cost is
321     minor and nearly independent of the value of ``-rdd``. With dynamic
322     load balancing, option ``-rdd`` also sets the lower limit for the
323     domain decomposition cell sizes. By default ``-rdd`` is determined
324     by :ref:`gmx mdrun` based on the initial coordinates. The chosen value will
325     be a balance between interaction range and communication cost.
326
327 ``-ddcheck``
328     On by default. When inter charge-group bonded interactions are
329     beyond the bonded cut-off distance, :ref:`gmx mdrun` terminates with an
330     error message. For pair interactions and tabulated bonds that do
331     not generate exclusions, this check can be turned off with the
332     option ``-noddcheck``.
333
334 ``-rcon``
335     When constraints are present, option ``-rcon`` influences
336     the cell size limit as well.
337     Particles connected by NC constraints, where NC is the LINCS order
338     plus 1, should not be beyond the smallest cell size. A error
339     message is generated when this happens, and the user should change
340     the decomposition or decrease the LINCS order and increase the
341     number of LINCS iterations.  By default :ref:`gmx mdrun` estimates the
342     minimum cell size required for P-LINCS in a conservative
343     fashion. For high parallelization, it can be useful to set the
344     distance required for P-LINCS with ``-rcon``.
345
346 ``-dds``
347     Sets the minimum allowed x, y and/or z scaling of the cells with
348     dynamic load balancing. :ref:`gmx mdrun` will ensure that the cells can
349     scale down by at least this factor. This option is used for the
350     automated spatial decomposition (when not using ``-dd``) as well as
351     for determining the number of grid pulses, which in turn sets the
352     minimum allowed cell size. Under certain circumstances the value
353     of ``-dds`` might need to be adjusted to account for high or low
354     spatial inhomogeneity of the system.
355
356
357
358 Multi-level parallelization: MPI and OpenMP
359 ...........................................
360
361 The multi-core trend in CPU development substantiates the need for multi-level parallelization.
362 Current multiprocessor machines can have 2-4 CPUs with a core count as high as 64. As the memory
363 and cache subsystem is lagging more and more behind the multicore evolution, this emphasizes
364 non-uniform memory access (NUMA) effects, which can become a performance bottleneck. At the same
365 time, all cores share a network interface. In a purely MPI-parallel scheme, all MPI processes
366 use the same network interface, and although MPI intra-node communication is generally efficient,
367 communication between nodes can become a limiting factor to parallelization. This is especially
368 pronounced in the case of highly parallel simulations with PME (which is very communication
369 intensive) and with ``''fat''`` nodes connected by a slow network. Multi-level parallelism aims
370 to address the NUMA and communication related issues by employing efficient
371 intra-node parallelism, typically multithreading.
372
373 Combining OpenMP with MPI creates an additional overhead
374 especially when running separate multi-threaded PME ranks. Depending on the architecture,
375 input system size, as well as other factors, MPI+OpenMP runs can be as fast and faster
376 already at small number of processes (e.g. multi-processor Intel Westmere or Sandy Bridge),
377 but can also be considerably slower (e.g. multi-processor AMD Interlagos machines). However,
378 there is a more pronounced benefit of multi-level parallelization in highly parallel runs.
379
380 Separate PME ranks
381 ^^^^^^^^^^^^^^^^^^
382
383 On CPU ranks, particle-particle (PP) and PME calculations are done in the same process one after
384 another. As PME requires all-to-all global communication, this is most of the time the limiting
385 factor to scaling on a large number of cores. By designating a subset of ranks for PME
386 calculations only, performance of parallel runs can be greatly improved.
387
388 OpenMP mutithreading in PME ranks is also possible.
389 Using multi-threading in PME can can improve performance at high
390 parallelization. The reason for this is that with N>1 threads the number of processes
391 communicating, and therefore the number of messages, is reduced by a factor of N.
392 But note that modern communication networks can process several messages simultaneously,
393 such that it could be advantageous to have more processes communicating.
394
395 Separate PME ranks are not used at low parallelization, the switch at higher parallelization
396 happens automatically (at > 16 processes). The number of PME ranks is estimated by mdrun.
397 If the PME load is higher than the PP load, mdrun will automatically balance the load, but
398 this leads to additional (non-bonded) calculations. This avoids the idling of a large fraction
399 of the ranks; usually 3/4 of the ranks are PP ranks. But to ensure the best absolute performance
400 of highly parallel runs, it is advisable to tweak this number which is automated by
401 the :ref:`tune_pme <gmx tune_pme>` tool.
402
403 The number of PME ranks can be set manually on the :ref:`mdrun <gmx mdrun>` command line using the ``-npme``
404 option, the number of PME threads can be specified on the command line with ``-ntomp_pme`` or
405 alternatively using the ``GMX_PME_NUM_THREADS`` environment variable. The latter is especially
406 useful when running on compute nodes with different number of cores as it enables
407 setting different number of PME threads on different nodes.
408
409 Running :ref:`mdrun <gmx mdrun>` within a single node
410 -----------------------------------------------------
411
412 :ref:`gmx mdrun` can be configured and compiled in several different ways that
413 are efficient to use within a single :term:`node`. The default configuration
414 using a suitable compiler will deploy a multi-level hybrid parallelism
415 that uses CUDA, OpenMP and the threading platform native to the
416 hardware. For programming convenience, in |Gromacs|, those native
417 threads are used to implement on a single node the same MPI scheme as
418 would be used between nodes, but much more efficient; this is called
419 thread-MPI. From a user's perspective, real MPI and thread-MPI look
420 almost the same, and |Gromacs| refers to MPI ranks to mean either kind,
421 except where noted. A real external MPI can be used for :ref:`gmx mdrun` within
422 a single node, but runs more slowly than the thread-MPI version.
423
424 By default, :ref:`gmx mdrun` will inspect the hardware available at run time
425 and do its best to make fairly efficient use of the whole node. The
426 log file, stdout and stderr are used to print diagnostics that
427 inform the user about the choices made and possible consequences.
428
429 A number of command-line parameters are available to modify the default
430 behavior.
431
432 ``-nt``
433     The total number of threads to use. The default, 0, will start as
434     many threads as available cores. Whether the threads are
435     thread-MPI ranks, and/or OpenMP threads within such ranks depends on
436     other settings.
437
438 ``-ntmpi``
439     The total number of thread-MPI ranks to use. The default, 0,
440     will start one rank per GPU (if present), and otherwise one rank
441     per core.
442
443 ``-ntomp``
444     The total number of OpenMP threads per rank to start. The
445     default, 0, will start one thread on each available core.
446     Alternatively, :ref:`mdrun <gmx mdrun>` will honor the appropriate system
447     environment variable (e.g. ``OMP_NUM_THREADS``) if set.
448     Note that the maximum number of OpenMP threads (per rank) is,
449     for efficiency reasons, limited to 64. While it is rarely beneficial to use
450     a number of threads higher than this, the GMX_OPENMP_MAX_THREADS CMake variable
451     can be used to increase the limit.
452
453 ``-npme``
454     The total number of ranks to dedicate to the long-ranged
455     component of PME, if used. The default, -1, will dedicate ranks
456     only if the total number of threads is at least 12, and will use
457     around a quarter of the ranks for the long-ranged component.
458
459 ``-ntomp_pme``
460     When using PME with separate PME ranks,
461     the total number of OpenMP threads per separate PME rank.
462     The default, 0, copies the value from ``-ntomp``.
463
464 ``-pin``
465     Can be set to "auto," "on" or "off" to control whether
466     :ref:`mdrun <gmx mdrun>` will attempt to set the affinity of threads to cores.
467     Defaults to "auto," which means that if :ref:`mdrun <gmx mdrun>` detects that all the
468     cores on the node are being used for :ref:`mdrun <gmx mdrun>`, then it should behave
469     like "on," and attempt to set the affinities (unless they are
470     already set by something else).
471
472 ``-pinoffset``
473     If ``-pin on``, specifies the logical core number to
474     which :ref:`mdrun <gmx mdrun>` should pin the first thread. When running more than
475     one instance of :ref:`mdrun <gmx mdrun>` on a node, use this option to to avoid
476     pinning threads from different :ref:`mdrun <gmx mdrun>` instances to the same core.
477
478 ``-pinstride``
479     If ``-pin on``, specifies the stride in logical core
480     numbers for the cores to which :ref:`mdrun <gmx mdrun>` should pin its threads. When
481     running more than one instance of :ref:`mdrun <gmx mdrun>` on a node, use this option
482     to avoid pinning threads from different :ref:`mdrun <gmx mdrun>` instances to the
483     same core.  Use the default, 0, to minimize the number of threads
484     per physical core - this lets :ref:`mdrun <gmx mdrun>` manage the hardware-, OS- and
485     configuration-specific details of how to map logical cores to
486     physical cores.
487
488 ``-ddorder``
489     Can be set to "interleave," "pp_pme" or "cartesian."
490     Defaults to "interleave," which means that any separate PME ranks
491     will be mapped to MPI ranks in an order like PP, PP, PME, PP, PP,
492     PME, etc. This generally makes the best use of the available
493     hardware. "pp_pme" maps all PP ranks first, then all PME
494     ranks. "cartesian" is a special-purpose mapping generally useful
495     only on special torus networks with accelerated global
496     communication for Cartesian communicators. Has no effect if there
497     are no separate PME ranks.
498
499 ``-nb``
500     Used to set where to execute the short-range non-bonded interactions.
501     Can be set to "auto", "cpu", "gpu."
502     Defaults to "auto," which uses a compatible GPU if available.
503     Setting "cpu" requires that no GPU is used. Setting "gpu" requires
504     that a compatible GPU is available and will be used.
505
506 ``-pme``
507     Used to set where to execute the long-range non-bonded interactions.
508     Can be set to "auto", "cpu", "gpu."
509     Defaults to "auto," which uses a compatible GPU if available.
510     Setting "gpu" requires that a compatible GPU is available.
511     Multiple PME ranks are not supported with PME on GPU, so if a GPU is used
512     for the PME calculation -npme must be set to 1.
513
514 ``-bonded``
515     Used to set where to execute the bonded interactions that are part of the
516     PP workload for a domain.
517     Can be set to "auto", "cpu", "gpu."
518     Defaults to "auto," which uses a compatible CUDA GPU only when one
519     is available, a GPU is handling short-ranged interactions, and the
520     CPU is handling long-ranged interaction work (electrostatic or
521     LJ). The work for the bonded interactions takes place on the same
522     GPU as the short-ranged interactions, and cannot be independently
523     assigned.
524     Setting "gpu" requires that a compatible GPU is available and will
525     be used.
526
527 ``-update``
528     Used to set where to execute update and constraints, when present.
529     Can be set to "auto", "cpu", "gpu."
530     Defaults to "auto," which currently always uses the CPU.
531     Setting "gpu" requires that a compatible CUDA GPU is available,
532     the simulation is run as a single thread-MPI thread
533     and that the |Gromacs| binary is not compiled with real MPI.
534     Update and constraints on a GPU is currently not supported
535     with free-energy, domain decomposition, virtual sites,
536     Ewald surface correction, replica exchange, the pull code,
537     orientation restraints and computational electrophysiology.
538     It is possible to extend the ``-update`` functionality by
539     setting the ``GMX_FORCE_UPDATE_DEFAULT_GPU`` flag to change
540     the default path to use the GPU update if the simulation is
541     compatible.
542
543 ``-gpu_id``
544     A string that specifies the ID numbers of the GPUs that
545     are available to be used by ranks on each node. For example,
546     "12" specifies that the GPUs with IDs 1 and 2 (as reported
547     by the GPU runtime) can be used by :ref:`mdrun <gmx mdrun>`. This is useful
548     when sharing a node with other computations, or if a GPU that
549     is dedicated to a display should not be used by |Gromacs|.
550     Without specifying this parameter, :ref:`mdrun <gmx mdrun>`
551     will utilize all GPUs. When many GPUs are
552     present, a comma may be used to separate the IDs, so
553     "12,13" would make GPUs 12 and 13 available to :ref:`mdrun <gmx mdrun>`.
554     It could be necessary to use different GPUs on different
555     nodes of a simulation, in which case the environment
556     variable ``GMX_GPU_ID`` can be set differently for the ranks
557     on different nodes to achieve that result.
558     In |Gromacs| versions preceding 2018 this parameter used to
559     specify both GPU availability and GPU task assignment.
560     The latter is now done with the ``-gputasks`` parameter.
561
562 ``-gputasks``
563     A string that specifies the ID numbers of the GPUs to be
564     used by corresponding GPU tasks on this node. For example,
565     "0011" specifies that the first two GPU tasks will use GPU 0,
566     and the other two use GPU 1. When using this option, the
567     number of ranks must be known to :ref:`mdrun <gmx mdrun>`, as well as where
568     tasks of different types should be run, such as by using
569     ``-nb gpu`` - only the tasks which are set to run on GPUs
570     count for parsing the mapping. See `Assigning tasks to GPUs`_
571     for more details. Note that ``-gpu_id`` and
572     ``-gputasks`` can not be used at the same time!
573     In |Gromacs| versions preceding 2018 only a single type
574     of GPU task ("PP") could be run on any rank. Now that there is some
575     support for running PME on GPUs, the number of GPU tasks
576     (and the number of GPU IDs expected in the ``-gputasks`` string)
577     can actually be 3 for a single-rank simulation. The IDs
578     still have to be the same in this case, as using multiple GPUs
579     per single rank is not yet implemented.
580     The order of GPU tasks per rank in the string is PP first,
581     PME second. The order of ranks with different kinds of GPU tasks
582     is the same by default, but can be influenced with the ``-ddorder``
583     option and gets quite complex when using multiple nodes.
584     Note that the bonded interactions for a PP task may
585     run on the same GPU as the short-ranged work, or on the CPU,
586     which can be controlled with the ``-bonded`` flag.
587     The GPU task assignment (whether manually set, or automated),
588     will be reported in the :ref:`mdrun <gmx mdrun>` output on
589     the first physical node of the simulation. For example:
590
591     ::
592
593       gmx mdrun -gputasks 0001 -nb gpu -pme gpu -npme 1 -ntmpi 4
594
595     will produce the following output in the log file/terminal:
596
597     ::
598
599       On host tcbl14 2 GPUs selected for this run.
600       Mapping of GPU IDs to the 4 GPU tasks in the 4 ranks on this node:
601       PP:0,PP:0,PP:0,PME:1
602
603     In this case, 3 ranks are set by user to compute PP work
604     on GPU 0, and 1 rank to compute PME on GPU 1.
605     The detailed indexing of the GPUs is also reported in the log file.
606
607     For more information about GPU tasks, please refer to
608     :ref:`Types of GPU tasks<gmx-gpu-tasks>`.
609
610 ``-pmefft``
611     Allows choosing whether to execute the 3D FFT computation on a CPU or GPU.
612     Can be set to "auto", "cpu", "gpu.".
613     When PME is offloaded to a GPU ``-pmefft gpu`` is the default,
614     and the entire PME calculation is executed on the GPU. However,
615     in some cases, e.g. with a relatively slow or older generation GPU
616     combined with fast CPU cores in a run, moving some work off of the GPU
617     back to the CPU by computing FFTs on the CPU can improve performance.
618
619 .. _gmx-mdrun-single-node:
620
621 Examples for :ref:`mdrun <gmx mdrun>` on one node
622 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
623
624 ::
625
626     gmx mdrun
627
628 Starts :ref:`mdrun <gmx mdrun>` using all the available resources. :ref:`mdrun <gmx mdrun>`
629 will automatically choose a fairly efficient division
630 into thread-MPI ranks, OpenMP threads and assign work
631 to compatible GPUs. Details will vary with hardware
632 and the kind of simulation being run.
633
634 ::
635
636     gmx mdrun -nt 8
637
638 Starts :ref:`mdrun <gmx mdrun>` using 8 threads, which might be thread-MPI
639 or OpenMP threads depending on hardware and the kind
640 of simulation being run.
641
642 ::
643
644     gmx mdrun -ntmpi 2 -ntomp 4
645
646 Starts :ref:`mdrun <gmx mdrun>` using eight total threads, with two thread-MPI
647 ranks and four OpenMP threads per rank. You should only use
648 these options when seeking optimal performance, and
649 must take care that the ranks you create can have
650 all of their OpenMP threads run on the same socket.
651 The number of ranks should be a multiple of the number of
652 sockets, and the number of cores per node should be
653 a multiple of the number of threads per rank.
654
655 ::
656
657     gmx mdrun -ntmpi 4 -nb gpu -pme cpu
658
659 Starts :ref:`mdrun <gmx mdrun>` using four thread-MPI ranks. The CPU
660 cores available will be split evenly between the ranks using OpenMP
661 threads. The long-range component of the forces are calculated on
662 CPUs. This may be optimal on hardware where the CPUs are relatively
663 powerful compared to the GPUs. The bonded part of force calculation
664 will automatically be assigned to the GPU, since the long-range
665 component of the forces are calculated on CPU(s).
666
667 ::
668
669     gmx mdrun -ntmpi 1 -nb gpu -pme gpu -bonded gpu -update gpu
670
671 Starts :ref:`mdrun <gmx mdrun>` using a single thread-MPI rank that
672 will use all available CPU cores. All interaction types that can run
673 on a GPU will do so. This may be optimal on hardware where the CPUs
674 are extremely weak compared to the GPUs.
675
676 ::
677
678     gmx mdrun -ntmpi 4 -nb gpu -pme cpu -gputasks 0011
679
680 Starts :ref:`mdrun <gmx mdrun>` using four thread-MPI ranks, and maps them
681 to GPUs with IDs 0 and 1. The CPU cores available will be split evenly between
682 the ranks using OpenMP threads, with the first two ranks offloading short-range
683 nonbonded force calculations to GPU 0, and the last two ranks offloading to GPU 1.
684 The long-range component of the forces are calculated on CPUs. This may be optimal
685 on hardware where the CPUs are relatively powerful compared to the GPUs.
686
687 ::
688
689     gmx mdrun -ntmpi 4 -nb gpu -pme gpu -npme 1 -gputasks 0001
690
691 Starts :ref:`mdrun <gmx mdrun>` using four thread-MPI ranks, one of which is
692 dedicated to the long-range PME calculation. The first 3 threads offload their
693 short-range non-bonded calculations to the GPU with ID 0, the 4th (PME) thread
694 offloads its calculations to the GPU with ID 1.
695
696 ::
697
698     gmx mdrun -ntmpi 4 -nb gpu -pme gpu -npme 1 -gputasks 0011
699
700 Similar to the above example, with 3 ranks assigned to calculating short-range
701 non-bonded forces, and one rank assigned to calculate the long-range forces.
702 In this case, 2 of the 3 short-range ranks offload their nonbonded force
703 calculations to GPU 0. The GPU with ID 1 calculates the short-ranged forces of
704 the 3rd short-range rank, as well as the long-range forces of the PME-dedicated
705 rank. Whether this or the above example is optimal will depend on the capabilities
706 of the individual GPUs and the system composition.
707
708 ::
709
710     gmx mdrun -gpu_id 12
711
712 Starts :ref:`mdrun <gmx mdrun>` using GPUs with IDs 1 and 2 (e.g. because
713 GPU 0 is dedicated to running a display). This requires
714 two thread-MPI ranks, and will split the available
715 CPU cores between them using OpenMP threads.
716
717 ::
718
719     gmx mdrun -nt 6 -pin on -pinoffset 0 -pinstride 1
720     gmx mdrun -nt 6 -pin on -pinoffset 6 -pinstride 1
721
722 Starts two :ref:`mdrun <gmx mdrun>` processes, each with six total threads
723 arranged so that the processes affect each other as little as possible by
724 being assigned to disjoint sets of physical cores.
725 Threads will have their affinities set to particular
726 logical cores, beginning from the first and 7th logical cores, respectively. The
727 above would work well on an Intel CPU with six physical cores and
728 hyper-threading enabled. Use this kind of setup only
729 if restricting :ref:`mdrun <gmx mdrun>` to a subset of cores to share a
730 node with other processes.
731 A word of caution: The mapping of logical CPUs/cores to physical
732 cores may differ between operating systems. On Linux,
733 ``cat /proc/cpuinfo`` can be examined to determine this mapping.
734
735 ::
736
737     mpirun -np 2 gmx_mpi mdrun
738
739 When using an :ref:`gmx mdrun` compiled with external MPI,
740 this will start two ranks and as many OpenMP threads
741 as the hardware and MPI setup will permit. If the
742 MPI setup is restricted to one node, then the resulting
743 :ref:`gmx mdrun` will be local to that node.
744
745 .. _gmx-mdrun-multiple-nodes:
746
747 Running :ref:`mdrun <gmx mdrun>` on more than one node
748 ------------------------------------------------------
749
750 This requires configuring |Gromacs| to build with an external MPI
751 library. By default, this :ref:`mdrun <gmx mdrun>` executable is run with
752 :ref:`mdrun_mpi`. All of the considerations for running single-node
753 :ref:`mdrun <gmx mdrun>` still apply, except that ``-ntmpi`` and ``-nt`` cause a fatal
754 error, and instead the number of ranks is controlled by the
755 MPI environment.
756 Settings such as ``-npme`` are much more important when
757 using multiple nodes. Configuring the MPI environment to
758 produce one rank per core is generally good until one
759 approaches the strong-scaling limit. At that point, using
760 OpenMP to spread the work of an MPI rank over more than one
761 core is needed to continue to improve absolute performance.
762 The location of the scaling limit depends on the processor,
763 presence of GPUs, network, and simulation algorithm, but
764 it is worth measuring at around ~200 particles/core if you
765 need maximum throughput.
766
767 There are further command-line parameters that are relevant in these
768 cases.
769
770 ``-tunepme``
771     Defaults to "on." If "on," a simulation will
772     optimize various aspects of the PME and DD algorithms, shifting
773     load between ranks and/or GPUs to maximize throughput. Some
774     :ref:`mdrun <gmx mdrun>` features are not compatible with this, and these ignore
775     this option.
776
777 ``-dlb``
778     Can be set to "auto," "no," or "yes."
779     Defaults to "auto." Doing Dynamic Load Balancing between MPI ranks
780     is needed to maximize performance. This is particularly important
781     for molecular systems with heterogeneous particle or interaction
782     density. When a certain threshold for performance loss is
783     exceeded, DLB activates and shifts particles between ranks to improve
784     performance. If available, using ``-bonded gpu`` is expected
785     to improve the ability of DLB to maximize performance.
786
787 During the simulation :ref:`gmx mdrun` must communicate between all
788 PP ranks to compute quantities such as kinetic energy for log file
789 reporting, or perhaps temperature coupling. By default, this happens
790 whenever necessary to honor several :ref:`mdp options <mdp-general>`,
791 so that the period between communication phases is the least common
792 denominator of :mdp:`nstlist`, :mdp:`nstcalcenergy`,
793 :mdp:`nsttcouple`, and :mdp:`nstpcouple`.
794
795 Note that ``-tunepme`` has more effect when there is more than one
796 :term:`node`, because the cost of communication for the PP and PME
797 ranks differs. It still shifts load between PP and PME ranks, but does
798 not change the number of separate PME ranks in use.
799
800 Note also that ``-dlb`` and ``-tunepme`` can interfere with each other, so
801 if you experience performance variation that could result from this,
802 you may wish to tune PME separately, and run the result with ``mdrun
803 -notunepme -dlb yes``.
804
805 The :ref:`gmx tune_pme` utility is available to search a wider
806 range of parameter space, including making safe
807 modifications to the :ref:`tpr` file, and varying ``-npme``.
808 It is only aware of the number of ranks created by
809 the MPI environment, and does not explicitly manage
810 any aspect of OpenMP during the optimization.
811
812 Examples for :ref:`mdrun <gmx mdrun>` on more than one node
813 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
814
815 The examples and explanations for for single-node :ref:`mdrun <gmx mdrun>` are
816 still relevant, but ``-ntmpi`` is no longer the way
817 to choose the number of MPI ranks.
818
819 ::
820
821     mpirun -np 16 gmx_mpi mdrun
822
823 Starts :ref:`mdrun_mpi` with 16 ranks, which are mapped to
824 the hardware by the MPI library, e.g. as specified
825 in an MPI hostfile. The available cores will be
826 automatically split among ranks using OpenMP threads,
827 depending on the hardware and any environment settings
828 such as ``OMP_NUM_THREADS``.
829
830 ::
831
832     mpirun -np 16 gmx_mpi mdrun -npme 5
833
834 Starts :ref:`mdrun_mpi` with 16 ranks, as above, and
835 require that 5 of them are dedicated to the PME
836 component.
837
838 ::
839
840     mpirun -np 11 gmx_mpi mdrun -ntomp 2 -npme 6 -ntomp_pme 1
841
842 Starts :ref:`mdrun_mpi` with 11 ranks, as above, and
843 require that six of them are dedicated to the PME
844 component with one OpenMP thread each. The remaining
845 five do the PP component, with two OpenMP threads
846 each.
847
848 ::
849
850     mpirun -np 4 gmx_mpi mdrun -ntomp 6 -nb gpu -gputasks 00
851
852 Starts :ref:`mdrun_mpi` on a machine with two nodes, using
853 four total ranks, each rank with six OpenMP threads,
854 and both ranks on a node sharing GPU with ID 0.
855
856 ::
857
858     mpirun -np 8 gmx_mpi mdrun -ntomp 3 -gputasks 0000
859
860 Using a same/similar hardware as above,
861 starts :ref:`mdrun_mpi` on a machine with two nodes, using
862 eight total ranks, each rank with three OpenMP threads,
863 and all four ranks on a node sharing GPU with ID 0.
864 This may or may not be faster than the previous setup
865 on the same hardware.
866
867 ::
868
869     mpirun -np 20 gmx_mpi mdrun -ntomp 4 -gputasks 00
870
871 Starts :ref:`mdrun_mpi` with 20 ranks, and assigns the CPU cores evenly
872 across ranks each to one OpenMP thread. This setup is likely to be
873 suitable when there are ten nodes, each with one GPU, and each node
874 has two sockets each of four cores.
875
876 ::
877
878     mpirun -np 10 gmx_mpi mdrun -gpu_id 1
879
880 Starts :ref:`mdrun_mpi` with 20 ranks, and assigns the CPU cores evenly
881 across ranks each to one OpenMP thread. This setup is likely to be
882 suitable when there are ten nodes, each with two GPUs, but another
883 job on each node is using GPU 0. The job scheduler should set the
884 affinity of threads of both jobs to their allocated cores, or the
885 performance of :ref:`mdrun <gmx mdrun>` will suffer greatly.
886
887 ::
888
889     mpirun -np 20 gmx_mpi mdrun -gpu_id 01
890
891 Starts :ref:`mdrun_mpi` with 20 ranks. This setup is likely
892 to be suitable when there are ten nodes, each with two
893 GPUs, but there is no need to specify ``-gpu_id`` for the
894 normal case where all the GPUs on the node are available
895 for use.
896
897 Approaching the scaling limit
898 -----------------------------
899
900 There are several aspects of running a |Gromacs| simulation that are important as the number
901 of atoms per core approaches the current scaling limit of ~100 atoms/core.
902
903 One of these is that the use of ``constraints = all-bonds``  with P-LINCS
904 sets an artificial minimum on the size of domains. You should reconsider the use
905 of constraints to all bonds (and bear in mind possible consequences on the safe maximum for dt),
906 or change lincs_order and lincs_iter suitably.
907
908 Finding out how to run :ref:`mdrun <gmx mdrun>` better
909 ------------------------------------------------------
910
911 The Wallcycle module is used for runtime performance measurement of :ref:`gmx mdrun`.
912 At the end of the log file of each run, the "Real cycle and time accounting" section
913 provides a table with runtime statistics for different parts of the :ref:`gmx mdrun` code
914 in rows of the table.
915 The table contains colums indicating the number of ranks and threads that
916 executed the respective part of the run, wall-time and cycle
917 count aggregates (across all threads and ranks) averaged over the entire run.
918 The last column also shows what precentage of the total runtime each row represents.
919 Note that the :ref:`gmx mdrun` timer resetting functionalities (``-resethway`` and ``-resetstep``)
920 reset the performance counters and therefore are useful to avoid startup overhead and
921 performance instability (e.g. due to load balancing) at the beginning of the run.
922
923 The performance counters are:
924
925 * Particle-particle during Particle mesh Ewald
926 * Domain decomposition
927 * Domain decomposition communication load
928 * Domain decomposition communication bounds
929 * Virtual site constraints
930 * Send X to Particle mesh Ewald
931 * Neighbor search
932 * Launch GPU operations
933 * Communication of coordinates
934 * Force
935 * Waiting + Communication of force
936 * Particle mesh Ewald
937 * PME redist. X/F
938 * PME spread
939 * PME gather
940 * PME 3D-FFT
941 * PME 3D-FFT Communication
942 * PME solve Lennard-Jones
943 * PME solve LJ
944 * PME solve Elec
945 * PME wait for particle-particle
946 * Wait + Receive PME force
947 * Wait GPU nonlocal
948 * Wait GPU local
949 * Wait PME GPU spread
950 * Wait PME GPU gather
951 * Reduce PME GPU Force
952 * Non-bonded position/force buffer operations
953 * Virtual site spread
954 * COM pull force
955 * AWH (accelerated weight histogram method)
956 * Write trajectory
957 * Update
958 * Constraints
959 * Communication of energies
960 * Enforced rotation
961 * Add rotational forces
962 * Position swapping
963 * Interactive MD
964
965 As performance data is collected for every run, they are essential to assessing
966 and tuning the performance of :ref:`gmx mdrun` performance. Therefore, they benefit
967 both code developers as well as users of the program.
968 The counters are an average of the time/cycles different parts of the simulation take,
969 hence can not directly reveal fluctuations during a single run (although comparisons across
970 multiple runs are still very useful).
971
972 Counters will appear in an MD log file only if the related parts of the code were
973 executed during the :ref:`gmx mdrun` run. There is also a special counter called "Rest" which
974 indicates the amount of time not accounted for by any of the counters above. Therefore,
975 a significant amount "Rest" time (more than a few percent) will often be an indication of
976 parallelization inefficiency (e.g. serial code) and it is recommended to be reported to the
977 developers.
978
979 An additional set of subcounters can offer more fine-grained inspection of performance. They are:
980
981 * Domain decomposition redistribution
982 * DD neighbor search grid + sort
983 * DD setup communication
984 * DD make topology
985 * DD make constraints
986 * DD topology other
987 * Neighbor search grid local
988 * NS grid non-local
989 * NS search local
990 * NS search non-local
991 * Bonded force
992 * Bonded-FEP force
993 * Restraints force
994 * Listed buffer operations
995 * Nonbonded pruning
996 * Nonbonded force
997 * Launch non-bonded GPU tasks
998 * Launch PME GPU tasks
999 * Ewald force correction
1000 * Non-bonded position buffer operations
1001 * Non-bonded force buffer operations
1002
1003 Subcounters are geared toward developers and have to be enabled during compilation. See
1004 :doc:`/dev-manual/build-system` for more information.
1005
1006 ..  todo::
1007
1008     In future patch:
1009     - red flags in log files, how to interpret wallcycle output
1010     - hints to devs how to extend wallcycles
1011
1012 .. _gmx-mdrun-on-gpu:
1013
1014 Running :ref:`mdrun <gmx mdrun>` with GPUs
1015 ------------------------------------------
1016
1017 .. _gmx-gpu-tasks:
1018
1019 Types of GPU tasks
1020 ^^^^^^^^^^^^^^^^^^
1021
1022 To better understand the later sections on different GPU use cases for
1023 calculation of :ref:`short range<gmx-gpu-pp>`, :ref:`PME<gmx-gpu-pme>`,
1024 :ref:`bonded interactions<gmx-gpu-bonded>` and
1025 :ref:`update and constraints <gmx-gpu-update>`
1026 we first introduce the concept of different GPU tasks. When thinking about
1027 running a simulation, several different kinds of interactions between the atoms
1028 have to be calculated (for more information please refer to the reference manual).
1029 The calculation can thus be split into several distinct parts that are largely independent
1030 of each other (hence can be calculated in any order, e.g. sequentially or concurrently),
1031 with the information from each of them combined at the end of
1032 time step to obtain the final forces on each atom and to propagate the system
1033 to the next time point. For a better understanding also please see the section
1034 on :ref:`domain decomposition <gmx-domain-decomp>`.
1035
1036 Of all calculations required for an MD step,
1037 GROMACS aims to optimize performance bottom-up for each step
1038 from the lowest level (SIMD unit, cores, sockets, accelerators, etc.).
1039 Therefore many of the individual computation units are
1040 highly tuned for the lowest level of hardware parallelism: the SIMD units.
1041 Additionally, with GPU accelerators used as *co-processors*, some of the work
1042 can be *offloaded*, that is calculated simultaneously/concurrently with the CPU
1043 on the accelerator device, with the result being communicated to the CPU.
1044 Right now, |Gromacs| supports GPU accelerator offload of two tasks:
1045 the short-range :ref:`nonbonded interactions in real space <gmx-gpu-pp>`,
1046 and :ref:`PME <gmx-gpu-pme>`.
1047
1048 **Please note that the solving of PME on GPU is still only the initial
1049 version supporting this behaviour, and comes with a set of limitations
1050 outlined further below.**
1051
1052 Right now, we generally support short-range nonbonded offload with and
1053 without dynamic pruning on a wide range of GPU accelerators
1054 (both NVIDIA and AMD). This is compatible with the grand majority of
1055 the features and parallelization modes and can be used to scale to large machines.
1056
1057 Simultaneously offloading both short-range nonbonded and long-range
1058 PME work to GPU accelerators is a new feature that that has some
1059 restrictions in terms of feature and parallelization
1060 compatibility (please see the :ref:`section below <gmx-pme-gpu-limitations>`).
1061
1062 .. _gmx-gpu-pp:
1063
1064 GPU computation of short range nonbonded interactions
1065 .....................................................
1066
1067 .. todo:: make this more elaborate and include figures
1068
1069 Using the GPU for the short-ranged nonbonded interactions provides
1070 the majority of the available speed-up compared to run using only the CPU.
1071 Here, the GPU acts as an accelerator that can effectively parallelize
1072 this problem and thus reduce the calculation time.
1073
1074 .. _gmx-gpu-pme:
1075
1076 GPU accelerated calculation of PME
1077 ..................................
1078
1079 .. todo:: again, extend this and add some actual useful information concerning performance etc...
1080
1081 |Gromacs| now allows the offloading of the PME calculation
1082 to the GPU, to further reduce the load on the CPU and improve usage overlap between
1083 CPU and GPU. Here, the solving of PME will be performed in addition to the calculation
1084 of the short range interactions on the same GPU as the short range interactions.
1085
1086 .. _gmx-pme-gpu-limitations:
1087
1088 Known limitations
1089 .................
1090
1091 **Please note again the limitations outlined below!**
1092
1093 - PME GPU offload is supported on NVIDIA hardware with CUDA and AMD hardware with OpenCL.
1094
1095 - Only a PME order of 4 is supported on GPUs.
1096
1097 - PME will run on a GPU only when exactly one rank has a
1098   PME task, ie. decompositions with multiple ranks doing PME are not supported.
1099
1100 - Only single precision is supported.
1101
1102 - Free energy calculations where charges are perturbed are not supported,
1103   because only single PME grids can be calculated.
1104
1105 - Only dynamical integrators are supported (ie. leap-frog, Velocity Verlet,
1106   stochastic dynamics)
1107
1108 - LJ PME is not supported on GPUs.
1109
1110 .. _gmx-gpu-bonded:
1111
1112 GPU accelerated calculation of bonded interactions (CUDA only)
1113 ..............................................................
1114
1115 .. todo:: again, extend this and add some actual useful information concerning performance etc...
1116
1117 |Gromacs| now allows the offloading of the bonded part of the PP
1118 workload to a CUDA-compatible GPU. This is treated as part of the PP
1119 work, and requires that the short-ranged non-bonded task also runs on
1120 a GPU. It is an advantage usually only when the CPU is relatively weak
1121 compared with the GPU, perhaps because its workload is too large for
1122 the available cores. This would likely be the case for free-energy
1123 calculations.
1124
1125 .. _gmx-gpu-update:
1126
1127 GPU accelerated calculation of constraints and coordinate update (CUDA only)
1128 ............................................................................
1129
1130 .. TODO again, extend this and add some actual useful information concerning performance etc...
1131
1132 |Gromacs| makes it possible to also perform the coordinate update and (if requested)
1133 constraint calculation on a CUDA-compatible GPU. This allows to having all (compatible)
1134 parts of a simulation step on the GPU, so that no unnecessary transfers are needed between
1135 GPU and CPU. This currently only works with single domain cases, and needs to be explicitly
1136 requested by the user. It is possible to change the default behaviour by setting the
1137 ``GMX_FORCE_UPDATE_DEFAULT_GPU`` environment variable to a non-zero value. In this
1138 case simulations will try to run all parts by default on the GPU, and will only fall
1139 back to the CPU based calculation if the simulation is not compatible.
1140
1141 Using this pathway is usually advantageous if a strong GPU is used with a weak CPU.
1142
1143 Assigning tasks to GPUs
1144 .......................
1145
1146 Depending on which tasks should be performed on which hardware, different kinds of
1147 calculations can be combined on the same or different GPUs, according to the information
1148 provided for running :ref:`mdrun <gmx mdrun>`.
1149
1150 It is possible to assign the calculation of the different computational tasks to the same GPU, meaning
1151 that they will share the computational resources on the same device, or to different processing units
1152 that will each perform one task each.
1153
1154 One overview over the possible task assignments is given below:
1155
1156 |Gromacs| version 2018:
1157
1158   Two different types of assignable GPU accelerated tasks are available, NB and PME.
1159   Each PP rank has a NB task that can be offloaded to a GPU.
1160   If there is only one rank with a PME task (including if that rank is a
1161   PME-only rank), then that task can be offloaded to a GPU. Such a PME
1162   task can run wholly on the GPU, or have its latter stages run only on the CPU.
1163
1164   Limitations are that PME on GPU does not support PME domain decomposition,
1165   so that only one PME task can be offloaded to a single GPU
1166   assigned to a separate PME rank, while NB can be decomposed and offloaded to multiple GPUs.
1167
1168 |Gromacs| version 2019:
1169
1170   No new assignable GPU tasks are available, but any bonded interactions
1171   may run on the same GPU as the short-ranged interactions for a PP task.
1172   This can be influenced with the ``-bonded`` flag.
1173
1174 Performance considerations for GPU tasks
1175 ........................................
1176
1177 #) The performance balance depends on the speed and number of CPU cores you
1178    have vs the speed and number of GPUs you have.
1179
1180 #) With slow/old GPUs and/or fast/modern CPUs with many
1181    cores, it might make more sense to let the CPU do PME calculation,
1182    with the GPUs focused on the calculation of the NB.
1183
1184 #) With fast/modern GPUs and/or slow/old CPUs with few cores,
1185    it generally helps to have the GPU do PME.
1186
1187 #) Offloading bonded work to a GPU will often not improve simulation performance
1188    as efficient CPU-based kernels can complete the bonded computation
1189    before the GPU is done with other offloaded work. Therefore,
1190    `gmx mdrun` will default to no bonded offload when PME is offloaded.
1191    Typical cases where performance can be improvement with bonded offload are:
1192    with significant bonded work (e.g. pure lipid or mostly polymer systems with little solvent),
1193    with very few and/or slow CPU cores per GPU, or when the CPU does
1194    other computation (e.g. PME, free energy).
1195
1196 #) It *is* possible to use multiple GPUs with PME offload
1197    by letting e.g.
1198    3 MPI ranks use one GPU each for short-range interactions,
1199    while a fourth rank does the PME on its GPU.
1200
1201 #) The only way to know for sure what alternative is best for
1202    your machine is to test and check performance.
1203
1204 .. todo:: we need to be more concrete here, i.e. what machine/software aspects to take into consideration, when will default run mode be using PME-GPU and when will it not, when/how should the user reason about testing different settings than the default.
1205
1206 .. todo:: someone who knows about the mixed mode should comment further.
1207
1208 Reducing overheads in GPU accelerated runs
1209 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1210
1211 In order for CPU cores and GPU(s) to execute concurrently, tasks are
1212 launched and executed asynchronously on the GPU(s) while the CPU cores
1213 execute non-offloaded force computation (like long-range PME electrostatics).
1214 Asynchronous task launches are handled by GPU device driver and
1215 require CPU involvement. Therefore, the work of scheduling
1216 GPU tasks will incur an overhead that can in some cases significantly
1217 delay or interfere with the CPU execution.
1218
1219 Delays in CPU execution are caused by the latency of launching GPU tasks,
1220 an overhead that can become significant as simulation ns/day increases
1221 (i.e. with shorter wall-time per step).
1222 The overhead is measured by :ref:`gmx mdrun` and reported in the performance
1223 summary section of the log file ("Launch GPU ops" row).
1224 A few percent of runtime spent in this category is normal,
1225 but in fast-iterating and multi-GPU parallel runs 10% or larger overheads can be observed.
1226 In general, a user can do little to avoid such overheads, but there
1227 are a few cases where tweaks can give performance benefits.
1228 In single-rank runs timing of GPU tasks is by default enabled and,
1229 while in most cases its impact is small, in fast runs performance can be affected.
1230 The performance impact will be most significant on NVIDIA GPUs with CUDA,
1231 less on AMD and Intel with OpenCL.
1232 In these cases, when more than a few percent of "Launch GPU ops" time is observed,
1233 it is recommended to turn off timing by setting the ``GMX_DISABLE_GPU_TIMING``
1234 environment variable.
1235 In parallel runs with many ranks sharing a GPU,
1236 launch overheads can also be reduced by starting fewer thread-MPI
1237 or MPI ranks per GPU; e.g. most often one rank per thread or core is not optimal.
1238
1239 The second type of overhead, interference of the GPU driver with CPU computation,
1240 is caused by the scheduling and coordination of GPU tasks.
1241 A separate GPU driver thread can require CPU resources
1242 which may clash with the concurrently running non-offloaded tasks,
1243 potentially degrading the performance of PME or bonded force computation.
1244 This effect is most pronounced when using AMD GPUs with OpenCL with
1245 older driver releases (e.g. fglrx 12.15).
1246 To minimize the overhead it is recommended to
1247 leave a CPU hardware thread unused when launching :ref:`gmx mdrun`,
1248 especially on CPUs with high core counts and/or HyperThreading enabled.
1249 E.g. on a machine with a 4-core CPU and eight threads (via HyperThreading) and an AMD GPU,
1250 try ``gmx mdrun -ntomp 7 -pin on``.
1251 This will leave free CPU resources for the GPU task scheduling
1252 reducing interference with CPU computation.
1253 Note that assigning fewer resources to :ref:`gmx mdrun` CPU computation
1254 involves a tradeoff which may outweigh the benefits of reduced GPU driver overhead,
1255 in particular without HyperThreading and with few CPU cores.
1256
1257 .. todo:: In future patch: any tips not covered above
1258
1259 Running the OpenCL version of mdrun
1260 -----------------------------------
1261
1262 Currently supported hardware architectures are:
1263 - GCN-based AMD GPUs;
1264 - NVIDIA GPUs (with at least OpenCL 1.2 support);
1265 - Intel iGPUs.
1266 Make sure that you have the latest drivers installed. For AMD GPUs,
1267 the compute-oriented `ROCm <https://rocm.github.io/>`_ stack is recommended;
1268 alternatively, the AMDGPU-PRO stack is also compatible; using the outdated
1269 and unsupported ``fglrx`` proprietary driver and runtime is not recommended (but
1270 for certain older hardware that may be the only way to obtain support).
1271 In addition Mesa version 17.0 or newer with LLVM 4.0 or newer is also supported.
1272 For NVIDIA GPUs, using the proprietary driver is
1273 required as the open source nouveau driver (available in Mesa) does not
1274 provide the OpenCL support.
1275 For Intel integrated GPUs, the `Neo driver <https://github.com/intel/compute-runtime/releases>`_ is
1276 recommended.
1277 .. seealso:: :issue:`3268` add more Intel driver recommendations
1278
1279 The minimum OpenCL version required is |REQUIRED_OPENCL_MIN_VERSION|. See
1280 also the :ref:`known limitations <opencl-known-limitations>`.
1281
1282 Devices from the AMD GCN architectures (all series) are compatible
1283 and regularly tested; NVIDIA Kepler and later (compute capability 3.0)
1284 are known to work, but before doing production runs always make sure that the |Gromacs| tests
1285 pass successfully on the hardware.
1286
1287 The OpenCL GPU kernels are compiled at run time. Hence,
1288 building the OpenCL program can take a few seconds, introducing a slight
1289 delay in the :ref:`gmx mdrun` startup. This is not normally a
1290 problem for long production MD, but you might prefer to do some kinds
1291 of work, e.g. that runs very few steps, on just the CPU (e.g. see ``-nb`` above).
1292
1293 The same ``-gpu_id`` option (or ``GMX_GPU_ID`` environment variable)
1294 used to select CUDA devices, or to define a mapping of GPUs to PP
1295 ranks, is used for OpenCL devices.
1296
1297 Some other :ref:`OpenCL management <opencl-management>` environment
1298 variables may be of interest to developers.
1299
1300 .. _opencl-known-limitations:
1301
1302 Known limitations of the OpenCL support
1303 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1304
1305 Limitations in the current OpenCL support of interest to |Gromacs| users:
1306
1307 - Intel integrated GPUs are supported. Intel CPUs and Xeon Phi are not supported.
1308 - Due to blocking behavior of some asynchronous task enqueuing functions
1309   in the NVIDIA OpenCL runtime, with the affected driver versions there is
1310   almost no performance gain when using NVIDIA GPUs.
1311   The issue affects NVIDIA driver versions up to 349 series, but it
1312   known to be fixed 352 and later driver releases.
1313 - On NVIDIA GPUs the OpenCL kernels achieve much lower performance
1314   than the equivalent CUDA kernels due to limitations of the NVIDIA OpenCL
1315   compiler.
1316
1317 Limitations of interest to |Gromacs| developers:
1318
1319 - The current implementation requires a minimum execution with of 16; kernels
1320   compiled for narrower execution width (be it due to hardware requirements or
1321   compiler choice) will not be suitable and will trigger a runtime error.
1322
1323 Performance checklist
1324 ---------------------
1325
1326 There are many different aspects that affect the performance of simulations in
1327 |Gromacs|. Most simulations require a lot of computational resources, therefore
1328 it can be worthwhile to optimize the use of those resources. Several issues
1329 mentioned in the list below could lead to a performance difference of a factor
1330 of 2. So it can be useful go through the checklist.
1331
1332 |Gromacs| configuration
1333 ^^^^^^^^^^^^^^^^^^^^^^^
1334
1335 * Don't use double precision unless you're absolute sure you need it.
1336 * Compile the FFTW library (yourself) with the correct flags on x86 (in most
1337   cases, the correct flags are automatically configured).
1338 * On x86, use gcc or icc as the compiler (not pgi or the Cray compiler).
1339 * On POWER, use gcc instead of IBM's xlc.
1340 * Use a new compiler version, especially for gcc (e.g. from version 5 to 6
1341   the performance of the compiled code improved a lot).
1342 * MPI library: OpenMPI usually has good performance and causes little trouble.
1343 * Make sure your compiler supports OpenMP (some versions of Clang don't).
1344 * If you have GPUs that support either CUDA or OpenCL, use them.
1345
1346   * Configure with ``-DGMX_GPU=ON`` (add ``-DGMX_USE_OPENCL=ON`` for OpenCL).
1347   * For CUDA, use the newest CUDA available for your GPU to take advantage of the
1348     latest performance enhancements.
1349   * Use a recent GPU driver.
1350   * Make sure you use an :ref:`gmx mdrun` with ``GMX_SIMD`` appropriate for the CPU
1351     architecture; the log file will contain a warning note if suboptimal setting is used.
1352     However, prefer ``AVX2` over ``AVX512`` in GPU or highly parallel MPI runs (for more
1353     information see the :ref:`intra-core parallelization information <intra-core-parallelization>`).
1354   * If compiling on a cluster head node, make sure that ``GMX_SIMD``
1355     is appropriate for the compute nodes.
1356
1357 Run setup
1358 ^^^^^^^^^
1359
1360 * For an approximately spherical solute, use a rhombic dodecahedron unit cell.
1361 * When using a time-step of 2 fs, use :mdp-value:`constraints=h-bonds`
1362   (and not :mdp-value:`constraints=all-bonds`), since this is faster, especially with GPUs,
1363   and most force fields have been parametrized with only bonds involving
1364   hydrogens constrained.
1365 * You can increase the time-step to 4 or 5 fs when using virtual interaction
1366   sites (``gmx pdb2gmx -vsite h``).
1367 * For massively parallel runs with PME, you might need to try different numbers
1368   of PME ranks (``gmx mdrun -npme ???``) to achieve best performance;
1369   :ref:`gmx tune_pme` can help automate this search.
1370 * For massively parallel runs (also ``gmx mdrun -multidir``), or with a slow
1371   network, global communication can become a bottleneck and you can reduce it
1372   by choosing larger periods for algorithms such as temperature and
1373   pressure coupling).
1374
1375 Checking and improving performance
1376 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1377
1378 * Look at the end of the ``md.log`` file to see the performance and the cycle
1379   counters and wall-clock time for different parts of the MD calculation. The
1380   PP/PME load ratio is also printed, with a warning when a lot of performance is
1381   lost due to imbalance.
1382 * Adjust the number of PME ranks and/or the cut-off and PME grid-spacing when
1383   there is a large PP/PME imbalance. Note that even with a small reported
1384   imbalance, the automated PME-tuning might have reduced the initial imbalance.
1385   You could still gain performance by changing the mdp parameters or increasing
1386   the number of PME ranks.
1387 * If the neighbor searching takes a lot of time, increase nstlist. If a Verlet
1388   buffer tolerance is used, this is done automatically by :ref:`gmx mdrun`
1389   and the pair-list buffer is increased to keep the energy drift constant.
1390
1391   * If ``Comm. energies`` takes a lot of time (a note will be printed in the log
1392     file), increase nstcalcenergy.
1393   * If all communication takes a lot of time, you might be running on too many
1394     cores, or you could try running combined MPI/OpenMP parallelization with 2
1395     or 4 OpenMP threads per MPI process.