Ejemplos

Transcripción

Ejemplos
Aurelio Rodríguez
[email protected]
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés.
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
¿Casos de usuario?
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Documentación Actualizada
Última versión de la documentación en:
https://oc.cesga.es/public.php?service=files&t=03888d31fc9363a06320aad01c2f2c6e
http://goo.gl/rC7fqE
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés.
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Administración: Instalación
Registro de la licencia:
Ver documento adjunto (DO_Registro_intel.pdf)
Requisitos previos:
paquetes de desarrollo gnu (especialmente gcc-c++)
Oracle JDK
Descarga de productos:
completa + de 3GB
Se recomienda el uso del “online installer” siempre que se tenga acceso a internet en el servidor de
instalación.
Intel Cluster Studio 2013_sp1 for Linux
Intel® C++ Composer XE for Linux
l_ccompxe_online_2013_sp1.0.080.sh
Intel® Fortran Composer XE for
Linux
l_ccompxe_online_2013_sp1.0.080.sh
Intel® MPI Library
l_mpi_p_4.1.1.036.tgz (install.sh)
Intel® Trace Analyzer and Collector
l_itac_p_8.1.3.037.tgz (install.sh)
Administración: Instalación
Directorios:
/apps/intel
bin : comandos principales
composerxe : link a composer_xe_2013_sp1
composer_xe_2013_sp1 : Contiene links a la ultima release de la versión
composer_xe_2013_sp1.0.080 : Ultima versión
impi : Directorio con las versiones de impi
include : link a composerxe/include
ipp : link a composerxe/ipp (
itac : directorio de versiones del Trace analyzer and Collector
lib : link a composerxe/lib (librerías de los compiladores)
man : link a composerxe/man (man pages)
mkl : link a composerxe/mkl (Intel MKL)
mpirt : link a composerxe/mpirt (Intel MPI runtime)
tbb : link a composerxe/tbb (Threads building blocks)
Administración: Entorno
Variables de entorno:
source /apps/intel/composerxe/bin/compilervars.sh
(configura compiladores, debugger, mkl, ipp y tbb)
source /apps/intel/impi/4.1.1.036/bin64/mpivars.sh
(configura impi)
source /apps/intel/itac/8.1.3.037/bin/itacvars.sh
(configura itac)
Todas recogidas en el script /apps/intel/env.sh
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Intel C++
Rendimiento tanto en serie como paralelo para procesadores Intel.
Introduce facilidades para la vectorización y la programación paralela para simplificar el desarrollo
de aplicaciones con alto rendimiento.
●
Destacan entre estas características el soporte de nuevas funcionalidades de OpenMP 4.0 y la
posibilidad de autoparalelización.
●
Mantiene compatibilidad con los compiladores más usados.
●
Documentación completa:
http://software.intel.com/en-us/compiler_14.0_ug_c
Compiladores: Intel C++
http://software.intel.com/intel_c_composer_xe_pb_en
Compiladores: Intel C++
INT:
Intel Compiler 14.0:
C/C++: -xAVX -ipo -O3 -no_prec-div -static -parallel -opt-prefecth -auto-p32
GCC 4.8.1:
C: -m64 -Ofast -ffast-math -flto -march=native -mfpmath=sse -funroll-all-loops -static -ftreeparallelize-loops=16
C++: m64 -Ofast -ffast-math -flto -march=native -mfpmath=sse -funroll-all-loops
FP Speed:
Intel Compiler 14.0:
C/C++: -xAVX -ipo -O3 -no_prec-div -static -parallel -opt-prefecth -ansy-alias
GCC 4.8.1:
C: -m64 -Ofast -ffast-math -flto -march=native -mfpmath=sse -funroll-all-loops -static -ftreeparallelize-loops=16
C++: m64 -Ofast -ffast-math -flto -march=native -mfpmath=sse -funroll-all-loops
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Intel C++
Uso básico:
Comandos: ‘icc’ para C, y ‘icpc’ para C++
Opciones “-O” compatibles con gcc pero no idénticos
-O2 es el nivel de optimización por defecto (en gcc es -O0)
-O* no implica los mismos conjuntos de opciones para gcc que para Intel pero los conceptos son
similares:
-O0 : para depuración
-O2 : por defecto
-O3 : optimizaciones avanzadas
icc –help, icpc -help proporciona la lista extensa de opciones
man icc
man icpc
Preprocessing
Semantic parsing
Optimization
Code generation
Linking
Compiladores: Intel C++
Ejemplos:
Compilar matrix.c sin optimización y con -O1 y comparar resultados
Ejecutar y comparar tiempos.
/apps/intel/composerxe/Samples/en_US/C++/optimize
Compilar int_sin.c con -O0 y -O1
Ejecutar y comparar resultados.
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Intel C++
Disable optimization
-O0
Optimize for speed (no code size increase)
-O1
Optimize for speed (default)
-O2
High-level optimizer, including prefetch,
unroll
-O3
Create symbols for debugging
-g
Inter-procedural optimization
-ipo
Profile guided optimization (muli-step build)
-prof-gen
-prof-use
Optimize for speed across the entire
program
-fast
(-ipo -O3 -no-prec-div -static -xHost)
**warning: -fast def’n changes over time
OpenMP support
-openmp
Automatic parallelization
-parallel
Compiladores: Intel C++ y optimizaciones HLO
“High-Level Optimizer” (HLO):
Opciones de Compilación: -O2 y -O3
Optimizaciones a nivel de lazo/bucle:
Loop unrolling
Cache blocking
Prefetching
Análisis de dependencias agresivo:
Determina si es seguro o no reordenar o paralelizar ciertas ordenes
Substitución de escalares:
Su objetivo es reducir referencias a memoria con referencias a registros
Compiladores: Intel C++ y optimizaciones HLO
Ejemplos:
Compilar matrix.c con -O[2|3] sin vectorización y comparar resultados
Ejecutar y comparar tiempos.
/apps/intel/composerxe/Samples/en_US/C++/optimize
Compilar int_sin.c con -O2 y -O3 sin vectorización
Ejecutar y comparar resultados.
Compiladores: Intel C++ y optimizaciones HLO
Ver man page: man icc
-O3:
Performs O2 optimizations and enables more aggressive loop transformations such as Fusion, BlockUnroll-and-Jam, and collapsing IF statements.
This option may set other options. This is determined by the compiler, depending on which operating
system and architecture you are using. The options that are set may change from release to release.
When O3 is used with options -ax or -x (Linux OS) or with options /Qax or /Qx (Windows OS), the compiler
performs more aggressive data dependency analysis than for O2, which may result in longer compilation
times.
The O3 optimizations may not cause higher performance unless loop and memory access
transformations take place. The optimizations may slow down code in some cases compared to O2
optimizations.
The O3 option is recommended for applications that have loops that heavily use floating-point
calculations and process large data sets.
Compiladores: Intel C++ y optimizaciones IPO
Interprocedural optimization (IPO): Análisis topológico de la aplicación
-ip :
Sólo para el fichero fuente actual.
-ipo :
Optimizaciones a través de todos o varios ficheros
Enabled optimizations:
●
Procedure inlining (reduced function call overhead)
●
Procedure reordering
●
Interprocedural dead code elimination and constant propagation
●
Enhances optimization when used in combination with other compiler
features
Especialmente código con muchas funciones pequeñas se beneficia de IPO
Compiladores: Intel C++ y optimizaciones IPO
Interprocedural optimization (IPO): Análisis topológico de la aplicación
Es un proceso en 2 pasos:
Compilar:
icc -c -ipo main.c func1.c func2.c
Paso 1
Objeto temporal
Paso 2
linkar:
Ejecutable
icc -ipo main.o func1.o func2.o
Compiladores: Intel C++ y optimizaciones IPO
Ejemplos:
Compilar matrix.c con -ipo y comparar resultados con sólo la opción -O3
Alguna mejora?
Compilar pi.c y la función externa fx.c sin -ipo y con -ipo
Ejecutar y comparar tiempos.
Compiladores: Intel C++ y optimizaciones PGO
“Profile-Guide Optimizations” (PGO)
Hasta ahora sólo hemos realizado análisis estáticos del código, muchas
cuestiones abiertas:
Es frecuente que x > y?
Cual es el tamaño de un contador concreto, es muy grande el bucle o
tenemos pocas iteracciones?
Que código se usa y con que frecuencia?
Compiladores: Intel C++ y optimizaciones PGO
“Profile-Guide Optimizations” (PGO)
La idea es usar información en tiempo de ejecución
para guiar la optimización final.
Enhancements with PGO:
– More accurate branch prediction
– Basic block movement to improve instruction
cache behavior
– Better decision of functions to inline (help IPO)
– Can optimize function ordering
– Switch-statement optimization
– Better vectorization decisions
Compiladores: Intel C++ y optimizaciones PGO
“Profile-Guide Optimizations” (PGO): Proceso de 3 pasos
1
Compilar y linkar añadiendo instrumentación:
icc -prof_gen prog.c
2
Ejecutamos el programa instrumentado:
./prog (conjunto de datos típico)
3
Compilaemos y linkamos con la info obtenida:
icc -prof_use prog.c
Profile dinámico:
12345678.dyn
Unión de todos los ficheros
.dyn en pgopti.dpi y
linkado del programa
optimizado
Compiladores: Intel C++ y optimizaciones PGO
Ejemplos:
Compilar matrix.c con las opción -prof-gen
Ejecutar pgen_matrix.exe (alguna idea por qué es tan lento?)
Compilar usando -prof-use y optimización
Alguna mejora?
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
OpenMP: Conceptos
OpenMP es una colección de
directivas, librerías y variables de
entorno para programas en
Fortran, C y C++
Es actualmente el estándar para
programación de sistemas de
memoria compartida y sistemas
de memoria compartida
físicamente distribuida
Página oficial OpenMP:
www.openmp.org
●
OpenMP consta básicamente de tres
elementos:
●
Control de paralelismo
●
directiva parallel
●
directivas de reparto de
trabajo (ej, directiva do)
●
Control de datos y comunicaciones
●
variables privadas y
compartidas
●
Sincronización
●
Para coordinar el acceso a
los datos (barreras,
secciones críticas ...)
OpenMP: Conceptos
OpenMP utiliza el modelo de ejecución paralela fork-join:
Un programa comienza su ejecución con un proceso único (thread maestro)
●
Cuando se encuentra la primera construcción paralela crea un conjunto de
threads, cada uno con su identificador (el thread maestro tiene identificador 0)
●
Una forma de indicar el número de threads que se van a crear es a través de
la variable de entorno OMP_NUM_THREADS
●
Los threads creados por el thread maestro van a ejecutar todos la misma copia
de código.
●
Cuando termina la región paralela sólo el thread maestro continua la ejecución
●
OpenMP: Conceptos
La paralelización del código se suele hacer de forma incremental,
empezando por la paralelización de los bloques computacionalmente más
costosos
Normalmente se emplea para la paralelización de lazos:
●
Se busca los lazos computacionalmente más costosos
●
Se reparten sus iteraciones entre los threads
void main()
{
int i;
double suma[1000];
for(i=0;i++;i<1000)
calcular_suma(suma[i]);
}
void main()
{
int i;
double suma[1000];
#pragma omp parallel for
for(i=0;i++;i<1000)
calcular_suma(suma[i]);
}
OpenMP: Conceptos
Los diferentes threads se comunican a través de variables compartidas
●
La compartición de datos puede llevar a un mal comportamiento del
programa debido al acceso simultáneo desde diferentes threads
●
Para evitarlo se utilizan directivas de sincronización (protegen los datos
de conflictos)
●
Las sincronizaciones son costosas ⇒ hay que tratar de evitarlas
●
OpenMP: Conceptos
Modelo de memoria:
●
El compilador de OpenMP debe expandir las zonas de memoria creadas
por un compilador secuencial para almacenar los datos
●
Cada thread tendrá su propio stack. Se utiliza este espacio para
almacenar los argumentos y variables locales de los procedimientos
invocados por ese thread
●
El stack privado de cada thread se utilizará también para almacenar las
variables privadas
●
El tamaño por defecto del stack de cada thread depende de la
implementación, pero es configurable con la variable de entorno
OMP_STACKSIZE
Heap
Stack thread 1
Stack thread 0
Datos Estáticos
Código objeto
OpenMP: Estándares
OpenMP-1
OpenMP-3
OpenMP-1.0 Fortran: 1997
●
OpenMP-1.0 C/C++: 1998
●
OpenMP-1.1 Fortran: 1999
●
2000
1997
OpenMP-3.0 Fortran y C/C++: 2008
OpenMP-3.1 Fortran y C/C++: 2011
OpenMP-2
OpenMP-2.0 Fortran: 2000
OpenMP-2.0 C/C++: 2002
●
OpenMP-2.5 Fortran y C/C++: 2005
●
●
http://openmp.org/wp/openmp-specifications
2008
2013
OpenMP-4
OpenMP-4.0: Especificaciones en Julio de
2013
●
Compiladores: Intel C++ y soporte OpenMP
Comienza el soporte de OpenMP 4.0 (vectorización y soporte
coprocesadores: target y simd)
http://software.intel.com/en-us/articles/intel-c-composer-xe-2013-sp1-release-notes (sección 4.2.1)
Incluye librerías OpenMP compatibles con el soporte OpenMP de GCC
(compatibilidad a nivel de objeto).
Compiladores: Intel C++ y soporte OpenMP
Opciones en compilación:
-openmp : Se genera código multihilo basado en las directivas
-openmp-report [= n ] : nivel de diagnóstico
0 : No diagnostico
1 : bucles/regiones/secciones paralelizadas (por defecto)
2 : (1) + construcciones y directivas (MASTER/SINGLE/CRITICAL/ORDERED/ATOMIC)
-openmp-simd
-no-openmp-simd : Uso o no de directivas Single Instruction Multiple Data (SIMD)
-openmp-stubs : compilación de programas openmp en modo secuencial
-openmp-task=model : Modelo de tareas OpenMP
intel : pragmas tipo #pragma intel_omp_taskq
omp : OpenMP API 3.0 (por defecto)
-openmp-threadprivate=type
legacy : Sin compatibilidad con otros compiladores (por defecto)
compat : compatibilidad con compiladores GNU
Uso de funciones de runtime: #include <omp.h>
http://software.intel.com/en-us/node/459486
Compiladores: Intel C++ y soporte OpenMP
Thread Affinity / Binding (http://software.intel.com/en-us/node/459494)
Variable de entorno KMP_AFFINITY
KMP_AFFINITY=[<modifier>,...]<type>[,<permute>][,<offset>]
Argumento
Valor por defecto
Descripción
modifier
noverbose
respect
granularity=core
Opcional.
Valores posibles:
granularity=<fine, thread,
core>,norespect,noverbose,nowarnings,proclist={<proclist>},respect,verbose,warnings
type
ninguno
Modelo de afinidad a usar:
compact, disabled, explicit, none, scatter
permute
0
Opcional. Entero positivo. No válido para type : explicit, none, o
disabled
offset
0
Opcional. Entero positivo. No válido para type : explicit, none, o
disabled
Compiladores: Intel C++ y soporte OpenMP
Tipos de afinidad (único argumento obligatorio):
type = none (por defecto)
No se usa afinidad. Se usará la interface OpenMP thread affinity para determinar la topología del
nodo. Si se especifica KMP_AFFINITY=verbose,none se obtiene un mapa del nodo.
type = compact
Los threads son colocados lo más próximos posible.
type = disabled
La interface de afinidad se desactiva completamente. Incluso funciones de bajo nivel como
kmp_set_affinity y kmp_get_affinity se comportarán como si el SO no tuviese soporte.
type = explicit
Lista de IDs de proc. El modificador proclist es obligatorio. Este modificador especifica la lista de
IDs de procesadores (SO) que se van a usar. También puede usar la variable de entorno
GOMP_CPU_AFFINITY para este fin (compatibilidad GCC).
type = scatter
Distribuye los threads lo maximo posible entre los procesadores del sistema. Lo opuesto de
compact.
Compiladores: Intel C++ y soporte OpenMP
Del manual GCC:
GOMP_CPU_AFFINITY: Bind threads to specific CPUs
Description:
Binds threads to specific CPUs. The variable should contain a space-separated or comma-separated list of
CPUs. This list may contain different kinds of entries: either single CPU numbers in any order, a range of
CPUs (M-N) or a range with some stride (M-N:S). CPU numbers are zero based. For example,
GOMP_CPU_AFFINITY="0 3 1-2 4-15:2" will bind the initial thread to CPU 0, the second to CPU 3, the
third to CPU 1, the fourth to CPU 2, the fifth to CPU 4, the sixth through tenth to CPUs 6, 8, 10, 12, and 14
respectively and then start assigning back from the beginning of the list. GOMP_CPU_AFFINITY=0 binds all
threads to CPU 0.
GOMP_CPU_AFFINITY=<proc_list> es un alias para
KMP_AFFINITY=granularity=fine,proclist=[<proc_list>],explicit
Compiladores: Intel C++ y soporte OpenMP
modifier = granularity
core
Por defecto. Cada thread es asignado a un core y puede
moverse en los contextos de threads de ese core.
fine/thread
Cada thread es asignado a único contexto.
Solo para type compact o scatter
permute : Nivel del árbol de topología más significativo
offset : desplazamiento con el que empiezo la colocación
respect : mantiene la mascara de afinidad del hilo que inicializa
Compiladores: Intel C++ y soporte OpenMP
Topologia en los nodos del cluster UCA:
Frontales: 2 packages x 8 cores/pkg x 2 threads/core (16 total cores)
Nodos: 2 packages x 8 cores/pkg x 1 threads/core (16 total cores)
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Compiladores: Intel C++ y soporte OpenMP
OMP_NUM_THREADS=4
KMP_AFFINITY=granularity=fine,compact
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Compiladores: Intel C++ y soporte OpenMP
OMP_NUM_THREADS=4
KMP_AFFINITY=granularity=fine,compact,1,0
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Compiladores: Intel C++ y soporte OpenMP
OMP_NUM_THREADS=4
GOMP_CPU_AFFINITY=1,3,12-15:2
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Compiladores: Intel C++ y soporte OpenMP
Ejemplo:
/apps/intel/composer_xe_2013_sp1.0.080/Samples/en_US/C++/openmp_samples/openmp_sample.c
Compilarlo con “icc -openmp -std=c99” y ejecutar con varios hilos.
Que ocurre cuando usamos afinidad? Probar distintas combinaciones ...
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Compatibilidad y portabilidad de Intel C++
Soporte completo de
C++ ISO/IEC 14882:1998 (C++ 98)
C ISO/IEC 9899:1990 (ANSI C o C89, C90)
C99:
●
restricted pointers (restrict keyword).
●
variable-length Arrays
●
flexible array members
●
complex number support (_Complex keyword)
●
hexadecimal floating-point constants
●
compound literals
●
designated initializers
●
mixed declarations and code
●
macros with a variable number of arguments
●
inline functions (inline keyword)
●
boolean type (_Bool keyword)
C++ 11:
http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler
Compiladores: Compatibilidad y portabilidad de Intel C++
Compatibilidad e interoperatividad con GCC
Alta compatibilidad: compatibilidad a nivel binario entre objetos. Es posible compilar usando ambos
compiladores.
Uso de extensiones GNU (soportadas un gran nº de ellas)
http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Opción de linkado -cxxlib : uso del runtime y headers de GCC (por defecto para C++).
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Vectorización con Intel C++
SIMD – Single Instruction Multiple Data
Modo escalar: una instrucción produce un resultado
Modo SIMD : una instrucción SSE o AVX produce varios resultados
Compiladores: Vectorización con Intel C++
SIMD – Single Instruction Multiple Data
Necesario un soporte especifico del hardware
Intel® SSE
Tamaño de vector: 128bit
Tipos de datos:
8,16,32,64 bit integers
32, 64bit floats
Longitud del vector: 2,4,8,16
Ej: Xi, Yi bit 32 int / float
Intel® AVX
Tamaño de vector: 256bit
Tipos de datos: 32, 64 bit floats
Longitud del vector: 4, 8, 16
Ej: Xi, Yi 32 bit int o float
Aparece 2011
Compiladores: Vectorización con Intel C++
SIMD – Single Instruction Multiple Data
Extensiones especificas:
Compiladores: Vectorización con Intel C++
Opciones del compilador:
-x<extension>
Optimizaciones específicas para procesadores Intel
El compilador intentara usar el conjunto de instrucciones hasta la extension especifica
-m<extension>
No hay chequeo de procesador.
No incluye optimizaciones especificas (valido para todos los procesadores que soporten la
extension)
-msse2 se activa con -O2 o superior
-ax<extension>
Codigo multiple: una linea de base junto versiones mas optimizadas
La linea base por defecto es -msse2
La linea base se modifica con las opciones anteriores
-axavx,sse4.2 – codigo optimizado para avx, sse4.2 y sse2 (lineabase por defecto)
-xHost
Se usara el juego de instrucciones superior soportado por el procesador donde se compila
-no-vec
Deshabilita la vectorización de manera global
Compiladores: Vectorización con Intel C++
Directivas:
#pragma vector always
Fuerza el uso de la vectorización sobre el bucle saltándose las indicaciones del compilador
:problemas de alineamiento, stride (separación entre elementos a ser vectorizados) no único …
Aun asi el compilador tiene que poder reconocer la transformación necesaria.
#pragma vector always assert abortara la compilación si hay algún problema con la vectorización
#pragma ivdep
Ignorar dependencias de datos no probadas
#pragma novector
Inhabilita la vectorización de un bucle individual
Compiladores: Vectorización con Intel C++
Compiladores: Vectorización con Intel C++
¿Por qué no vectoriza mi bucle?
-vec-report<n>
n=0: sin información (por defecto)
n=1: info sobre bucles vectorizados
n=2: info sobre bucles vectorizados y la razón de los no vectorizados.
n=3: Añade información de dependencias
n=4: reporta solo bucles no vectorizados
n=5: reporta solo bucles no vectorizados y su información de dependencia
-opt_report_phase hpo (High Performance Optimizer)
proporciona información adicional para la vectorización
Compiladores: Vectorización con Intel C++
Ejemplos:
Compilar matrix.c con -O[2|3], -xHost y -fast obteniendo un informe de
la vectorización
Ejecutar y comparar tiempos.
Vectorizan todos los bucles? Posibilidad de mejora?
Tutorial: http://software.intel.com/en-us/node/458754
/apps/intel/composer_xe_2013_sp1.0.080/Samples/en_US/C+
+/vec_samples
Compiladores: Vectorización con Intel C++
La vectorización depende de:
No haya dependencia de datos en las iteraciones de los bucles
Esquemas de datos regulares y predecibles para todos los operadores
Cuidado con los juegos con punteros, evitar accesos indirectos
Longitudes de vector suficientemente grandes
Datos alineados
Compiladores: Autoparalelizacion con Intel C++
-parallel
El compilador automaticamente convierte porciones de codigo serie en su
codigo equivalente multihilo
El auto-paralelizador analiza el flujo de datos en los bucles y genera codigo
multihilo para aquellos bucles que pueden ejecutarse de manera eficiente y
segura en paralelo.
-par-report0|1|2|3 (0: no info, 3 nivel maximo de diagnostico)
Genera informes acerca de secciones del programa que podrian ser
paralelizadas por el compilador
Compiladores: Autoparalelizacion con Intel C++
Ejemplos:
Compilar matrix.c con -parallel -par-report2 y combinatorias de otras opciones
Examinar el informe, posibles mejoras?
Compiladores: Autoparalelizacion con Intel C++
Autoparalelizacion guiada (Guided Automatic Parallelism GAP)
Opcion del compilador:
-guide (-guide -guide-vec -guide-par -guide-data-trans )
Con esta opcion el compilador no compila, analiza el codigo para dar consejo sobre vectorizacion
(-guide-vec), paralelizacion (-guide-par ), o ambas ( -guide ). Tambien, GAP puede hacer
sugerencias sobre como reordenar las estructuras de datos para obtener un acceso mas optimo (
-guide-data-trans ).
Compiladores: Autoparalelizacion con Intel C++
TUTORIAL sobre GAP
http://software.intel.com/en-us/node/458624
/apps/intel/composer_xe_2013_sp1.0.080/Samples/en_US/C++/guided_auto_parallel.tar.gz
Agenda
Administración: (1 horas)
Instalación: Procedimiento, actualización y detalles de interés
Configuración entorno: Variables de entorno de interés (si utilizan modules, se incluirá
la información para su configuración).
Compiladores: (4 horas)
Intel C++ Compiler XE 14.0
Introducción
Ejemplos básicos de compilación
Opciones avanzadas:
Ejemplos optimizaciones: HLO, IPO y PGO
Ejemplos soporte OpenMP
Ejemplos compatibilidad y portabilidad
Ejemplos paralelización y vectorización automática
Intel Fortran Compiler XE 14.0
Introducción y ejemplos básicos ejecución.
Compiladores: Intel Fortran
Rendimiento tanto en serie como paralelo para procesadores Intel.
Introduce facilidades en compilación para la vectorización, la programación paralela y soporte de
estándares para simplificar el desarrollo de aplicaciones Fortran con alto rendimiento.
Destacan entre estas características el soporte de Fortran 2003, Fortran 2008 y nuevas
funcionalidades de OpenMP 4.0 y la posibilidad de autoparalelización.
Documentación completa:
http://software.intel.com/en-us/compiler_14.0_ug_f
Compiladores: Intel Fortran
Compiladores: Intel Fortran
http://polyhedron.com/pb05-lin64-f90bench_SBhtml
Compiladores: Intel Fortran
Uso básico:
Comandos: ‘ifort’ para todos los estándares de Fortran soportados.
Opciones de optimización similares al compilador de C++
ifort –help proporciona la lista extensa de opciones
man ifort
Aspectos de la línea de comandos:
-fpscomp
Compatibilidad con Microsoft Fortran Power Station
-fpscomp filesfromcmd
La línea de comandos debe incluir los nombres de las unidades a las que no se ha especificado
nombre de fichero.
Compiladores: Intel Fortran
Ejemplos:
/apps/intel/composerxe/Samples/en_US/Fortran
Tutorial: http://software.intel.com/en-us/composerxe_2013SP1_coarray_f
Coarray Fortran: programacion paralela usando un modelo “single program
multiple data” (SPMD) soportando tanto memoria compartida como
distribuida en un metodo unico.
Compiladores
Opciones aritmética coma flotante:
-fp-model name
Mejora de consistencia evitando ciertas optimizaciones.
fast=[1|2] : Permite optimizaciones agresivas con ligero coste de precisión y consistencia (por
defecto fast=1).
precise : Sólo permite optimizaciones seguras.
double/extended/source : tipo de los resultados intermedios. Implica precise a no ser que se
especifique otra cosa. Double y extended no está disponible en Fortran.
except : Fuerza excepciones.
strict : precise+except
Se recomienda “-fp-model precise –fp-model source” para la mayoría de las situaciones con
problemas de consistencia y reproductibidad
-ftz[-]
Se fijan a 0 los denormals (underflows). Activa por defecto excepto con -O0
Compiladores
Opciones aritmética coma flotante:
-fimf-precision:name
Precisión de las funciones de la librería matemática. Por defecto se deja a la heurística del
compilador. Posibles valores: “high”, “medium” y “low”. En general mayor precisión, peor
rendimiento.
-fimf-arch-consistency=true
Asegura resultados consistentes entre los procesadores de la misma arquitectura. Por defecto es
“false”.
-[no-]prec-div
Mejora o reduce [no-] la precisión de las divisiones. En general leve impacto en rendimiento.
-[no-]prec-sqrt
Mejora o reduce [no-] la precisión de las raíces cuadradas. En general leve impacto en
rendimiento.
Compiladores
Opciones aritmética coma flotante:
Ejercicio:
Probar las versiones optimizadas con “-fp-model precise –fp-model source”
Compiladores
“Profiling” a nivel de función y bucle:
Similar a gprof.
Opciones compilador:
-profile-functions
Inserta instrumentación en la entrada y salida de las funciones para recoger los ciclos consumidos.
-profile-loops=<inner|outer|all>
Además inserta instrumentación en los bucles donde sea capaz según el tipo
Estas opciones generan ficheros de texto (.dump) y XML (.xml).
Visualizador para los ficheros XML:
java -jar /apps/intel/composer_xe_2013_sp1.0.080/bin/loopprofileviewer.jar <xml datafile>
Compiladores
“Profiling” a nivel de función y bucle:
Ejercicios:
icc -profile-functions -o prof-matrix matrix.c
icc -O1 -profile-functions -o prof-matrix matrix.c
icc -O1 -profile-loops=all -o prof-matrix matrix.c
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Compiladores: Intel Debugger
Intel® Debugger (IDB)
Depurador completo con las siguientes características:
●
Soporta C++ y Fortran
●
Código máquina y valores de registros
●
Depuración de aplicaciones multihilo
●
Análisis de compartición de datos entre hilos detectando accesos idénticos.
●
breakpoint inteligente para parar la ejecución a la vez en los diferentes hilos.
●
Vista de registros de vectores (SSE) con formatos y opciones de edición para la
depuración de aplicaciones paralelas SIMD.
●
Vistas especializadas en OpenMP para análisis de estado de aplicación.
●
Disponible GUI
Documentación completa:
http://software.intel.com/sites/products/documentation/doclib/stdxe/2013SP1/composerxe/debugger/user_guide/index.htm
Compiladores: Intel Debugger
Opciones de depuración en los compiladores:
-g, -debug, -debug full, -debug all
Producen información de depuración compatible con los depuradores habituales.
Desactiva -O2 y hace -O0 el defecto a no ser que se especifique la opción de optimización.
-debug none
Preparación
No se genera información de depuración (por defecto)
del
-debug minimal
Genera sólo nºs de línea pero no símbolos
ejecutable
-debug inline-debug-info
Símbolos asociados a funciones “inlined” son asociadas con la función llamada. Por defecto con la
opción -O2
-debug extended
Produce información adicional útil para código optimizado
-[no-]sox
Incluye la versión del compilador y opciones usadas en el fichero objeto y el ejecutable
-traceback
Proporciona el “traceback” sobre los distintos fuentes con errores severos en tiempo de ejecución.
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Compiladores: Intel Debugger
Interfaz gráfico de usuario (GUI)
Comando: idb
Es necesario el entorno JAVA
http://software.intel.com/sites/products/documentation/doclib/stdxe/2013SP1/composerxe/debugger/user_guide/index.htm#GUID-06337197-DD0B-4CAB-9BFB-3E928CC05D50.htm
Soporta Multihilo
Compiladores: Intel Debugger
Interfaz de Eclipse
Integrado con Eclipse + CDT
La integración soporta Eclipse 3.7.
Para la depuración con fortran es necesario instalar el plugin Photran.
Uso:
Iniciar Eclipse
Crear o abrir un “workspace”. (ej “makefile project”)
Selecionar “Help” → “Install New Software”
Junto al campo “Work with” click en el botón “Add” y aparece el diálogo “Add Site”
Click en el botón “local” y seleccionar el directorio apropiado que contiene la integración:
/apps/intel/eclipse_support/cdt8.0/eclipse
Click OK
Asegurarse que no está selecionado “Group items by category”
Seleccionar la integración de IDB y click en “Next”
Seguir instrucciones y reiniciar Eclipse cuando se indique.
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Comando: idbc
Opciones disponibles: idbc –help
Modos:
-idb : compatible DBX
-gdb : compatible GDB
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Modo GDB (por defecto):
(idb) help
Obtener ayuda sobre los comandos disponibles
(idb) break main
breakpoint en la entrada del programa principal.
(idb) run
Ejecuta la aplicación hasta el siguiente breakpoint.
(idb) info breakpoints
Lista de breakpoint existentes
(idb) delete breakpoint <breakpoint id>
Borra el breakpoint con el correspondiente id
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Modo IDB (-idb):
(idb) help
Obtener ayuda sobre los comandos disponibles (mucho más completa en este modo)
(idb) stop in main
breakpoint en la entrada del programa principal.
(idb) stop in 20
breakpoint en la línea 20
(idb) stop variable i changed
breakpoint cuando la variable “i” cambia de valor
(idb) run
Ejecuta la aplicación hasta el siguiente breakpoint.
(idb) status
Lista de breakpoint existentes
(idb) delete <breakpoint id>
Borra el breakpoint con el correspondiente id
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Explorar comandos más elaborados
¿Como paro el programa cuando una variable cuando toma cierto valor?
break if
¿Puedo modificar variables internas cuando ocurre un evento determinado?
when en modo idb
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Depuración de programas multihilo.
El debugger detecta automáticamente un programa OpenMP y activa su soporte
(idb) set $threadlevel="native"
(idb) set $threadlevel="openmp"
Info OpenMP
idb info thread
idb info task
idb info barrier
idb info taskwait
idb info lock
idb info team
idb info openmp thread tree
Acceso a datos compartidos
idb sharing on
idb sharing stop on/off
idb sharing event expand
idb sharing filter
Acceso simultaneo a una
expresión
idb reentrancy specifier
http://software.intel.com/sites/products/documentation/doclib/stdxe/2013SP1/composerxe/debugger/user_guide/index.htm#GUID-06337197-DD0B-4CAB-9BFB-3E928CC05D50.htm
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Depuración de programas OpenMP
Usemos varios ejemplos
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Depuración de programas MPI
Opciones -idb,-idba,-gdb,-gdba de mpirun
Variables:
MPIEXEC_DEBUG=1
IDB_PARALLEL_SHELL=/bin/sh
Uso del comando “focus” para especificar sobre que proceso/s operamos.
Problemas con la agregación de mensajes: $parallel_aggregatordelay (por defecto 3000 miliseg)
Desincronización de los procesos: usar “until” (GDB) o “cont to” (IDB) especificando un lugar
común.
No se localizan las fuentes:
-idbopt -I
O usar “use”
Compiladores: Intel Debugger
Interfaz de línea de comandos (CLI)
Depuración de programas MPI
Ejercicio compilar cpi.c y depurar su ejecución. Uso de “focus”.
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Intel MKL
Intel Math Kernel Library (MKL)
http://software.intel.com/en-us/articles/intel-math-kernel-library-documentation
Librería matemática altamente optimizada con rutinas multihilo. Incluye:
●
●
●
●
●
●
●
●
BLAS (level 1, 2, and 3) and LAPACK linear algebra routines, offering vector, vector-matrix, and
matrix-matrix operations.
The PARDISO* direct sparse solver, an iterative sparse solver, and supporting sparse BLAS
(level 1, 2, and 3) routines for solving sparse systems of equations.
ScaLAPACK distributed processing linear algebra routines for Linux* and Windows* operating
systems, as well as the Basic Linear Algebra Communications Subprograms (BLACS) and the
Parallel Basic Linear Algebra Subprograms (PBLAS).
Fast Fourier transform (FFT) functions in one, two, or three dimensions with support for mixed
radices (not limited to sizes that are powers of 2), as well as distributed versions of these
functions provided for use on clusters of the Linux* and Windows* operating systems.
Vector Math Library (VML) routines for optimized mathematical operations on vectors.
Vector Statistical Library (VSL) routines, which offer high-performance vectorized random
number generators (RNG) for several probability distributions, convolution and correlation
routines, and summary statistics functions.
Data Fitting Library, which provides capabilities for spline-based approximation of functions,
derivatives and integrals of functions, and search.
Extended Eigensolver, a shared memory programming (SMP) version of an eigensolver based
on the Feast Eigenvalue Solver.
Intel MKL
Intel Math Kernel Library (MKL)
Última versión: 11.1
Soporta varios compiladores: Intel/PGI/GNU. Probado con varios mas …
Uso con Java, python ...
Adaptada a las últimas novedades en procesadores.
Antes de empezar:
●
Plataforma: procesador
●
Problema matemático: dominio de funciones
●
Lenguaje de programación
●
Uso de arrays muy extensos (> 2 31-1) : tipo del entero (ILP64/LP64)
●
Multihilo: si/no? con compilador de intel o otro?
●
Modelo de linkado: estático o dinámico
●
MPI: funciones de cluster (ScaLAPACK, Cluster FFT)
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Intel MKL: Linkado
Con los compiladores de intel, uso muy sencillo:
-mkl o -mkl=parallel
Estandar multihilo (OpenMP)
-mkl=sequential
Versión secuencial
-mkl=cluster
link con la versión cluster (no multihilo) con Intel MPI
Guía de linkado:
http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
Herramienta de línea de comandos: mkl_link_tool
http://software.intel.com/en-us/articles/mkl-command-line-link-tool
mkl_link_tool -interactive
Intel MKL: Linkado
Interfaces:
Directorio mkl/interfaces
blas95/lapack95 : incluidas directamente en la mkl para los compiladores de intel
fftw3xc, fftw3xf : incluidas directamente en la mkl para los compiladores de intel
fftw2xc, fftw2xf: necesario compilar
fftw2x_cdft: necesario compilar
fftw3x_cdft: necesario compilar
Intel MKL: Linkado
Interfaces:
Explorar compilación para otros compiladores, versión de MPI …
En cada uno de de los directorios de las interfaces hay un makefile preparado. La ejecución de
“make” visualiza las opciones disponibles.
Ejemplo:
mkl/interfaces/fftw2x_cdft $ make libintel64 interface=lp64 PRECISION=MKL_DOUBLE
compiler=gnu mpi=mpich2 INSTALL_DIR=~/mkl
Intel MKL: Linkado
Trucos para el linkado:
Podemos usar comandos del linker:
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html#SEC26
como GROUP para referenciar grupos de librerías como un fichero único:
libmkl.a: GROUP (libmkl_intel_lp64.a libmkl_intel_thread.a libmkl_core.a)
libmklfftw.a: GROUP (libfftw3x_cdft.a libmkl_cdft_core.a libmkl_intel_lp64.a libmkl_sequential.a libmkl_core.a)
libmkl-gnu.a: GROUP (libmkl_gf_lp64.a libmkl_gnu_thread.a libmkl_core.a)
libmkl-gnu-sequential.a: GROUP (libmkl_gf_lp64.a libmkl_sequential.a libmkl_core.a)
libmkl-sequential.a: GROUP (libmkl_intel_lp64.a libmkl_sequential.a libmkl_core.a)
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Intel MKL: Ejemplos
Tutorial:
http://software.intel.com/en-us/mkl_11.1_tut_c
/apps/intel/composerxe/Samples/en-US/mkl/tutorials.zip
Usar:
●
#include "mkl.h"
●
malloc especializado: mkl_malloc
●
Función especializada: cblas_dgemm
Compilar y linkar el código: opción -mkl del compilador
Medir tiempos y comparar con la versión no MKL
Ejecutar con varios threads usando las funciones:
omp_set_num_threads(), mkl_set_num_threads(), mkl_domain_set_num_threads()
Intel MKL: Ejemplos
Control de hilos por variables de entorno:
OMP_NUM_THREADS : Sobre toda la aplicación OpenMP
MKL_NUM_THREADS : Sólo para las funciones MKL
MKL_DYNAMIC : cambio dinámico del nº de threads hasta el máximo especificado (activada por
defecto)
MKL_DOMAIN_NUM_THREADS : control específico sobre un dominio de funciones MKL:
export MKL_DOMAIN_NUM_THREADS="MKL_DOMAIN_ALL=1, MKL_DOMAIN_BLAS=4”
http://software.intel.com/en-us/node/438644
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Intel MKL: Uso ScaLAPACK
Uso de la versión cluster:
Compiladores Intel + Intel MPI
mpiicc -mkl=cluster
Versión secuencial de la librería.
Uso híbrido:
-lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lmkl_blacs_intelmpi_lp64
-lpthread -lm
Compilar siempre con la opción -openmp
Intel MKL: Uso ScaLAPACK
Probar ejemplos adicionales.
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos, información del
procesador. Ejemplos.
Intel MPI
Intel MPI
http://software.intel.com/en-us/articles/intel-mpi-library-documentation
Librería de paso de mensajes “multi-fabric”.
Implementa MPI-2.2 para plataformas Intel.
Permite la actualización de los procesadores y redes de
interconexión sin necesidad de cambios en el software.
Se distribuye en 2 kits:
Intel MPI Library Runtime Environment (RTO): Incluye todas
las herramientas necesarias para la ejecución de programas has
(Multipurpose Daemon* (MPD), Hydra* y utilidades adicionales,
librerías dinámicas y documentación).
Intel® MPI Library Development Kit (SDK): RTO + las
herramientas de compilación (comandos de compilación como
mpiicc, ficheros de cabecera, librerías estáticas y librerías de
depuración, trazas y testeo de código)
MPI: Estándares
Especificación del estándar por mpi-forum.org
http://www.mpi-forum.org/docs/docs.html
Versiones principales:
●
MPI-1
●
MPI-2
●
MPI-3 (Muy reciente)
MPI: Estándares
MPI-1
MPI-3
MPI-1.0: 1994
●
MPI-1.1: 1995 (definición completa del
estándar)
●
MPI-1.2: 1997 (revisión pequeña)
●
MPI-1.3: 2008 (versión final de MPI-1 con
correcciones)
●
MPI-3.0: 2012
Extensión importante del estándar.
1997
1994
MPI-2
Extensiones a MPI
MPI-2.0: 1997
●
MPI-2.1: 2008 (definición completa)
●
MPI-2.2: 2009 (pequeña adicción,
clarificaciones y erratas)
●
http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf
2012
Agenda
Intel Debugger: (2 horas)
Introducción
Uso a través de la GUI/eclipse/CLI
Ejemplos de uso en aplicaciones paralelas: multihilo (OpenMP) y MPI
Intel Math Kernel Library: (2 horas)
Introducción
Linkado
Ejemplos de rendimiento
Uso ScaLAPACK
Intel MPI: (1 hora)
Introducción
Referencia de comandos: compilador, ejecución, gestión de procesos,
información del procesador. Ejemplos.
Intel MPI: Referencia de comandos
Comando compilación
Compilador por
defecto
Lenguaje soportado
mpicc
gcc
C
mpicxx
g++
C/C++
mpifc
gfortran
Fortran77/Fortran 95
mpigcc
gcc
C
mpigxx
g++
C/C++
mpif77
g77
Fortran 77
mpif90
gfortran
Fortran 95
mpiicc
icc
C
mpiicpc
icpc
C/C++
mpiifort
ifort
Fortran77/Fortran 95
Compiladores genéricos
GNU
Intel
Intel MPI: Referencia de comandos
-mt_mpi
Usar versión “Thead Safe”
Niveles: MPI_THREAD_FUNNELED, MPI_THREAD_SERIALIZED, o MPI_THREAD_MULTIPLE.
Por defecto: MPI_THREAD_FUNNELED (ver http://www.mpi-forum.org/docs/mpi-20-html/node165.htm)
Activado por defecto con las opciones -openmp, -parallel, -threads, -reentrancy, -reentrancy
threaded
-static_mpi
Linkado estático de las librerías
-config=<name>
Usar el fichero de configuración especificado. Personalizar opciones y entorno.
-profile=<profile_name> (Intel Trace Collector)
Especificación de una librería de profiling a usar. Por ej: -profile=vt : -t o -trace , -profile=vtmc :
-check_mpi
Variablse de entorno relacionadas: I_MPI_{CC,CXX,FC,F77,F90}_PROFILE,
I_MPI_TRACE_PROFILE y I_MPI_CHECK_PROFILE
-ilp64
Habilita el soporte parcial de ILP64 (enteros 64bits).
Intel MPI: Referencia de comandos
-g
Compilar en modo depuración y linkar con la versión de depuración de la librería
-link_mpi=<arg>
Usar versión específica de la librería:
opt : versión serie optimizada
opt_mt : versión multihilo optimizada
dbg : versión depuración serie
dbg_mt : versión depuración multihilo
log : versión de logging serie
log_mt : versión de logging multihilo
También configurable con la variable de entorno I_MPI_LINK
-O
Habilita optimización
-fast
Optimización máxima (implica linkado estático)
-echo
En pantalla todo lo que hace el script
Intel MPI: Referencia de comandos
-show
Muestra en pantalla lo que hace el script sin ejecutarlo. Útil para ver las opciones de compilación y
linkado que se van a usar.
-{cc,cxx,fc,f77,f90}=<compiler>
Especifica el compilador a usar.
Similar comportamiento que las variables de entorno: I_MPI_{CC,CXX,FC,F77,F90} y
MPICH_{CC,CXX,FC,F77,F90}
-gcc-version=<nnn>
Especifica la versión de gcc: desde la 3.2.x(320) hasta la 4.7.x(470)
-v
Versión del driver y el compilador a usar
Otras variables de entorno de interés:
I_MPI_ROOT : especifica el directorio de instalación de la librería
VT_ROOT : directorio de instalación del Intel Trace Collector
Intel MPI: gestión de procesos
Parallel programming models on large-scale systems require a scalable system
for managing the processes that make up the execution of a parallel program.
The process-management system must be able to launch millions of processes
quickly when starting a parallel program and must provide mechanisms for the
processes to exchange the information needed to enable them communicate with
each other.
No hay estándar.
En Intel MPI por defecto (comando mpirun ~ mpiexec.hydra) se usa la
implementación de PMI Hydra.
También Intel MPI puede usar SLURM como gestor de procesos ejecutandose
cada uno de los procesos con “srun”
Intel MPI: gestión de procesos
Opciones HYDRA
Globales:
-verbose o -v
Muestra en pantalla argumentos de los procesos, variables de entorno que se pasan a la aplicación y el
tráfico PMI originado durante la vida del trabajo MPI
Variable de entorno: I_MPI_HYDRA_DEBUG
-print-rank-map
Muestra el mapeo de procesos a rangos dentro de la ejecución MPI
-print-all-exitcodes
Muestra el código de salida de todos los procesos.
Intel MPI: gestión de procesos
Opciones HYDRA
Locales:
-n <# of processes> o -np <# of processes>
Nº de procesos MPI con los que ejecutar
-env <ENVVAR> <value>
Fija la variable de entorno <ENVVAR> al valor <value> para todos los procesos MPI.
-envall
Propaga todo el entorno actual a todos los procesos MPI
Variable de entorno relacionada: I_MPI_HYDRA_ENV
-envnone
Suprime la propagación del entorno.
-envlist <list of env var names>
Pasa una lista de variables de entorno junto sus valores a todos los procesos MPI
Intel MPI: gestión de procesos
Opciones HYDRA
Checkpoint/restart
Sólo disponible para el módulo de red OFA
Intel MPI: Información del procesador
Comando cpuinfo
Proporciona información acerca de la arquitectura del procesador.
Opciones:
g: Info general: Nombre del procesador, nº de sockets en el nodo, nº de core/thread en cada socket y
modo SMT.
i : Identificación lógica de socket, procesador, core y thread
d : Descomposición del nodo en sockets, procesadores y cores lógicos
c : Info sobre la compartición de los niveles de cache entre los procesadores lógicos
s : Firma del microprocesador: extended family + extended model + family + model + type + stepping
f : Características de microprocesador
A : gidcsf
Por defecto gidc
Intel MPI: Ejemplos de ejecución
Ejecución bajos SLURM
Con srun
Usando mpirun (hydra)
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Intel MPI: Tuning
¿Por qué hacer “tuning”?
Tener en cuenta todos los detalles específicos del cluster en el que se va a ejecutar.
Áreas:
●
●
●
●
Red de interconexión
“Pinning” de procesos
Comunicaciones punto a punto
Algoritmos colectivos
Técnica:
●
●
●
●
Aplicación compilada con optimización
Usar el “tuning” automático disponible en Intel MPI
Entender los esquemas de comunicación involucradas en la aplicación a través de la obtención de
estadísticas
Usar las opciones de “runtime” de MPI
Intel MPI: Tuning
Uso de la utilidad de “tuning” automático
En el cluster:
Ejecutar después de la instalación del cluster y después de cada cambio de configuración.
Usar el mismo usuario con le que se ha hecho la instalación de manera que los resultados se
incorporen a la instalación.
1) mpitune
2) mpirun -tune -np 32 ./mi_programa
La ejecución de mpitune es pesada y es conveniente realizarla deacuerdo a las
políticas de administración ejecución.
Intel MPI: Tuning
mpitune
mpitune [ -a \"<application command line>\" ] [ -of <file-name> ] \
[ -t \"<test_cmd_line>\" ] [-cm ] [ -d ] [ -D] \
[ -dl [d1[,d2...[,dN]]] ] [ -fl [f1[,f2…[,fN]]] ] [ -er ] \
[ -hf <hostsfile> ] [ -h ] [ -hr {min:max|min:|:max} ] \
[ -i <count> ] [ -mr {min:max|min:|:max}] [ -od <outputdir> ] \
[ -odr <outputdir> ] [ -r <rshcmd>] [ -pr {min:max|min:|:max}] \
[ -sf [file-path] ] [ -ss ] [ -s ] [ -td <dir-path> ] \
[ -tl <minutes> ] [ -mh ] [ -os <opt1,...,optN> ] \
[ -oe <opt1,...,optN> ] [ -V ] [ -vi {percent} ; -vix {X factor} ]\
[ - zb ] [ -t ] [ -so ] [ -ar \"reg-expr\" ] [ -trf <appoutfile> ]\
[ -m {base|optimized} ] [ -avd {min|max} ] [ -pm {mpd|hydra} ] \
[ -co ] [ -sd ] [ -soc ]
Intel MPI: Tuning
mpitune:
-a \"<application command line>\"
Modo de aplicación. Se optimiza para la aplicación específica.
-i <count>
Nº de iteracciones en cada prueba (por defecto 3)
-mr {min:max|min:|:max}
Tamaño de mensaje mínimo (por defecto 0) y máximo (por defecto 4194304) a usar. Es posible usar
sufijos (kb, mb o gb)
-pr {min:max|min:|:max}
Fija el máximo (nº cores en el nodo) y el mínimo (por defecto 1) nº de procesos por nodo
-tl <minutes>
Limita el tiempo de ejecución
Intel MPI: Tuning
“Pinning” y “binding”
Procesos MPI a procesadores lógicos determinados.
Identificador de procesadores:
Numeración lógica del sistema
Numeración topológica basada en 3 niveles (package/socket, core, thread)
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Intel MPI: Tuning
“Pinning” y “binding”
Variables de entorno:
I_MPI_PIN=<disable | no | off | 0>
Se usa para inhabilitar el pinning de procesos activado por defecto en la librería
I_MPI_PIN_MODE=<pm|lib >
Método de “pinning”: a través del gestor de procesos (pm) o por la librería MPI (lib)
pm : a través de herramientas del sistema lo que permite pinning y binding (uso de memoria cercana en
NUMA)
lib : no asegura el acceso cercano a la memoria
Intel MPI: Tuning
I_MPI_PIN_PROCESSOR_LIST=<value>
1. <proclist> : lista de nºs/rangos de procesadores lógicos separados por comas
2. [<procset>][:[grain=<grain>][,shift=<shift>]\[,preoffset=<preoffset>][,postoffset=<postoffset>]
<procset> : all (procesadores lógicos)| allcores (cores)| allsocks (sockets)
<grain> : granularidad
<shift> :salto en la selección entero positivo
<preoffset> : desplazamiento en la selección inicial
<postoffset> : desplazamiento en la selección final (alias offset)
3. [<procset>][:map=<map>]
<map> : bunch (lo más próximos en le socket)| scatter (lo más alejados posibles con compartición de
recursos mínima) | spread (procesos consecutivos)
“Pinning” y “Binding”
Valores explicitos para los parámetros anteriores:
fine : valor mínimo
core : unidades que componen un core
cache1 : unidades que comparten L1
cache2 : unidades que comparten L2
cache3 : unidades que comparten L3
cache : valor mayor de cache1, cache2 o cache2
socket | sock : unidades por socket
half | mid : medio socket
third : un tercio de socket
quarter : un cuarto de socket
octavo : un octavo de socket
Intel MPI: Tuning
“Pinning” y “binding”
export I_MPI_PIN_PROCESSOR_LIST=0,1,2,3
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Intel MPI: Tuning
“Pinning” y “binding”
export I_MPI_PIN_PROCESSOR_LIST=”allcores:grain=2,shift=4”
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23
8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Intel MPI: Tuning
“Pinning” y “binding”
Probar ejemplos:
Nodo
Package 0
Package 1
c0 c1 c2 c3 c4 c5 c6 c7
c0 c1 c2 c3 c4 c5 c6 c7
t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1 t0,t1
SO: 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Intel Trace Analyzer and Collector
http://software.intel.com/en-us/articles/intel-trace-analyzer-and-collector-documentation
Visualización y compresión del comportamiento de la aplicación paralela
MPI
Evaluación de estadísticas de profile y de balance de carga
Rendimiento de rutinas y bloques de código
Aprender sobre el modelo de comunicaciones y datos de rendimiento.
Identificación de “hotspots”.
Intel Trace Collector produce ficheros de traza que pueden ser
analizados posteriormente con la herramienta Intel Trace Analyzer.
Las trazas recogen información sobre las llamadas MPI y los mensajes
transmitidos e incluso eventos específicos definidos por el usuario.
Su uso requiere simplemente el relinkado de la aplicación.
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Intel Trace Collector
Compilación:
No es necesario ningún cambio a no ser que se use específicamente el API propio del “Collector”.
API Collector: VT.h para C/C++ y VT.inc para Fortran. (-I$(VT_ROOT)/include)
Linkado:
Mediante el uso de las variables de entorno: VT_ADD_LIBS VT_LIB_DIR
Método simple: opción -trace
mpiicc -trace -o ctest.exe ctest.c
Aplicaciones C++ y compiladores GNU: -lmpigc/-lmpigc3/-lmpigc4 (según versión de g++)
Ejecución:
mpirun -trace -n 4 myApp
export LD_PRELOAD=libVTmc.so (Message Checker)
mpirun -n 4 myApp
Ficheros de traza originados: *.stf (Structured Trace File Format (STF))
Intel Trace Collector
Aplicaciones MPI que fallan:
Existe la versión tolerante a fallos que permite la generación de las trazas:
mpicc -profile=vtfs -o ctest ctest.c
MPI-IO
Intel Trace Collector no soporta ROMIO lo que imposibilita la obteción de trazas de este tipo de
aplicaciones.
Ejemplos:
/apps/intel/itac/8.1.3.037/examples
Intel Trace Collector
Aplicaciones no MPI
Es posible la obtención de trazas de aplicaciones no MPI mediante la librería libVTcs.a
-lVTcs $VT_ADD_LIBS
La aplicación debe llamar VT_initialize() y VT_finalize() para generar la traza.
Los compiladores de Intel pueden instrumentar automaticamente las funciones en compilación.
Opciones:
-tcollect y -tcollect=VTcs (aplicaciones no MPI)
Todas las funciones son instrumentadas
-tcollect-filter <file>
Para filtrar las funciones a instrumentar:
func1 on
func2 off
gcc/g++ : Compilar con -finstrument-function
Intel Trace Collector
Aplicaciones binarias
Utilidad itcpin:
itcpin [<ITC options>] -- <application command line>
--list : lista las funciones del ejecutable (acompañar con --debug : funciones agrupadas por ficheros
fuente, --demangle útil para C++ mostrando los métodos por clases ...)
--run : ejecuta el programa. Por defecto usa libVT si encuentra funciones MPI sino con la opción –insert se especifica la librería a usar.
--profile : tracing de funciones (filtros con --state, --activity, --symbol, --config)
Intel Trace Collector
Soporta Multihilo
Información estadística: útil cuando desconocemos la magnitud de la traza. Variables de entorno:
VT_STATISTICS=ON y VT_PROCESS=OFF
stftool –print-statistics : obtener las estadisticas de los ficheros stf
Combinación con información de rendimiento hardware: llamada de sistema getrusage() + PAPI
(Performance Application Programming Interface)
Combinación con contadores del sistema operativo:
Opción de configuración COUNTER <counter name> ON.
disk_io| net_io | cpu_idle | cpu_sys | cpu_usr
Tracing de aplicaciones distribuidas (comunicación distinta de MPI): VTserver
Intel Trace Collector
Probemos ejemplos ...
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Intel Trace Analyzer
Comando:
traceanalyzer <fichero de traza>
Aplicación gráfica que permite visualizar los datos de las trazas. Cada vez que se abre un fichero de traza
se crea un fichero de cache con datos procesados de la información de la traza para facilitar la gestión.
Intel Trace Analyzer
Intel Trace Analyzer
Interface de línea de comandos
Procesado de los ficheros de traza sin la necesidad de usar la GUI
Por ej: creación de ficheros de cache (en algunos casos es un proceso demandante):
traceanalyzer --cli trace.stf -c0 -w
Están disponibles numerosas opciones de uso experto de utilidad en el desarrollo de scripts de
automatización aunque no se asegura el mantenimiento de estas opciones entre versiones.
Intel Trace Analyzer
Probemos ejemplos ...
Agenda
Intel MPI: (1 hora)
Tuning: automático, pinning y binding y variables de entorno. Ejemplos.
Intel Trace Analyzer and Collector: (1 hora)
Introducción
Collector: Uso, Instrumentación a nivel de usuario. Ejemplos.
Analyzer: Introducción, GUI, CLI y conceptos. Ejemplos.
Benchmarks: (3 horas)
¿Casos de usuarios?
Rendimiento compiladores, MKL y MPI.
Benchmarks sintéticos y aplicaciones.
Benchmarks
Rendimiento pico (Peak performance):
FLOPS =cores×clock ×(
FLOPs
)
cycle
GFLOPS = #chassis * #nodes/chassis * #sockets/node * #cores/socket * GHz/core * FLOPs/cycle
FLOPs/cycle: se consideran operaciones de datos de 64bits de coma flotante. Depende de la implementación hardware de las
operaciones de coma flotante en el procesador (ver https://sites.google.com/a/stanford.edu/fpgen/why). Habitualmente 4 (2 FPUs con
capacidad de 2 operaciones simultaneas por ciclo) aunque puede ser 2 por ej en los atom o 8 si vamos a los procesadores del intel mic
(8 Fused Multiply and Add (FMA) floating point operations in double precision).
Lista de rendimientos pico de los procesadores de intel:
http://www.intel.com/support/processors/sb/CS-017346.htm
Benchmarks
Intel MPI Benchmarks (Ver guía de usuario):
1) Descomprimir:
tar zxvf imb-3.2.4-updated.tgz
- ./doc (ReadMe_IMB.txt; IMB_Users_Guide.htm; IMB_Users_Guide.pdf, the methodology description)
- ./src (program source code and Makefiles)
- ./license (Source license agreement, trademark and use license agreement)
- ./versions_news (version history and news)
- ./WINDOWS (Microsoft* Visual Studio* projects)
2) Compilar con las herramientas de intel:
module load icc impi
gmake -f make_ict
Alternativamente con mvapich2: gmake -f make_mpich (editar make_mpich y fijar MPI_HOME adecuadamente)
Se obtienen los siguientes ejecutables: IMB-EXT,IMB-IO,IMB-MPI1
3) Ejecutar como cualquier programa mpi
Benchmarks: HPL Linpack
HPL - A Portable Implementation of the High-Performance Linpack
Benchmark for Distributed-Memory Computers
http://www.netlib.org/benchmark/hpl
La compilación necesita librerías de blas/lapack. No es recomendable el uso de las versiones que vienen como
paquete por defecto en la rhel. Sin embargo se puede instalar como paquete atlas (atlas-sse3.x86_64 librerías
en /usr/lib64/atlas-sse3).
Librería opensource blas/lapack con buen rendimiento:
http://www.openblas.net
Sería necesario compilarla adecuadamente previo al hpl.
Intel Linpack
Incluido en la mkl: composerxe/mkl/benchmarks
Incluye código fuente y binarios precompilados para todas las arch de intel.
Incluye el modo híbrido (MPI/OpenMP) que puede ser muy interesante en casos de una red lenta.
Descargable directamente:
http://software.intel.com/en-us/articles/intel-math-kernel-library-linpack-download
Benchmarks: HPL Linpack
HPL – Parametros principales (HPL.dat)
N: Tamaño del problema.
Se suele recomendar un tamaño del problema que ocupe el 80% de la memoria disponible. Sin embargo
actualmente esto es muy alto y hace que el tiempo de computo sea enorme: incrementar hasta obtener pico.
P,Q:grid de procesos. Define el nº de procesadores a usar: P*Q
Se recomienda que sean lo más parecido posibles.
Aproximación a la memoria requerida: 8 * N * N / (P * Q) bytes
NBs: Tamaño de bloque de la rutina de multiplicación de matrices.
En el caso de las Intel MKL se recomienda probar estos 3: 256, 192, 128. Con otras librerías algún otro puede
ser el óptimo …
Tocaría probar: desde el pto. de vista de la distribución de los datos conviene tamaños pequeños pero desde el
pto. de vista del computo conviene que no sea muy pequeño ya que perderías reutilización y desaprovecharías
caches.
Broadcast: Tipo de algoritmo para hacer el broadcast
En general probar las 5 opciones, 4 y 5 deberían ser óptimas para el caso de tener nodos muy rápidos
comparados con las comunicaciones (red de alta latencia).
Benchmarkings Sintéticos
MPI:
Intel MPI Benchmarks:
http://software.intel.com/en-us/articles/intel-mpi-benchmarks
http://software.intel.com/sites/products/documentation/hpc/ics/imb/32/IMB_Users_Guide/IMB_Users_Guide.pdf
Fácil uso. Validación de una instalación.
OSU Micro Benchmarks:
http://mvapich.cse.ohio-state.edu/benchmarks
Similar al IMB aunque más actualizado.
Benchmarkings Sintéticos
HPCC Challenge Benchmark: HPL (LINPACK) + Adicionales (STREAM,FFT …):
http://icl.cs.utk.edu/hpcc
Uso de kernels más cercanos al
“mundo real”
●
Escalado del tamaño de datos y
tiempo deacuerdo al sistema
●
Benchmarkings Sintéticos
NAS Parallel Benchmarks
http://www.nas.nasa.gov/publications/npb.html
Kernels de aplicaciones de CFD (elementos finitos,
mallados, ...)
●
Escalado del tamaño de datos y tiempo deacuerdo al sistema
●
Disponibles tanto para MPI como para OpenMP
●
Distintos parámetros y tamaños agrupados en clases:
●
http://www.nas.nasa.gov/publications/npb_problem_sizes.html
Benchmarkings Aplicaciones
Muy heterogéneos.
No suele haber referencias estándar, depende de cada aplicación.
Intentos de referencias “estándar”:
http://www.deisa.eu/science/benchmarking
Servidor UCA
Servidor UCA
SLURM
Guía básica de uso
Lanzar un trabajo a cola que utilizará 2 nodos:
sbatch -N2 trabajo.sh
Ver el estado de las colas:
squeue
sjstat
Ver la salida estándar del trabajo con identificador 8:
cat slurm-8.out
Lanzar un comando en interactivo en 2 nodos:
srun -N2 -l /bin/hostname
Ver información general sobre los nodos y las particiones de SLURM:
sinfo
SLURM
sbatch
Con este comando se envía a Slurm un script a ejecutar, el cual contendrá la llamada al/los ejecutable/s
que se quiere ejecutar en los recursos asignados al trabajo.
Las opciones del comando se le pueden pasar de forma interactiva, o dentro del script, con #SBATCH y la
forma larga de la opción.
El comando devuelve el identificador del trabajo.
sbatch -N2 -n32 trabajo.sh
SLURM
srun
Con este comando se envía directamente el ejecutable, en lugar de un script, que correrá en todos los recursos
solicitados a través de opciones del comando.
El comando devuelve la salida del ejecutable que se pasa como parámetro.
srun -N2 -l /bin/hostname
SLURM
salloc
Con este comando se solicita una asignación de resursos para el ejecutable que se le pasa como
parámetro, generalmente un programa para usar de forma interactiva. Si no se le pasa ningún programa
como parámetro toma por defecto la shell predefinida del usuario (p.ej:bash) y la abre, de tal forma que
desde esa shell el usuario tiene control directo sobre los recursos que le acaban de ser asignados.
salloc -n2
SLURM
scancel <job-id>
Con este comando se cancela un trabajo. También puede usarse para mandar señales específicas.
scancel 832
scancel --signal=USR1 --batch 1236
SLURM
Opciones básicas
-n, --ntasks=<number>
For srun this option specify the number of tasks to run.
sbatch and salloc do not launch tasks, they request an allocation of resources and submits a batch
script (sbatch) or executes some command (salloc).
-N, --nodes=<minnodes[-maxnodes]>
Request that a minimum of minnodes nodes be allocated to this job. A maximum node count may
also be specified with maxnodes.
If only one number is specified, this is used as both the minimum and maximum node count.
If -N is not specified, the default behavior is to allocate enough nodes to satisfy the requirements
of the -n and -c options.
-t, --time=<time>
Acceptable time formats include "minutes", "minutes:seconds", "hours:minutes:seconds",
"days-hours", "days-hours:minutes" and "days-hours:minutes:seconds".
SLURM
Otras opciones
-p, --partition=<partition_names>
Request a specific partition for the resource allocation. If not specified, the default
behavior is to allow the slurm controller to select the default partition as designated by
the system administrator. If the job can use more than one partition, specify their names
in a comma separate list and the one offering earliest initiation will be used.
--ntasks-per-node=<ntasks>
Request the maximum ntasks be invoked on each node. Meant to be used with the --nodes
option. This is related to --cpus-per-task=ncpus, but does not require knowledge of the
actual number of cpus on each node. In some cases, it is more convenient to be able to
request that no more than a specific number of tasks be invoked on each node. Examples
of this include submitting a hybrid MPI/OpenMP app where only one MPI "task/rank" should
be assigned to each node while allowing the OpenMP portion to utilize all of the parallelism present in the node, or submitting a single setup/cleanup/monitoring job to each
node of a pre-existing allocation as one step in a larger job script.
SLURM
Probemos ejemplos

Documentos relacionados