Kepler RIO 2014 Contenidos de la charla Río Cuarto, 20 de Febrero, 2014 1. 2. 3. 4. 5. Presentación de la arquitectura [7 diapositivas] La memoria y el transporte de datos [9] Los cores SMX [9] Desplegando todo el paralelismo en Kepler [12] Mejoras funcionales [7] 1. Paralelismo dinámico. 2. Hyper-Q. 6. Optimizaciones futuras [] Manuel Ujaldón Martínez 1. Vectorización: El tamaño del warp. 2. Stacked-DRAM: Memoria apilada sobre el procesador. Dpto. Arquitectura de Computadores. Univ. Málaga. NVIDIA CUDA Fellow. 2 Kepler, Johannes (1571-1630) Autor de las leyes del movimiento planetario. 1. Presentación de la arquitectura Primera ley: Las órbitas de los planetas son planas. El sol está en el plano de la órbita. La trayectoria del planeta respecto del sol es una elipse en la que el sol ocupa uno de los fotos. Segunda ley: El radio vector que une al sol y el planeta barre áreas iguales en tiempos iguales. Un planeta se mueve más rápidamente en su perihelio que en su afelio, y mientras más excéntrica sea su órbita, mayor será la diferencia de velocidad entre sus extremos. Tercera ley: Los cuadrados de los períodos de revolución en torno al sol son proporcionales a los cubos de los semiejes mayores de las órbitas. La velocidad media con que un planeta recorre su órbita disminuye a medida que el planeta está más lejos del sol. La influencia que el sol ejerce sobre los planetas disminuye con la distancia. 4 Nuestra Kepler también tiene tres leyes Y tres innovaciones principales SMX: Un multiprocesador con más recursos y menos consumo. Paralelismo dinámico: La GPU es más autónoma, puede lanzar kernels CUDA. Consumo Rendimiento Programabilidad Hyper-Q: Múltiples kernels pueden compartir los SMX . 5 6 Modelos comerciales de Kepler: GeForce y Tesla frente a frente Resumen de sus rasgos más sobresalientes Fabricación: 7100 Mt. integrados a 28 nm. por TSMC. Arquitectura: Entre 7 y 15 multiprocesadores SMX, dotados de 192 cores cada uno. GeForce GTX Titan Modelos más populares: K20 (con 13 SMX), K20X (14), K40 (15). Diseñada para jugar: Aritmética: Más de 1 TeraFLOP en punto flotante de doble precisión (formato IEEE-754 de 64 bits). Orientada a HPC: El precio es prioritario (<500€). Gran disponibilidad/popularidad. Poca memoria de vídeo (1-2 GB.). Fiabilidad (tres años de garantía). Pensada para conectar en clusters. Más memoria de vídeo (6-12 GB.). Relojes un poco más rápidos. Ejecución sin descanso (24/7). Hyper-Q sólo para streams CUDA. Hyper-Q para procesos MPI. Perfecta para desarrollar código GPUDirect (RDMA) y otras que luego pueda disfrutar Tesla. coberturas para clusters de GPUs. Los valores concretos dependen de la frecuencia de cada modelo. Con sólo 10 racks de servidores, podemos alcanzar 1 PetaFLOP. Principales innovaciones en el diseño de los cores: Paralelismo dinámico. Planificación de hilos (Hyper-Q). 7 8 Kepler GK110: Disposición física de las UFs para la Tesla K40 dotada de 15 SMXs El multiprocesador SMX Planificación y emisión de instrucciones en warps Front-end Ejecución de instrucciones. 512 unidades funcionales: - 192 para aritmética entera. - 192 para aritmética s.p. - 64 para aritmética d.p. - 32 para carga/almacen. - 32 para SFUs (log,sqrt, ...) Back-end Interfaz Acceso a memoria 9 10 La memoria en las Teslas: Fermi vs. Kepler Tarjeta gráfica Tesla Registros de 32 bits / multiprocesador M2075 M2090 K20 K20X K40 32768 32768 65536 65536 65536 Tamaño caché L1 + mem. compartida 64 KB. 64 KB. 64 KB. 64 KB. 64 KB. Anchura de los 32 bancos de m.c. 32 bits 32 bits 64 bits 64 bits 64 bits Frecuencia de SRAM (la de la GPU) 575 MHz 650 MHz 706 MHz 732 MHz 745, 810, 875 Ancho de banda L1 y mem. compartida 73.6 GB/s. 83.2 GB/s. 180.7 GB/s 187.3 GB/s 216.2 GB/s. Tamaño de la caché L2 Ancho de banda L2 (bytes por ciclo) 2. La memoria y el transporte de datos 768 KB. 768 KB. 1.25 MB. 1.5 MB. 384 384 1024 1024 1.5 MB. 1024 L2 en ops. atómicas (dir. compartida) 1/9 por clk 1/9 por clk 1 por clk 1 por clk 1 per clk L2 en ops. atómicas (dirs. separadas) 24 por clk 24 por clk 64 por clk 64 por clk 64 per clk Anchura del bus de memoria DRAM 384 bits 384 bits 320 bits 384 bits 384 bits Frecuencia de la memoria (MHz) 2x 1500 2x 1850 2x 2600 2x 2600 2 x 3000 Ancho de banda DRAM (no ECC) Tamaño DRAM (todas GDDR5) Bus externo de conexión con la CPU 144 GB/s. 177 GB/s. 208 GB/s. 250 GB/s. 288 GB/s. 6 GB. 6 GB. 5 GB. 6 GB. 12 GB. PCI-e 2.0 PCI-e 2.0 PCI-e 3.0 PCI-e 3.0 PCI-e 3.0 12 Diferencias en la jerarquía de memoria: Fermi vs. Kepler Motivación para usar la nueva caché de datos 48 Kbytes extra para expandir el tamaño de la caché L1. Posee el mayor ancho de banda en caso de fallo a caché. Usa la caché de texturas, pero de forma transparente al programador, y elimina el tiempo de configuración de ésta. Permite que una dirección global pueda buscarse y ubicarse en esta caché, utilizando para ello un camino separado del que accede a caché L1 y memoria compartida. Es flexible, no requiere que los accesos estén alineados. Gestionada automáticamente por el compilador. 13 Cómo utilizar la nueva caché de datos 14 Comparativa con la memoria de constantes Declarar los punteros con el prefijo "const __restrict__". El compilador automáticamente mapeará la carga de esos valores en la caché para usar el nuevo camino de datos a través de la memoria de texturas. A comparar Disponibilidad Tamaño __global__ void saxpy(float x, float y, const float * __restrict__ input, float * output) { size_t offset = threadIdx.x + (blockIdx.x * blockDim.x); A partir de CCC 3.5 (aunque desde CCC 1.0 se podía usar la memoria de texturas manualmente) 48 Kbytes Caché de texturas que expande la L1 (SRAM) A través de una caché de 8 Kbytes que posee cada multiprocesador SM(X) Mediante un camino aparte en el cauce de segmentación gráfico Mejor rasgo Latencia muy baja Gran ancho de banda Peor rasgo Menor ancho de banda Mayor latencia Mejor escenario de uso 15 Desde CUDA Compute Capability 1.0 64 Kbytes Acceso } Caché de datos de sólo lectura Una partición de la memoria global (DRAM) Implementación hardware // El compilador utilizará la nueva caché para "input" output[offset] = (input[offset] * x) + y; Memoria de constantes Acceso con el mismo coeficiente Cuando el kernel es memory-bound, (sin usar threadIdx) a un pequeño aún después de haber saturado el ancho de banda con memoria compartida conjunto de datos de sólo lectura 16 Comunicación entre las memorias de las GPU Kepler + CUDA 5 soportan GPUDirect-RDMA [Remote Direct Memory Access] En Fermi se puso en marcha GPU Direct 1.0 para permitir la comunicación entre GPUs dentro de clusters de CPUs. Esto permite una transferencia más directa entre GPUs. Normalmente, el enlace es PCI-express o InfiniBand. Transmisor 17 18 Resultados preliminares de GPUDirect-RDMA (mejoran con CUDA 6.0 & OpenMPI) GPUDirect-RDMA en Maxwell Latencia GPU-GPU (microsegundos) La situación será más compleja en la próxima generación de GPUs, pues tendrán un espacio de memoria unificado con la CPU. Tiempo de ejecución total (segundos) Receptor Tamaño del mensaje (bytes) Latencia inter-nodo usando: 19 GPUs Tesla K40m (no GeForces). Librería MPI MVAPICH2. ConnectX-3, IVB 3GHz. Número lateral Mejor escalado en MPI: Código: HSG (bioinformática). 2 nodos de GPU. 4 procesos MPI por nodo. 20 Un breve recordatorio de CUDA GPU Hilo Multiprocesador N Bloque de hilos ··· Multiprocesador 2 Multiprocesador 1 Memoria compartida Registros Registros Procesador 1 Procesador 2 Registros … Memoria integrada en la GPU Unidad de Control SIMD Procesador M Caché para constantes Memoria externa a la GPU (incluida dentro de la tarjeta gráfica) Caché para texturas 3. Los cores SMX Memoria global ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ··· Malla 0 (grid) Malla 1 22 Kepler en perspectiva: Recursos hardware y rendimiento pico ... y de cómo va escalando la arquitectura Arquitectura Marco temporal Tesla G80 Tesla GT200 Fermi Fermi GF100 GF104 2006-07 2008-09 2010 2011 Kepler GK104 2012 Tarjeta Tesla (modelo comercial) Kepler GK110 Generación de GPU (y CCC) Fermi mi GF100 (2.0) Número total de cores CUDA Compute Capability (CCC) 1.0 1.2 2.0 2.1 3.0 N (multiprocs.) 16 30 16 7 8 15 M (cores/multip.) 8 8 32 48 192 192 Número de cores 128 240 512 336 1536 K20 K20X K40 - GTX Titan - Kepler Kep er GK110 ((3.5) 14 x 32 16 x 32 13 x 192 14 x 192 15 x 192 448 512 2496 2688 2880 40 nm. 28 nm. Tipo de multiprocesador 3.5 M2090 GTX 470 GTX 580 Multiprocesadores x (cores/multipr.) 2013-14 M2075 Modelo GeForce similar en cores SM Distancia de integración de los trans. 40 nm. Frecuencia de la GPU (para gráficos) 575 MHz SMX con paralelismo p lismo dinámico diná y HyperQ 650 MHz 706 MHz Frecuencia de los cores (para GPGPU) 1150 MHz 1300 MHz 706 MHz 2880 23 28 nm. 28 nm. 732 MHz 745,810,875 MHz 732 MHz 745,810,875 MHz Número de cores (simple precisión) 448 512 2496 2688 2880 GFLOPS (pico en simple precisión) 1030 1331 3520 3950 4290 Número de cores (doble precisión) 224 256 832 896 960 GFLOPS (pico en doble precisión) 515 665 1170 1310 1680 24 Cada aplicación tiene un comportamiento distinto en relación al consumo GPU Boost Permite acelerar hasta un 17% el reloj de la GPU si el consumo de una aplicación es bajo. Se retornará al reloj base si se sobrepasan los 235 W. Se puede configurar un modo “persistente” de vigencia permanente de un reloj, u otro para ejecuciones puntuales. Aquí vemos el consumo medio (vatios) en la Tesla K20X de aplicaciones muy populares en el ámbito HPC: Board Power (Watts) 160 Rendimiento Consumo sin apurar Maximiza los relojes gráficos sin salirse de los márgenes de consumo nominales Reloj base Reloj a máxima frecuencia 120 80 40 0 AMBER 745 MHz ANSYS Black Scholes Chroma GROMACS GTC LAMMPS LSMS NAMD Nbody QMCPACK RTM SPECFEM3D 875 MHz 810 MHz 25 Aquellas aplicaciones que menos consumen pueden beneficiarse de una frecuencia mayor GPU Boost frente a otras implementaciones Resulta mejor un régimen estacionario para la frecuencia desde el punto de vista del estrés térmico y la fiabilidad. En el caso de la K40, se definen tres saltos de frecuencia con incrementos del 8.7%. Reloj acelerado #2 875 MHz Reloj acelerado #1 810 MHz Reloj base 745 MHz 235W Consumo máximo. Referencia (peor caso). 235W Consumo moderado. Ej: AMBER 235W Consumo bajo. Ej: ANSYS Fluent 26 Boost Clock # 2 Boost Clock # 1 Reloj de la GPU A 875 MHz, la K40 mejora el rendimiento hasta en un 40% respecto a la K20X. Base Clock # 1 Otros fabricantes Tesla K40 Conmutación automática de reloj Relojes deterministas Otros fabricantes Valor por defecto Y no sólo mejoran los GFLOPS, también lo hace el ancho de banda con memoria (GDDR5). Reloj acelerado Reloj base Opciones predefinidas Bloquear a la frecuencia base 3 niveles: Base, Boost1 o Boost2 Interfaz con el usuario Panel de control Comandos en el shell: nv-smi Duración del reloj acelerado Aprox. 50% del tiempo de ejec. 27 Tesla K40 100% del tiempo de ejecución 28 Lista de comandos GPU Boost Comando Ejemplo nvidia-smi -q -d CLOCK —id=0000:86:00.0 Efecto nvidia-smi -q -d SUPPORTED_CLOCKS Muestra los relojes que soporta nuestra GPU nvidia-smi -ac <MEM clock, Graphics clock> Activa uno de los relojes soportados nvidia-smi -pm 1 Habilita el modo persistente (el reloj sigue vigente tras el apagado) nvidia-smi -pm 0 Modo no persistente: El reloj vuelve a su configuración base tras apagar la máquina nvidia-smi -q -d CLOCK nvidia-smi -rac nvidia-smi -acp 0 Consulta el reloj en uso Inicializa los relojes en su configuración base Permite cambiar los relojes a los usuarios que no son root 29 30 Del multiprocesador SM de Fermi GF100 al multiprocesador SMX de Kepler GK110 4. Desplegando todo el paralelismo en Kepler 32 Comparación entre la emisión y ejecución de instrucciones (front-end vs. back-end) Fermi (GF100) Búsqueda y emisión (front-end) Ejecución en SM-SMX (back-end) Puede emitir 2 warps, 1 instr. cada uno. Total: Máx. 2 warps por ciclo. Warps activos: 48 en cada SM, seleccionados de entre 8 bloques máx. En GTX580: 16*48= 768 warps activos. 32 cores (1 warp) para "int" y "float". 16 cores para "double" (1/2 warp). 16 unids. de carga/almacen. (1/2 warp). 4 unids. de funcs. especiales (1/8 warp). Total: Hasta 5 warps concurrentes. Puede emitir 4 warps, 2 instrs. cada uno. Total: Máx. 8 warps por ciclo. Kepler (GK110) Warps activos: 64 en cada SMX, seleccionados de entre 16 bloques máx. En K40: 15 * 64 = 960 warps activos. Mejoras en concurrencia y paralelismo Generación de GPU Fermi Modelo hardware GF100 GF104 GK104 GK110 2.0 2.1 3.0 3.5 CUDA Compute Capability (CCC) 192 cores (6 warps) para "int" y "float". 64 cores para "double" (2 warps). 32 unids. de carga/almacen. (1 warp). 32 unids. de funcs. especiales (1 warp). Total: Hasta 16 warps concurrentes. Número de hilos / warp (tamaño del warp) 32 32 32 32 Máximo número de warps / Multiprocesador 48 48 64 64 8 8 16 16 Máximo número de hilos / Bloque 1024 1024 1024 1024 Máximo número de hilos / Multiprocesador 1536 1536 2048 2048 Máximo número de bloques / Multiprocesador En Kepler, cada SMX puede emitir 8 warp-instrucciones por ciclo, pero debido a limitaciones por recursos y dependencias: Kepler 7 es el pico sostenible. 4-5 es una buena cantidad para códigos limitados por instrucción. <4 en códigos limitados por memoria o latencia. Mejoras cruciales para ocultar latencias Máx. concurrencia en cada SMX 33 Gigathread, o cómo el programa es devorado por el procesador 34 Expresar todo el paralelismo posible: Los SMX son más “anchos” que los SM Tetris (baldosa = warp_instr.): - Emite 4 warp_instrs. - Ejecuta hasta 10 warps = 320 hilos. - Warp_instrs. son simétricos y se ejecutan todos en 1 ciclo. Cada malla (grid) contiene un número de bloques, que son asignados a los SMXs (hasta 16 en Kepler, 8 en Fermi). Los bloques se dividen en warps o grupos de 32 hilos. Los warps se ejecutan para cada instrucción de los hilos (hasta 64 warps activos en Kepler, 48 en Fermi). Ejemplo: Correspondencia de colores: para instrucciones “int”. Ejemplo: Kernel con bloques de 384 hilos (12 warps). Bloque 0: instr. “load/store”. Emite 4 warp_instrs. “log/sqrt...”. ... ... ... ... ... warp para instrs. “float”. “double”. Bloque 1: sub fmadd fdiv64 load sqrt G80: Tarda 4 ciclos en ejecutar cada warp_instrs. Fermi: - Emite 2. - Ejecuta hasta 5. Kepler: - Emite 4 warps x 2 instrs. - Ejecuta hasta 16 warp_instrs. (512 unidades funcionales). 32 SFU ¡El jugador planifica los warps! 32 LD/ST Se pueden rotar las fichas si no hay dependencias entre sus 4 warps 64 FPU DP 35 Ejecuta hasta 10 warp_instrs. G80: 16 U.F. SM en Fermi: 100 U.F. paralelas. 6x32 = 192 ALUs 192 FPU SP SMX en Kepler: 512 U.F. paralelas. 36 Paralelismo en SMX: A nivel de hilo (TLP) y a nivel de instrucción (ILP) En las GPUs Kepler concurren todas las formas de paralelismo. Ejemplo: K40. Incrementar el paralelismo horizontalmente a través del TLP: Más warps concurrentes (bloques más grandes y/o más bloques activos en cada SMX). ... ... ... ... ... De s to da Los SMX pueden potenciar el ILP disponible de forma intercambiable con el TLP: D) IM (S Es mucho mejor que Fermi para esto. Algunas veces es más fácil incrementar el ILP que el TLP (por ejemplo, desenrrollar un lazo en un pequeño factor): 4: Vectorial (warp = 32) (todo este volumen representa menos, 60x15 warps) El número de hilos puede estar limitado por el algoritmo o los límites HW. Necesitamos el ILP para lograr un elevado IPC (Instrs. Per Cycle). ... SMX 0 ... La K40 puede ... ...... ejecutar hasta ... ... ... ... 512x15 = 7680 ... ...... ... hilos en un ciclo ... ... ...... ... ... ... ... ... si éstos son del ... ... ... ... color adecuado. ... ... ... ... ...... ... ...... ... ... ... ... ... ... ... ... ... ... ... ... ... ... SMX 15 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3: 2: De instrs. (ILP) Incrementar paralelismo verticalmente con ILP: Si las instrs. son más independientes 1: De tareas (TLP) 37 Cómo trabaja el front-end de la GPU: (1) Planificación de warps La K40 puede planificar y emitir hasta 64x15 warps en un ciclo: 30720 hilos en 1.14 ns. Imagina un tetris 3D con 15 cubiletes y hasta 64 baldosas cayendo simultáneamente en cada uno de ellos, porque así funciona la K40 planificando warps con el máx. paralelismo. 38 La conexión entre front-end y back-end: (2) Emisión de warps En los 5 ciclos ilustrados, hemos podido ejecutar hasta aquí. En Fermi hay déficit en las SFUs (azul), mientras que en Kepler lo hay en las unidades de carga/almacenamiento (verde). Kepler equilibra la doble precisión (rojo) y tiene gran superávit en computación “int” y “float”, señal de que los códigos reales tienen mayor presencia de instrs. naranjas, y sobre todo, amarillas. SM (Fermi) SMX (Kepler) SM (Fermi) 39 SMX (Kepler) 40 Cómo trabaja el back-end de la GPU: (2) Ejecución de warps Caso estudio: Polinomios de Zernike Suponemos que en el momento en que comenzamos a monitorizar la ejecución quedaban pendientes de ejecutar: Recursos GPU Un par de warps de punto flotante en simple precisión (naranjas). Otro par de warps en doble precisión (rojos). Parece conveniente que el front-end vaya un poco adelantado respecto al back-end (prebúsquedas) con objeto de maximizar el throughput. SM (Fermi) ALU FPU 32 bits FPU 64 bits Carga/ almacen. SFU Fermi 32% 32% 16% 16% 4% Kepler 37.5% 37.5% 12.5% 6.25% 6.25% 54% 21% 0% 25% 0% Kepler Fermi Kepler Fermi Fermi Kernel de los polinomios de Zernike Mejor SMX (Kepler) 41 Fermi se encuentra más equilibrada para este caso. La distribución de recursos en Kepler mejora la ejecución de la aritmética entera, pero empeora la de punto flotante y carga/almacenamiento. El resto no se utilizan. Utilizar el CUDA Visual Profiler para conocer qué tal se adapta nuestra aplicación 5. Mejoras funcionales: Paralelismo dinámico y Hyper-Q 43 42 Principales mejoras hardware ¿Qué es el paralelismo dinámico? Computación a gran escala (grandes tamaños de problema) Generación de GPU Fermi Modelo hardware Kepler GF100 GF104 GK104 Compute Capability (CCC) 2.0 2.1 Máxima dimensión X de la malla 2^16-1 2^16-1 3.0 2^32-1 GK110 Limitación Impacto Software Tamaño del problema Limitación Impacto Dinámica: Basándonos en datos obtenidos en tiempo de ejecución. Simultánea: Desde múltiples hilos a la vez. Independiente: Cada hilo puede lanzar una malla diferente. 3.5 2^32-1 La habilidad para lanzar nuevos procesos (mallas de bloques de hilos) desde la GPU de forma: Novedades funcionales: Generación de GPU Fermi Modelo hardware Kepler GF100 GF104 GK104 GK110 Compute Capability (CCC) 2.0 2.1 3.0 3.5 Paralelismo dinámico No No No Sí Hardware Estructura del problema Hyper-Q No No No Sí Hardware Planificación de hilos CPU GPU Fermi: Sólo la CPU puede generar trabajo en GPU. CPU GPU Kepler: La GPU puede generar trabajo por sí sola. 45 Así se hacían las cosas en la era pre-Kepler: La GPU era un mero esclavo del host o CPU Y así se pueden hacer con Kepler: Las GPUs lanzan sus propios kernels Antes la GPU era un co-procesador Gran ancho de banda en las comunicaciones: Externas: Superior a 10 GB/s (PCI-express 3). Internas: Superior a 100 GB/s (memoria de vídeo GDDR5 y anchura de bus en torno a 384 bits, que es como un séxtuple canal en CPU). Función Lib Lib Función 46 CPU GPU Con Kepler, la GPU is más autónoma: Entra en escena el paralelismo dinámico CPU GPU Función Init GPU Alloc CPU Operación 1 Operación 2 Operación 3 Ahora los programas van más rápido y se expresan de una forma más natural. 47 48 El comportamiento de los warps nos enseña que la GPU no es un procesador regular Hyper-Q En Fermi, diversos procesos de CPU ya podían enviar sus mallas de bloques de hilos sobre una misma GPU, pero un kernel no podía comenzar hasta que no acabase el anterior. En Kepler, pueden ejecutarse simultáneamente hasta 32 kernels procedentes de: Factores impredecibles en tiempo de ejecución dificultan un reparto equilibrado de la carga computacional entre los multiprocesadores. Aquí vemos un ejemplo de la varianza existente entre los 8 últimos warps ejecutados en cada SM: Varios procesos de MPI, hilos de CPU o streams de CUDA. Esto incrementa el porcentaje de ocupación temporal de la GPU. FERMI KEPLER 1 sola tarea MPI activa 32 tareas MPI simultáneas 49 Sin Hyper-Q: Multiproceso por división temporal Síntesis final B % utilización de la GPU 100 A Kepler simboliza la generación de GPUs de Nvidia para 2013-14, más adecuada para miles de cores. Habilita todas las formas de paralelismo a gran escala: De tareas, de instrucciones, de datos y vectorial. Hace énfasis en la eficiencia energética y en ampliar la programabilidad del modelo CUDA. La GPU es más autónoma, pero a la vez admite mayor interacción con la CPU. También se mejora la jerarquía de memoria y las conexiones entre las memorias de las GPUs. La conexión SMX-DRAM será determinante en el futuro. 50 0 C A B C D E F Tiempo Con Hyper-Q: Multiproceso simultáneo E F 100 % utilización de la GPU D D D C F A C C 50 B E F B F E B A A 0 Procesos en CPU... ...mapeados sobre GPU D 0 50 E Tiempo ganado 51 52 Bibliografía recomendada Muchas gracias por vuestra atención Descripciones y especificaciones técnicas de los modelos Tesla vigentes en la actualidad: Siempre a vuestra disposición en el Dpto. de Arquitectura de Computadores de la Universidad de Málaga: http://www.nvidia.com/object/tesla_product_literature.html e-mail: ujaldon@uma.es Teléfono: +34 952 13 28 24. Página Web: http://manuel.ujaldon.es (versiones disponibles en español e inglés). Documentación sobre CUDA para Kepler: Best Practices Guide: http://docs.nvidia.com/cuda/cuda-c-best-practices-guide Kepler Tuning Guide: http://docs.nvidia.com/cuda/kepler-tuning-guide Webinars [de GTC'12 a GTC'13, continua actualización]: http://www.nvidia.com/object/webinar.html Especialmente recomendables: "CUDA 5 and beyond" [por Mark Harris]. "New features in the CUDA programming model" [Stephen Jones & Lars Nyland]. "Introduction to dynamic parallelism" [Stephen Jones]. "Inside the Kepler Tesla K20 family" [Julia Levites & Stephen Jones]. 53 54