SPECFEM3D Cartesian
acelerado por GPU

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

SPECFEM3D Cartesian

SPECFEM3D Cartesian simula la propagación de ondas acústicas (fluido), elásticas (sólido), combinadas acústicas/elásticas, poroelásticas o sísmicas en cualquier tipo de malla conformada de hexaedros (estructurada o no). Por ejemplo, puede modelar la propagación de ondas sísmicas en cuencas sedimentarias o en otros modelos geológicos regionales después de terremotos. También se puede usar para pruebas no destructivas u ondas acústicas oceánicas.

SPECFEM3D Cartesian ofrece una aceleración hasta 38 veces o más en un nodo NVIDIA® Tesla® P100 en relación con sistemas de una sola CPU, lo que permite que los usuarios ejecuten simulaciones en horas en lugar de semanas.

SPECFEM3D Cartesian ofrece una aceleración 38 veces mayor con GPU

Instalación

Requisitos del sistema

SPECFEM3D_Cartesian puede usarse en cualquier plataforma paralela con un compilador moderno de C y Fortran, y una implementación MPI reciente.

De manera opcional, puede usar git para descargar el código fuente.

Instrucciones de descarga e instalación

   1. Descarga el código fuente de SPECFEM3D_Cartesian. Se puede obtener la última versión con

git clone --recursive --branch devel

También encontrarás instrucciones para descargar versiones anteriores o de lanzamiento, así como manuales de usuario y recursos para usuarios en el siguiente enlace: https://geodynamics.org/cig/software/specfem3d/

2. Asegúrate de que nvcc, gcc y gfortran estén disponibles en el sistema y en la ruta. Si no están disponibles, ponte en contacto con el administrador del sistema. Además de compilar con MPI mpicc, mpif90 debe estar en la ruta.

Ten en cuenta que el rendimiento de las ejecuciones de una sola CPU y el intervalo de generación de la base de datos dependen del compilador elegido. Por ejemplo, el compilador de PGI es mucho más rápido que gfortran para el intervalo de generación de base de datos y un poco más rápido para el caso de una sola CPU para la simulación xspecfem3d. No ofrece un efecto considerable en cuanto al rendimiento de la simulación xspecfem3d en los casos de GPU.

3. Configura el paquete

./configure --with-cuda=cuda8

Ten en cuenta que esto compilará un ejecutable para dispositivos con capacidad de cálculo 6.0 o superior.

  5. Compila el programa

make

Ejecución de trabajos

Para ejecutar trabajos, es necesario modificar los archivos de parámetros que definen la simulación. En la sección de la prueba de referencia, se muestra un ejemplo específico basado en el ejemplo del “modelo simple” encontrado en “specfem3d/EXAMPLES/meshfem3D_examples/simple_model”.

Los archivos de parámetros están en la carpeta “DATA”. Asegúrate de que DATA/Par_file y DATA/meshfem3D_files/Mesh_Par_file estén configurados correctamente. Ten en cuenta que la cantidad de tareas MPI (NPROC) debe configurarse en DATA/Par_file, y la cantidad de tareas en cada dirección (NPROC_XI y NPROC_ETA) debe establecerse en DATA/meshfem3D_files/Mesh_Par_file. También es importante que

GPU_MODE = .true.

esté configurado en Par_data; de lo contrario, el programa no se ejecutará en las GPU.

La ejecución de trabajos consiste en un proceso de tres fases. Aquí mostramos el ejemplo de ejecución en cuatro tareas. Ten en cuenta que las tres fases deben ejecutarse con la misma cantidad de tareas MPI. En las ejecuciones de GPU, usarás una tarea MPI por GPU. En las ejecuciones de una sola CPU, usarás normalmente una tarea MPI por núcleo. Los archivos Par_file y Mesh_Par_file tienen que modificarse para cada caso.

1. Ejecuta el reticulador interno

mpirun -np 4 ./bin/xmeshfem3D

2. Genera las bases de datos

mpirun -np 4 ./bin/xgenerate_databases

3. Ejecuta la simulación

mpirun -np 4 ./bin/xspecfem3D

Pruebas de referencia

En esta sección, se explica el proceso para probar el rendimiento del sistema y se muestra el rendimiento en una configuración típica. El ejemplo que se describe se basa en el ejemplo de "modelo simple" que se encuentra en “specfem3d/EXAMPLES/meshfem3D_examples/simple_model”.

1. Descarga e instala el programa siguiendo las instrucciones de la sección Instalación.

2. Descarga el archivo SPECFEM3D_Cartesian_GPU_READY_FILES_v2.tgz y extráelo. Este archivo contiene scripts de ejemplo que compilan specfem3d y usan este ejemplo ejecutando “build_run_specfem3d_cartesian.sh”. Para ejecutarlo en otro sistema, es necesario realizar pequeñas modificaciones en los módulos paths/env usados. Las instrucciones a continuación describen el caso de prueba de cuatro GPU paso a paso. Los scripts incluidos ejecutan casos para una, dos y cuatro GPU y 32 o 36 núcleos de CPU, y se pueden revisar para obtener más información.

tar -xzvf SPECFEM3D_Cartesian_GPU_READY_FILES_v2.tgz

3. Copia input_cartesian_v4.tar en la carpeta raíz de instalación de specfem3d.

cp input_cartesian_v4.tar specfem3d

4. Cambia al directorio raíz SPECFEM.

cd specfem3d

5. Extrae los diferentes archivos Par_files del archivo tar.

tar -xvf input_cartesian_v4.tar

Esto extraerá variaciones de los archivos de datos en los directorios DATA y DATA/Meshfem3D_files en la instalación SPECFEM3D Cartesian, y actualizará los archivos STATIONS, FORCE SOLUTION y CMTSOLUTION. Incluimos archivos para una, dos y cuatro GPU y para 36 CPU. El tamaño del problema ha incrementado ligeramente para aumentar el tiempo de ejecución. Ten en cuenta que también hay restricciones en el número de tareas MPI que se pueden usar. Encontrarás más información en DATA/Par_file. Las variables NPROC cambiarán en función de si la ejecución usa una GPU (1 × 1), dos GPU (2 × 1), cuatro GPU (2 × 2) o 36 núcleos de CPU (9 × 4). Fíjate también en que el ejemplo a continuación corresponde a un tamaño de malla 288 × 256 para una CPU de 36 núcleos. Los archivos de ejemplo incluidos en input_cartesian.tar también contienen ejemplos Mesh_Par_file para 256 × 256 que se pueden usar para un caso de CPU de 32 núcleos. Se pueden crear otras variaciones para cantidades diferentes de núcleos. Las reglas para los tamaños válidos están descritas en Mesh_Par_file.

Par_file:

NPROC              = 4     # cambia en función de la cantidad de GPU o núcleos de CPU utilizados
NSTEP              = 10000
DT                 = 0.01
GPU_MODE           = .true.     # cambiar a .false. Para ejecuciones de una sola CPU

DATA/meshfem3D_files/Mesh_Par_file:
NEX_XI             = 288
NEX_ETA            = 256
# cantidad de procesadores MPI con xi y eta (puede ser diferente)
NPROC_XI           = 2     # 2 × 2 para el ejemplo de 4 GPU
NPROC_ETA          = 2
NREGIONS           = 4
# definir las diferentes regionales del modelo como:
#NEX_XI_BEGIN #NEX_XI_END #NEX_ETA_BEGIN #NEX_ETA_END #NZ_BEGIN #NZ_END #material_id
1      288      1     256      1      4      1
1      288      1     256      5      5      2
1      288      1     256      6      15     3
14     25       7     19       7      10     4

6. Cambia al directorio DATA.

cd DATA

7. Copia el archivo correspondiente a la cantidad de GPU que quieres ejecutar en Par_data. Por ejemplo, para la versión de cuatro GPU.

cp Par_file_4_proc Par_file

8. Cambia al directorio meshfem3D_files.

cd meshfem3D_files

9. Copia el archivo correspondiente a la cantidad de GPU que quieres ejecutar en Mesh_par_file. Por ejemplo, para la versión de cuatro GPU

cp Mesh_Par_file_4_proc_288x256 Mesh_Par_file

10. Vuelve al directorio base.

cd ../..

11. Elimina los archivos antiguos OUTPUT_FILES y DATABASES_MPI. Ten en cuenta que quizá quieras guardar en una ubicación nueva, ya que las ejecuciones posteriores sobrescribirán los archivos en la carpeta OUTPUT_FILES.

rm OUTPUT_FILES -r
mkdir OUTPUT_FILES
rm DATABASES_MPI -r
mkdir DATABASES_MPI

12. Ejecuta el reticulador interno.

mpirun -np 4 ./bin/xmeshfem3D

13. Genera las bases de datos.

mpirun -np 4 ./bin/xgenerate_databases

14. Ejecuta la simulación.

mpirun -np 4 ./bin/xspecfem3D

15. Comprueba el archivo output_solver.txt en la carpeta OUTPUT_FILES. La medida del rendimiento es el valor de “Total elapsed time” (total de tiempo transcurrido) de este archivo.

grep "Total elapsed time" OUTPUT_FILES/output_solver.txt

Ten en cuenta que el reticulador y los intervalos de generación de base de datos no están acelerados por GPU y, en la práctica, se realiza una vez y, después, el resultado puede usarse para muchas simulaciones (paso del solucionador). Por este motivo, solo el tiempo del paso de solucionador se usa para la prueba de referencia.

Resultados del rendimiento esperado

En esta sección se incluyen pruebas de referencia del rendimiento esperado en distintos sistemas de uno o varios nodos.

Rendimiento escalar de varias GPU de SPECFEM3D Cartesian
SPECFEM3D Cartesian ofrece una aceleración 38 veces mayor con GPU
SPECFEM3D Cartesian entre 10 y 40 veces más rápido

Configuraciones recomendadas del sistema

Configuración de hardware

PC

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

16-32 GB

CPU

2 (más de 10 núcleos, 2 GHz)

Modelo de GPU

GeForce® GTX TITAN X

GPU

1-4

Servidores

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

64 GB

CPUs/Nodo

2 (más de 10 núcleos, más de 2 GHz)

Número total de nodos

1

Modelo de GPU

NVIDIA®Tesla® P100,
Tesla® K80

GPU/nodo

1-4

Configuración de software

Pila de software

Parámetro
Versión

SO

CentOS 7.3

Controlador de GPU

375.20 o posterior

Kit de herramientas de CUDA

8.0 o posteriores

Compiladores de PGI

16.9

Crea tu solución ideal de GPU hoy mismo.