GROMACS acelerado
por GPU

Empieza hoy mismo con esta guía para aplicaciones preparadas para GPU.

GROMACS

GROMACS es una aplicación de dinámica molecular diseñada para simular las ecuaciones del movimiento de Newton para sistemas con cientos de millones de partículas. GROMACS se diseñó para simular moléculas bioquímicas como proteínas, lípidos y ácidos nucleicos que tienen una gran cantidad de interacciones y enlaces complicados.

GROMACS es hasta tres veces más rápido en sistemas acelerados con GPU NVIDIA que en los sistemas de una sola CPU*, lo que permite a los usuarios ejecutar simulaciones de dinámica molecular en horas, en lugar de días.

GROMACS es hasta tres veces más rápido en sistemas acelerados con GPU NVIDIA

Instalación

GROMACS (versión 5.1.2) se puede descargar desde el sitio web de GROMACS. En el ejemplo siguiente, reemplaza “VERSION” por 5.1.2 o la versión de GROMACS que quieras usar. La versión actual (5.1.4) ya está disponible y ha demostrado ofrecer un rendimiento más rápido que el de la versión 5.1.2.

Instrucciones de descarga e instalación

Para configurar (con CMake) y compilar la versión acelerada en la GPU, se requiere el siguiente software:

  • CMake
  • NVIDIA CUDA®*
  • GCC*
  • MPI (Opcional. Necesario si hace falta la versión de varios nodos).

* Se recomienda usar una versión reciente de CUDA (la versión actual es la 7.5) y la versión de gcc más reciente compatible con la versión de CUDA.

$ wget ftp://ftp.gromacs.org/pub/gromacs/gromacs-VERSIÓN.tar.gz
$ tar -xzvf gromacs-VERSIÓN.tar.gz
$ mkdir gromacs-VERSIÓN-build
$ cd gromacs-VERSIÓN-build
$ CC=gcc CXX=g++ cmake -DGMX_OPENMP=ON -DGMX_GPU=ON - DGPU_DEPLOYMENT_KIT_ROOT_DIR= -DGMX_BUILD_OWN_FFTW=ON - DGMX_PREFER_STATIC_LIBS=ON -DCMAKE_BUILD_TYPE=Release - DCMAKE_INSTALL_PREFIX=-DGMX_OPENMP=ON -DGMX_GPU=ON -
DGPU_DEPLOYMENT_KIT_ROOT_DIR=-DGMX_BUILD_OWN_FFTW=ON -
DGMX_PREFER_STATIC_LIBS=ON -DCMAKE_BUILD_TYPE=Release -
DCMAKE_INSTALL_PREFIX=

OPCIONES DE COMPILACIÓN MULTIPLATAFORMA (CMAKE)

Reemplaza por la ruta al directorio original de GROMACS (por ejemplo, ../gromacs-5.1.2). es la ubicación donde se instaló el kit de implementación de las GPU. Los relojes de GPU de GROMACS 5.1 se pueden ajustar automáticamente mediante NVML para obtener un rendimiento óptimo. Es necesario el kit de implementación de GPU (GDK) para compilar el soporte NVML adicional. Después de descargarlo e instalarlo, reemplaza por la ruta del directorio gdk (puedes eliminar la opción -DGPU_DEPLOYMENT_KIT_ROOT_DIR= si instalas GDF en la ubicación predeterminada). también necesita ser reemplazado por la dirección de instalación apropiada, por ejemplo, /opt/gromacs.

Aquí aparecen otras configuraciones usando opciones de CMake, como la activación del soporte OpenMP con -DGMX_OPENMP=ON. Con la opción de configuración -DGMX_BUILD_OWN_FFTW=ON, se descarga y compila FFTW durante la compilación de GROMACS. Esto asegura que se elijan los modificadores de optimización correctos de FFTW. Por otro lado, se puede usar una instalación de FFTW específica. Consulta la sección FFTW de las instrucciones de instalación de GROMACS para conseguir más información. Para obtener información detallada sobre cada opción, consulta el manual de GROMACS.

Después de descargarlo e instalarlo, reemplaza por la ruta del directorio gdk (puedes eliminar la opción -DGPU_DEPLOYMENT_KIT_ROOT_DIR= si instalas GDF en la ubicación predeterminada). también necesita ser reemplazado por la dirección de instalación apropiada, por ejemplo, /opt/gromacs.

Aquí aparecen otras configuraciones usando opciones de CMake, como la activación del soporte OpenMP con -DGMX_OPENMP=ON. Con la opción de configuración -DGMX_BUILD_OWN_FFTW=ON, se descarga y compila FFTW durante la compilación de GROMACS. Esto asegura que se elijan los modificadores de optimización correctos de FFTW. Por otro lado, se puede usar una instalación de FFTW específica. Consulta la sección FFTW de las instrucciones de instalación de GROMACS para conseguir más información. Para obtener información detallada sobre cada opción, consulta el manual de GROMACS.

GROMACS con MPI

Para compilar e instalar GROMACS con el soporte MPI, es necesario ajustar el comando anterior utilizando los contenedores del compilador MPI y agregando “-DGMX_MPI=ON”.

$ CC=mpicc CXX=mpicxx cmake -DGMX_OPENMP=ON -DGMX_GPU=ON -DGPU_DEPLOYMENT_KIT_ROOT_DIR= -DGMX_MPI=ON -DGMX_BUILD_OWN_FFTW=ON -DGMX_PREFER_STATIC_LIBS=ON - DCMAKE_BUILD_TYPE=Release -DGMX_BUILD_UNITTESTS=ON -DCMAKE_INSTALL_PREFIX=-DGMX_OPENMP=ON -DGMX_GPU=ON
-DGPU_DEPLOYMENT_KIT_ROOT_DIR=-DGMX_MPI=ON -DGMX_BUILD_OWN_FFTW=ON -DGMX_PREFER_STATIC_LIBS=ON -
DCMAKE_BUILD_TYPE=Release -DGMX_BUILD_UNITTESTS=ON -DCMAKE_INSTALL_PREFIX=

COMPILAR E INSTALAR

Para compilar e instalar GROMACS, usa el siguiente comando:

$ make
$ sudo make install

Para comprobar la corrección de GROMACS después de la instalación, agrega la opción -DREGRESSIONTEST_DOWNLOAD=ON al comando de configuración y ejecuta “make check” antes de “make install”. Además, puede utilizar "make -jN", donde N es el número de núcleos, en sus plataformas para avanzar más rápido.

Para obtener más información sobre las opciones de instalación, consulta la Guía de instalación de GROMACS.

Ejecución de trabajos

GROMACS proporciona scripts para configurar el entorno de varios intérpretes de comandos. Para configurar la variable PATH y otro entorno, se puede usar el comando siguiente.

    $ source /bin/GMXRC/bin/GMXRC

Si has compilado binarios MPI y no MPI como se ha descrito antes, encontrarás tanto “gmx” como “gmx_mpi” en la carpeta bin de instalación. Los ejemplos descritos en esta guía usan conjuntos de datos de “agua” del ftp de GROMACS. Para ejecutar GROMACS con estos conjuntos de datos, antes es necesario preparar los datos como se describe a continuación. Aquí se encuentran los detalles y opciones adicionales para la preparación de la entrada para ejecutar GROMACS.

Para ejecutar GROMACS se requieren dos pasos:

1. Prepara la entrada con grompp (preprocesador GROMACS) 

a. En el caso de la versión de un solo nodo: $ gmx grompp -f

2. Inicia mdrun

a. En el caso de la versión de un solo nodo: $ gmx mdrun 
b. En el caso de la versión MPI (np = #GPU): $ mpirun –np gmx_mpi mdrun Estos ajustes suelen ofrecer un buen rendimiento para pocas cantidades de nodos. Sin embargo, algunos ajustes mejoran el rendimiento de simulación de GROMACS. Estos ajustes manuales son más importantes para mayores cantidades de nodos. Para obtener más información, consulta el Manual de GROMACS, la lista de distribución de correo de usuarios de gmx y los documentos publicados.

Las opciones de ajuste de rendimiento relacionadas con la GPU se describen en este documento. Los conjuntos de entrada de la prueba de referencia están disponibles para su descarga.

Las opciones de ajuste de rendimiento relacionadas con la GPU se describen en este documento. Los conjuntos de entrada de la prueba de referencia están disponibles para su descarga.

OPCIONES DE EJECUCIÓN DE PRUEBAS DE REFERENCIA

Cuando ejecutes pruebas de referencia de GROMACS para medir el rendimiento, usa las siguientes opciones de línea de comandos:

1. -resethway: al comienzo de cada simulación, GROMACS ajusta la descomposición de dominios y equilibra la carga entre las CPU y GPU disponibles. Esto ralentiza los primeros cientos de iteraciones. Como las simulaciones reales se ejecutan durante un tiempo muy prolongado, no tiene ningún impacto en el rendimiento alcanzado. Para reducir al mínimo el tiempo de ejecución necesario para obtener resultados estables para las pruebas de referencia, debe especificarse la opción -resethway. -resethway restablece todos los contadores de rendimiento cuando se ejecutan la mitad de las iteraciones y, por lo tanto, permite medir el rendimiento de forma realista y sin muchos intervalos. Ten en cuenta que, si el reinicio se produce mientras el equilibrador de carga PME todavía está activo en el inicio de la ejecución, puede aparecer el siguiente error: “PME tuning was still active when attempting to reset mdrun counters at step xxxxxxx” (El ajuste de PME todavía estaba activo cuando se intentaron restablecer los contadores mdrun en el intervalo xxxxxxx). Para evitar esto, puedes aumentar los intervalos que se ejecutan si incrementas -maxh o agregas el parámetro -nsteps para aumentar el número de intervalos de la simulación.

2. -maxh: controla el tiempo máximo de ejecución de la simulación. mdrun ejecuta suficientes intervalos para que funcione durante al menos el tiempo especificado en horas. Se debe establecer en un valor lo suficientemente alto para obtener resultados de rendimiento estables. Un valor razonable sería típicamente 5 minutos = 0,08333. Esta opción o la opción “nsteps” (que se describe a continuación) pueden usarse para limitar el tiempo de ejecución de la simulación.

3. -noconfout: esto desactiva la salida de confout.gro, que puede tardar una cantidad de tiempo considerable en completarse (por ejemplo, en sistemas de archivos paralelos). Como esto se hace con muy poca frecuencia en simulaciones reales, debe desactivarse durante la evaluación comparativa.

4. -v: muestra más información en la línea de comandos y en el archivo de registro md.log. La información contenida es muy útil para ajustar el rendimiento de GROMACS.

5. -nb: indica a GROMACS que use “gpu” o “cpu” para ciertos cálculos.

6. -nsteps: número de intervalos para ejecutar. Anula el valor predeterminado en el archivo mdp. Esta opción también se puede utilizar para controlar el tiempo total que se ejecutará una simulación en lugar de utilizar maxh.

El rendimiento se notifica al final del archivo de registro generado (md.log), así como en la salida de la consola en ns/día (un número mayor se considera mejor). 

Visita la página de documentación de GROMACS para obtener más información sobre los parámetros de la línea de comandos.

AJUSTE DEL RENDIMIENTO

Para entender el comportamiento de rendimiento de GROMACS, es útil tener un conocimiento básico de las tareas que ejecuta GROMACS. A continuación, se muestra una vista simplificada. Desde una perspectiva general, GROMACS ejecuta cuatro tareas:

1. PP: calcular las fuerzas no enlazadas de corto alcance o las interacciones partícula-partícula (PP) (solo computa la comunicación con el vecino más cercano)

2. PME: calcular una aproximación para la parte a largo plazo de las fuerzas no enlazadas de largo alcance (comunicación intensiva en ejecuciones multi nodo)

3. Enlazada (B): computar las fuerzas enlazadas.

4. Otros: reforzar las restricciones de enlazamiento, predecir las posiciones de los átomos, calcular las listas de vecinos y otros.

La versión de GROMACS para GPU acelera la tarea que más tiempo consume en la GPU (PP), mientras que las otras tres tareas (PME, enlazada y otros) solo se pueden ejecutar en la CPU. La tarea PP es independiente de Enlazada y PME, y se puede ejecutar al mismo tiempo, mientras que la tarea Otros depende en su mayoría de la salida de PP, PME y enlazada. Por lo tanto, la versión de GPU realiza las tareas PME y Enlazada en la CPU, mientras que la GPU ejecuta la tarea PP:

GROMACS descarga las tareas PP de cálculo intenso en las GPU

Al escalar el límite electrostático (distancia por encima de la cual una fuerza se procesa mediante la parte de largo alcance), GROMACS desvía el trabajo de la CPU (tarea PME) a la GPU (tarea PP); la activación automática se puede desactivar con la línea de comandos -tunepme. Debido a las restricciones de precisión, esto no se puede realizar de la manera contraria. Por ejemplo, en el caso de que la GPU complete la tarea PP más rápido que la CPU (consulta el gráfico siguiente), GROMACS desvía el trabajo de la CPU a la GPU, lo que resulta en un menor tiempo de ejecución de la aplicación.

GROMACS desvía cargas de trabajo a las GPU para realizar simulaciones más rápidas

La tarea PP tiene una complejidad de O(m*n) y la tarea PME de O(n log(n)), donde n es el número de partículas y m es el tamaño de la lista de vecinos. Los valores típicos de m son desde 200 hasta 400, mucho menor que n.

La configuración siguiente se puede usar para ajustar el rendimiento de GROMACS.

CONFIGURACIÓN DE EJECUCIÓN

GROMACS usa MPI y OpenMP para poder usar todos los recursos de GPU y CPU disponibles en un clúster. Dependiendo del conjunto de entrada y de la capacidad de la red, hay diferentes configuraciones de ejecución óptimas. Varían desde un proceso MPI por núcleo lógico con un subproceso OpenMP cada uno con un procedimiento MPI por nodo que usa todos los núcleos disponibles en ese nodo. Para elegir la mejor configuración de lanzamiento se pueden aplicar las siguientes directrices:

  • Si solo se usa un socket de CPU (a veces, doble), la paralelización OpenMP es más eficiente generalmente que MPI
  • Si se utilizan múltiples sockets de CPU o nodos, la paralelización MPI y OpenMP (híbrido) con 2-4 subprocesos OpenMP por rango MPI es generalmente más eficiente que sólo con MPI
  • Con un gran número de nodos, sería recomendable usar más subprocesos OpenMP por rango MPI para reducir la comunicación necesaria. El tiempo dedicado a la comunicación se notifica en el archivo de salida md.log (consulte el recuento Script 1 Time para la comunicación en md.log).
Proceso: Núm. rangos Núm. subprocesos Núm. de llamadas Tiempo obst. (s) Gigaciclos % de suma total
[…]
Coord. com. 2 10  252 681 63,467 3808,202 3,6
[…]
Energías com. 2 10  25 917 1,108 66,457 0,1
Total 1782,537 106 957,655 100,0
Desglose de la computación en malla de PME
[…]
Com. PME 3D-FFT 2 10  518 322 126,829 7610,103 7.1
[…]

Script 1: Registro del tiempo para la comunicación en md.log

En la versión MPI, la cantidad de rangos MPI se puede controlar con el iniciador de la implementación MPI utilizada (parámetro -np) y la cantidad de subprocesos OpenMP con la opción de la línea de comandos -ntomp de mdrun o con la variable OMP_NUM_THREADS del entorno. La versión de un nodo de mdrun usa un subproceso MPI (una implementación MPI interna basada en subprocesos) y OpenMP. En esta versión, la cantidad de subprocesos de OpenMP también se puede controlar con la opción de la línea de comandos -ntomp y la cantidad de rangos MPI con -ntmpi. En la versión acelerada por GPU de GROMACS, es necesario tener al menos un rango MPI por GPU para usar todas las GPU disponibles.

FIJACIÓN DE PROCESOS O SUBPROCESOS

Los procesos MPI y subprocesos OpenMP de GROMACS deben fijarse correctamente a los núcleos o subprocesos del sistema. Esto se puede realizar mediante el sistema iniciador o por lotes MPI usado, o bien con GROMACS. De forma predeterminada, GROMACS intenta fijar automáticamente los procesos, pero esta opción está desactivada si el iniciador MPI realizó fijaciones, o bien si la implementación de OpenMP o el número de núcleos lógicos disponibles no coincide con la cantidad total de subprocesos usados en un nodo. En este caso, la fijación se puede activar con la opción -pin si no la ha realizado el iniciador MPI o el sistema de procesamiento por lotes.

SMT/HYPERTHREADING

El uso de todos los núcleos lógicos en un sistema (también conocido como SMT o Hyperthreading) suele dar una pequeña ganancia de rendimiento.

GPU BOOST

Los kernels de la GPU de GROMACS no aprovechan toda la potencia y el consumo térmico de una GPU. Por tanto, es seguro y recomendable aumentar los relojes de la GPU al máximo a través de los relojes de la aplicación. Como GROMACS 5.1 hace esto automáticamente mediante el ejecutable gmx si los permisos del reloj de la aplicación se establecen en UNRESTRICTED, debería observarse una salida similar a la siguiente: Changing GPU clock rates by setting application clocks for Tesla K80 to (2505,875) (Cambio de frecuencia del reloj de la GPU al configurar los relojes de la aplicación para Tesla K80 a [2505,875])

En el caso de que los permisos del reloj de la aplicación se establezcan en RESTRINGIDO, GROMACS advierte acerca de esto con una salida similar a la siguiente:

No se pueden cambiar los relojes de la GPU a un valor óptimo por falta de permisos para establecer los relojes de la aplicación para Tesla K80. Los valores actuales son (2505,562). Los valores actuales son (2505,875). Usa sudo nvidia-smi -acp UNRESTRICTED o ponte en contacto con el administrador para cambiar los permisos del reloj de la aplicación.

Como se indica en el mensaje de advertencia, puede utilizar

$ sudo nvidia-smi -acp UNRESTRICTED

para cambiar los permisos del reloj de la aplicación a UNRESTRICTED.

Si su compilación GROMACS no incluía GDK, entonces GROMACS indicará una advertencia similar a esto:

GROMACS ha sido configurada sin soporte para NVML, por lo que no puede aprovechar
los relojes de la aplicación de la GPU Tesla K80 detectada para mejorar el rendimiento.
Repite la compilación con la biblioteca de NVML (compatible con el driver utilizado) o configura los relojes de la aplicación manualmente.

En este caso, se puede configurar manualmente el reloj del impulso máximo con un comando similar al siguiente. Tenga en cuenta que el ajuste máximo del reloj será diferente para diferentes GPU.

$ nvidia-smi -ac 2505,875       # Este es el número máximo de relojes para la GPU K80

Para obtener más información sobre cómo mejorar el rendimiento de la GPU, consulta Aumentar el rendimiento con GPU Boost y K80 Autoboost.

ACTUALIZACIONES DE LA LISTA DE VECINOS

Cuando se usa el esquema de limitación verlet (necesario para la aceleración por GPU), el intervalo de actualización de las listas de vecinos se puede elegir libremente. Si la búsqueda de la lista de vecinos tarda mucho tiempo en completarse, el intervalo de actualización se puede incrementar. El tiempo de búsqueda de la lista de vecinos se muestra en md.log (consulta el Script 2: Registro del tiempo para la búsqueda de lista de vecinos en md.log). Un incremento potencialmente necesario del radio del límite se realiza automáticamente. Como las listas de vecinos se calculan en la CPU y un límite superior genera un incremento del cálculo de la fuerza, nstlist deriva parte del trabajo de la CPU a la GPU. Además, el cálculo de la lista de vecinos necesita comunicación entre los rangos MPI, por lo que esto también intercambia comunicación por computación.

Proceso: Núm.
nodos
Núm.
subprocesos
Núm.
de llamadas
Tiempo obst.
(s)
Gigaciclos % de suma total
[…]
Búsqueda de vecinos 2 10  6480 32,464 1947,963 1,8
[…]
Total 1782,537 106 957,655 100,0

AJUSTE DE EQUILIBRIO DE CARGA PME-PP

[…]
Tiempo de evaluación de la fuerza GPU/CPU: 4,972 ms / 5,821 = 0,854 ms
Para obtener un rendimiento óptimo, esta relación debe estar cerca de 1.
[…]

Script 3: Resultado del equilibrio de carga PME PP en md.log

Como se ha descrito antes, la carga entre los nodos PME y PP puede ser equilibrada. Esto está activado de forma predeterminada y se puede desactivar con el parámetro -notunepme. En las ejecuciones aceleradas por GPU de un solo proceso, el equilibrio de carga de PP (GPU)/PME (CPU) se muestra en el archivo de salida md.log (consulta el Script 3: Resultado del equilibrio de carga PME PP en md.log)

SEPARACIÓN DE RANGOS PME

Desglose de la computación en malla de PME

Desglose de la computación en malla de PME
Redist. de PME X/F 2 10  518 322 167,004 10 020,730 9,4
Dispersión/recopil. PME 2 10  518 322 429,501 25 771,381 24,1
PME 3D-FFT 2 10  518 322 123,600 7416,369 6,9
Com. PME 3D-FFT 2 10  518 322 126,829 7610,103 7.1
Elec. soluc. PME 2 10  259 161 13,470 808,259 0,8

Script 4: Registro del tiempo para la tarea PME en md.log

El procesamiento de las interacciones de largo alcance no enlazadas con PME es una tarea muy intensiva de comunicación, ya que es necesario realizar una operación de FFT 3D. Como las tareas PP y PME son independientes, GROMACS admite el inicio de los nodos PME separados (procesos que solo realizan la tarea PME) para reducir la presión en la red de la forma MPMD. De forma predeterminada, el número de rangos PME se determina automáticamente solo cuando no se usan las GPU. Puede ajustarse con el parámetro -npme. Si el tiempo de comunicación de la tarea PME notificado en el archivo de salida md.log es alto, debe considerarse una PME separada. Esto ocurre normalmente con 3-4 o más nodos.

Hay dos opciones diferentes para asignar rangos MPI a nodos PP y PME que son interesantes para ejecuciones aceleradas de la GPU de GROMACS:

  • Los nodos PME se intercalan con los llamados nodos PP (los nodos PP ejecutan la tarea Fuerza); lo que agrega más tensión a la red, pero evita que haya recursos no ocupados. La opción de la línea de comandos es -ddorder interleave (predeterminado para ejecuciones aceleradas por GPU).
  • Los nodos PME se agrupan cerca. Esto reduce la tensión en la red, pero desactiva algunas GPU. La opción de la línea de comandos es -ddorder pp_pme (predeterminado solo para ejecuciones de la CPU).

COMPARTIR UNA GPU ENTRE VARIOS PROCESOS
Y EL SERVICIO MULTIPROCESO (MPS)

En muchas situaciones, compartir una GPU entre múltiples rangos MPI puede aumentar el rendimiento.

Para el caso de un solo nodo con una compilación no MPI de GROMACS, esto puede soportarse simplemente a través de un subproceso MPI con -ntmpi y los parámetros, y simplemente estableciendo (o dejando que lo haga GROMACS) -ntmpi para ejecutar 2 o más rangos MPI por GPU.

Para ejecuciones con múltiples nodos y compilación MPI de GROMACS, se puede compartir una GPU con capacidad de cómputo 3.5 a través del Servicio multiproceso (MPS). Para ello, es necesario establecer las GPU usadas en modo de proceso exclusivo e iniciar un demonio de control de MPS en cada nodo (nvidia-cuda-mps-control):

#!/bin/bash
sudo nvidia-smi -c 3
nvidia-cuda-mps-control -decho " -started nvidia-cuda-mps-control on `hostname`"

Script de ejemplo para iniciar MPS en un solo nodo

#!/bin/bash
echo quit | nvidia-cuda-mps-control
sudo nvidia-smi -c 0
echo " stopping MPS on `hostname`"

Secuencia de comandos de ejemplo para detener MPS en un solo nodo

Aquí encontrarás más información sobre MPS.

OPCIONES AVANZADAS

Existen más ajustes avanzados de descomposición de dominios disponibles. Para los sistemas no homogéneos (por ejemplo, #átomos por dominio), configurar estos ajustes puede mejorar aún más el rendimiento. Consulta el manual de GROMACS o la lista de distribución de correo de GROMACS para obtener más información.

Descargo de responsabilidad

* GROMACS ofrece un gran número de opciones de ajuste del rendimiento para el procesamiento de diferentes entradas y en diferentes arquitecturas o sistemas. El conjunto de instrucciones está dirigido a cubrir aspectos importantes para GROMACS acelerados por GPU.

EJEMPLOS PASO A PASO

En esta sección, se describen algunos ejemplos para ejecutar GROMACS. Los conjuntos de datos de entrada usados en dichos ejemplos están disponibles aquí.

Para empezar, descarga y extrae el archivo:

$ wget ftp://ftp.gromacs.org/pub/benchmarks/water_GMX50_bare.tar.gz
$ tar -zxvf water_GMX50_bare.tar.gz

Estos datos incluyen ejemplos de datos de “agua” de diferentes tamaños con nombres de carpetas del tipo 0384, 0768 y 1536. El nombre de la carpeta se corresponde con el número de átomos en miles (es decir, la carpeta 0768 contiene un caso con 256 000 moléculas de agua y 768 000 átomos). El primer paso es preparar los datos utilizando la herramienta grompp.

Por ejemplo, para ejecutar el caso 1536, usa los comandos siguientes. Usa pme.mdp si quieres usar PME (Particle Mesh Ewald). Al ejecutar el comando siguiente se generará el archivo topol.tpr que se utiliza como entrada para mdrun de GROMACS.

$ cd water-cut1.0_GMX50_bare/1536
$ gmx grompp -f pme.mdp

A continuación se describen algunas variaciones para ejecutar GROMACS con y sin GPU en 1 o 2 nodos que representan un subconjunto de los casos que se ejecutaron para recoger los resultados de ejemplo al final de esta sección.

El número de rangos MPI utilizados en los ejemplos de la GPU depende del número de GPU del sistema y del número de rangos MPI por GPU. En muchos casos, ejecutar más de 1 rango MPI por GPU ayuda al rendimiento. Esto es posible utilizando el subproceso MPI para el ejemplo de un solo nodo y mediante la función CUDA MPS cuando se ejecuta en varios nodos. En esta guía se describen algunos detalles adicionales sobre CUDA MPS.

Se recomienda tener normalmente de 2 a 6 subprocesos OMP para cada rango cuando se usan las GPU. Se puede usar -ntomp o la variable OMP_NUM_THREADS para especificar el número de subprocesos OMP por rango. Normalmente, es necesario realizar pruebas para ajustar el número de rangos MPI en comparación con el número de subprocesos por rango para ver qué funciona mejor para una determinada configuración del sistema y de los datos de entrada.

En los ejemplos 1, 2 y 4 siguientes se usan 2 Tesla K80 con 4 GPU (2 tarjetas K80) por nodo.

Los 5 ejemplos se ejecutan en los nodos con 2 sockets de CPU Haswell

  • 32 núcleos en total
  • hyperthreading desactivado

Ejemplo 1. Los parámetros de inicio (ntmpi y ntomp) no se especifican, por lo que GROMACS decidirá automáticamente los rangos MPI por GPU y el número de subprocesos OMP por rango.

Se ejecuta en un único nodo con 4 GPU con un subproceso MPI y se permite que GROMACS determine los parámetros de lanzamiento (ntmpi, ntomp) automáticamente.

$ GROMACS_BIN_DIR/gmx mdrun -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu

Si tienes tiempo para experimentar, puedes probar las combinaciones disponibles de rangos MPI por GPU y subprocesos OMP por rango para obtener la mejor configuración. Las opciones disponibles dependen de la cantidad total de núcleos de CPU y de GPU por nodo. Por ejemplo, si tienes 4 GPU por nodo con 32 núcleos de CPU por nodo, puedes probar las combinaciones siguientes para ver cuál ofrece el mejor rendimiento.

-ntmpi 4 -ntomp 8 # 1 rango por GPU con 8 subprocesos por rango
-ntmpi 8 -ntomp 4 # 2 rangos MPI por GPU con 4 subprocesos por rango
-ntmpi 16 -ntomp 2 # 4 rangos MPI por GPU con 2 subprocesos por rango

Para los ejemplos 2-5 siguientes, los casos seleccionados proporcionan el mejor resultado en el sistema de pruebas de referencia.

Ejemplo 2. Ejecutar en un único nodo con 4 GPU, 4 subprocesos OMP/rango, 8 rangos y 2 rangos MPI por GPU con el subproceso MPI

$ GROMACS_BIN_DIR/gmx mdrun -ntmpi 8 -ntomp 4 -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu

Ejemplo 3. Ejecutar un nodo único solo con núcleos de CPU, 1 subproceso OMP/rango y 32 rangos con el subproceso MPI

$ $GROMACS_BIN_DIR/gmx mdrun -ntmpi 32 -ntomp 1 -resethway -noconfout -nsteps 4000 -v -pin on -nb cpu

Ejemplo 4. Ejecutar en 2 nodos con 4 GPU/nodo, 2 subprocesos OMP/rango, 16 rangos por nodo y 4 rangos MPI por GPU usando CUDA MPS para permitir múltiples rangos MPI por GPU:

$ OMP_NUM_THREADS=2 mpirun -np 32 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb gpu -nsteps 8000 -v -pin on

Ejemplo 5. Ejecutar en 2 nodos solo con núcleos de CPU, 1 subproceso OMP/rango y 32 rangos por nodo

$ OMP_NUM_THREADS=1 mpirun -np 64 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb cpu -nsteps 8000 -v -pin on

Pruebas de referencia

Esta sección presenta el rendimiento de varias GPU en un único nodo. Además, la prueba de referencia muestra el rendimiento en uno, dos y cuatro nodos utilizando dos tarjetas GPU Tesla P100 por nodo. Cada tarjeta P100 tiene una GPU Pascal. Las ejecuciones se realizaron con variaciones de las líneas de comandos descritas para los tamaños de datos 0768, 1536 y 3072 de “agua”.

Rendimiento de un nodo de agua de 768 000
Rendimiento de un nodo de agua de 1,5 millones
Rendimiento de un nodo de agua de 3 millones
Rendimiento escalable de agua de 3 millones

Configuraciones recomendadas del sistema

Configuración de hardware

PC

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

16-32 GB

CPU

8 núcleos, 8 GHz
10 núcleos, 2,2 GHz
16 núcleos, 2 GHz

Modelo de GPU

NVIDIA TITAN X

GPU

1-2 TITAN X

Servidores

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

32 GB

CPUs/Nodos

2 (16+ núcleos, 2+ GHz)

Modelo de GPU

NVIDIA® Tesla® P100

GPU/Nodo

1-2 tarjetas GPU Tesla

Interconexión

InfiniBand

Configuración de software

Pila de software

Parámetro
Versión

SO

Linux

Controlador de GPU

352,79 o posterior

Kit de herramientas de CUDA

7.5 o posteriores

Compilador

GCC 5.0

Crea tu solución ideal de GPU hoy mismo.