Utilización de la programación paralela en procesadores gráficos para el cálculo científico.
EMNO 2013
Rolando E. Rodríguez Fernández
Medicina Computacional, Instituto de Nefrología. y Facultad de Física, Universidad de la Habana.
Medicina Computacional que cosa es eso ?
La Medicina Computacional es un campo de aplicaciones científicas, definido como la aplicación de las ciencias naturales y exactas a la medicina, utilizando como puente los modelos computacionales que han servido de manera clásica para explicar en la naturaleza y la sociedad, los fenómenos químicos, físicos, biológicos, matemáticos, psicológicos y hasta económicos y sociales. La Medicina Computacional utiliza a la Clínica y la Epidemiología como fundamentos esenciales para tener al paciente en la perspectiva directa de trabajo. La versión de la Bioinformática en el contexto médico …
J. Endocrinol. Aug 2012
La enfermedad renal poliquística una condición genética producida por el mal funcionamiento de un sistema de señales mediado de manera primaria por un canal de calcio
La enfermedad renal poliquística mecanismos involucrados Ca, cAMP, TSC2, MAP kinasas (regulación primaria por receptores de GABA y canales de Ca L P y Q)
EGFR inh
Simulación en la Membrana Celular Receptor de GABA, DM en solución salina isotónica [1 226 413 átomos]
Un problema grande Cálculo del movimiento y la energía en un sistema molecular (Dinámica molecular)
E total = E enlazante + E no-enlazante E enlazante = E enlace + E tangular + E tdihedrica E no-enlazante = E electrostatica + E van der Waals
Poisson’s Eq
Descomposición de dominio: Cada átomo se puede calcular por separado Descomposición funcional: Lista de átomos enlazados Interacciones enlazantes Energía vibracional Energía rotacional Lista de átomos vecinos Generación del enrejado Interacciones no enlazantes Potencial Electrostático Potencial de van der Waals Puentes de Hidrógeno Posición y velocidad Conservación de la Energía Parte no Paralela (serial): Cálculo de la energía total del sistema Temperatura y Volumen
Un problema grande Cálculo del movimiento y la energía en un sistema molecular (Dinámica molecular)
Superficie de interacción en el sitio activo del receptor
Topología de la interacción
Un problema Enorme La simulación del acoplamiento molecular buscando posibles ligandos
Enrejado para el cálculo de energía El experimento !!
(228 348 102 Compuestos)
Un problema Enorme La simulación del acoplamiento molecular buscando posibles ligandos
135
1193
143
Existe una demanda continua de potencia de cálculo en las computadoras siempre mayor que la que encontramos disponible. Desde el principio de la existencia de las computadoras hemos aprendido a dividir el problema en partes que deben ser ejecutadas en varios sistemas de computación y luego combinadas para obtener el resultado final. Esta estrategia se conoce como programación paralela o en paralelo. Gill (1958) “Parallel Programming”, The computer Journal, Vol 1, April, pp 12-10.
La programación en paralelo es un concepto bastante antiguo
Nicholas Metropolis formuló por primera vez el dilema eterno en el que ponemos a nuestros jefes .. “Esta máquina (la ENIAC) no es suficiente potente para resolver nuestros problemas” Y así obtuvo el dinero para armar una mas potente (MANIAC) que podía hasta jugar ajedrez .. En la MANIAC hizo el programa con el que George Gamow elucidó el código genético, que publicaron juntos en 1954
1943 1951
Hace falta un sistema computacional grande Vamos a construir un clúster de computadoras
Hace falta un sistema computacional grande La evolución de los sistemas distribuidos hoy nos podemos construir el clúster en el laboratorio .. antes no ..
2000s
Sistema de Cálculo Científico 152 CPUs, 4352 GPUs (9.8 TFlops), 380GB RAM, 80+ TB HDD
3 unidades de cálculo
24 CPUs (2x Opteron 12 core), 64GB RAM, 6TB HDD
48 CPUs (4x Opteron 12 core), 128 GB RAM, 6TB HDD
24 CPUs (2x Opteron 12 core), 64GB RAM 1024 GPUs (2x NVIDIA M2075, 12GB GDDR6, 2TFlops) 3TB UHSHDD
4 estaciones gráficas 3D
8 CPUs (Opteron 8 core), 16GB RAM, 1TB HDD, 256 GPUs (Nvidia Quadro 4000, 2GB GDDR5, 1 TFlop)
6 estaciones gráficas
4 CPUs (Opteron 4 core), 8GB RAM, 1TB HDD, 192 GPUs (Nvidia GTX, 1GB GDDR5, 0.4 TFlop)
7 u de control 2 CPUs (Atom 2 core), 4GB RAM, no HDD, vSphere
1 unidad SAN 1x Promise 32TB dual iSCSI SAN
Sistema de cálculo y procesamiento gráfico la tendencia actual es la arquitectura híbrida
Programación en sistemas ccNUMA 1. Hasta 16 núcleos 2. Registros multipropósito en los núcleos 3. Interfaz rápida de los 16 núcleos con su
memoria. 4. 64x vector pipeline, una instrucción se
puede ejecutar simultáneamente en los 64 registros multipropósito de cada núcleo (SIMD)
Multicomputadora de paso de mensajes y memoria compartida (ccNUMA)
Sistemas computacionales las arquitecturas actuales mas comunes
Sistemas computacionales La evolución de los procesadores gráficos ¨independientes¨ (la línea de desarrollo de nVidia)
1995 2000 2005 2010
RIVA 128 3M trans
GeForce® 256 23M trans
GeForce FX 125M trans
GeForce 8800 681M trans
GeForce 3 60M trans
“Fermi” 3B trans
2012
“Kepler” 7B trans
Sistemas computacionales Los procesadores gráficos, el camino (pipeline) de los gráficos
Raster
Vertex
Pixel
Blend
Rast
er
Vertex Pixel 0
Blen
d
Pixel 1
Pixel 2
Pixel 3
Vrtx 0 Vr
tx 2
Vrtx
1
Sistemas computacionales La evolución de los procesadores gráficos
ALU
Control
ALU
Control
ALU
Control
ALU
Control
ALU
Control
ALU
Control
ALU ALU ALU
Control
ALU ALU ALU
Sistemas computacionales La evolución de los procesadores gráficos
Sistemas computacionales Los procesadores gráficos son bastante baratos
0.339 30 137.4
0.703 30 66.3
Sistemas computacionales AMD y nVidia tenían hasta ahora rendimientos similares (ej. Cálculo del orbital molecular del C60)
Sistemas computacionales La evolución de los procesadores gráficos, un clúster dentro del chip (nVidia Kepler K110 GF)
Sistemas computacionales La evolución de los procesadores gráficos, el multiprocesador de ¨streaming¨
/* * Copyright 2003-2012 NVIDIA Corporation. All rights reserved. * Modified by Rolando, [email protected] */ #include <cuda.h> #include <stdio.h> __global__ void add( int a, int b, int *c ) { *c = a + b; } int main( void ) { int c; int *dev_c; cudaMalloc( (void**)&dev_c, sizeof(int) ); add <<<1,1>>> ( 2, 7, dev_c ); cudaMemcpy( &c, dev_c, sizeof( int ),cudaMemcpyDeviceToHost ); printf( "2 + 7 = %d\n", c ); cudaFree( dev_c ); return 0; }
Sistemas computacionales un programa muy simple que si hace algo
Cada kernel de CUDA es ejecutado por un arreglo de hilos
- Cada hilo corre el mismo código (SIMD) - Cada hilo tiene un ID que se puede usar para calcular las direcciones de
memoria y realizar decisiones de control
7 6 5 4 3 2 1 0
… float x = input[threadID]; float y = func(x); output[threadID] = y; …
threadID
Sistemas computacionales Vamos a programar un procesador gráfico de nVidia con CUDA
El arreglo de hilos se distribuye en bloques - Los hilos dentro del bloque cooperan a través de memoria compartida, operaciones atómicas y sincronización de barrera
- Los hilos de bloques diferentes no pueden cooperar entre si.
… float x = input[threadID]; float y = func(x); output[threadID] = y; …
threadID
Thread Block 0
… … float x = input[threadID]; float y = func(x); output[threadID] = y; …
Thread Block 1
… float x = input[threadID]; float y = func(x); output[threadID] = y; …
Thread Block N - 1 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Sistemas computacionales Vamos a programar un procesador gráfico de nVidia con CUDA
Cada instancia tiene un ID
- Block ID: 1D, 2D y ahora hasta 3D - Thread ID: 1D, 2D o 3D
Host
Kernel 1
Kernel 2
Device
Grid 1
Block (0, 0)
Block (1, 0)
Block (0, 1)
Block (1, 1)
Grid 2
Block (1, 1)
Thread (0,1,0)
Thread (1,1,0)
Thread (2,1,0)
Thread (3,1,0)
Thread (0,0,0)
Thread (1,0,0)
Thread (2,0,0)
Thread (3,0,0)
(0,0,1) (1,0,1) (2,0,1) (3,0,1)
Sistemas computacionales Vamos a programar un procesador gráfico de nVidia con CUDA
Grid
Memoria Global
Bloque (0, 0)
Memoria Compartida
Hilo (0, 0)
Registros
Hilo (1, 0)
Registros
Bloque (1, 0)
Memoria Compartida
Hilo (0, 0)
Registros
Hilo (1, 0)
Registros
Host
Memoria de Constantes
Tipos de memoria
Sistemas computacionales Vamos a programar un procesador gráfico de nVidia con CUDA
Mi algoritmo puede ser paralelizable ? Bueno yo no se, al final de todo es su algoritmo Puedo programar mi problema en paralelo ? Generalmente si ... Los métodos numéricos SI son paralelizables ! Se están paralelizando para GPU la mayoría de los paquetes de cálculo numérico.
Sistemas computacionales Vamos a programar en paralelo
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto www.netlib.org/utk/people/JackDongarra/la-sw.html
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto
Bibliotecas numéricas en el GPU un buen comienzo para su proyecto Factorización de Cholesky utilizando MAGMA
Conclusiones o algo parecido • Los procesadores gráficos son una buena alternativa a los clústeres de
computadoras, en prestaciones y coste. • El código para los procesadores gráficos no es igual a los que se utilizan
en los clústeres, pero no es difícil de portar una vez que ya se ha paralelizado.
• Existen numerosas bibliotecas numéricas disponibles para los procesadores gráficos que sustituyen directamente las funciones anteriormente existentes.
• El incremento de la velocidad de ejecución es siempre mas del doble sin mucho esfuerzo y puede llegar a miles de veces.
En todo el mundo .. Hay mas de 200 universidades que enseñan Programación Gráfica, Mas de 20 000 artículos en la literatura, mas de 60 000 desarrolladores
Mejoramiento de la conectividad ETECSA/CUBADATA, Empalme FO hasta Panorama
Muchas Gracias