15 de Octubre Crowne Plaza - acohailab.webcindario.com
Transcript of 15 de Octubre Crowne Plaza - acohailab.webcindario.com
15 de Octubre
Crowne Plaza
Ciudad de México
ni.com/mexico
Simposio Técnico de
Medición y Automatización
Arquitecturas de Programación
para Sistemas Multinúcleo
EmbebidoFinanciero Médico Científico Industrial
National Instruments Confidential
Aprovechando los procesadores multinúcleo en sus aplicaciones
El Rendimiento de los CPUs Ahora
Proviene del Diseño Multinúcleo
• ¿Porqué multinúcleo?
– Relojes más rápidos = más potencia y calor
– Respuesta: relojes más lentos, pero múltiples núcleos
• La guerra de los GHz ha sido reemplazada por la • La guerra de los GHz ha sido reemplazada por la
guerra de los N-núcleos
• CPUs con más núcleos están más cerca de lo que
creemos
– Polaris: procesador experimental con 80 núcleos
– Larrabee: 16-32 núcleos, hyperthreaded a 4x
Diseños de Software Deben
Adaptarse para Aprovecharlo
• ¿Quieren mejoras en el rendimiento?
– Re-escriba el código crítico para lograr paralelismo
• Desafortunadamente… ¡esto es difícil!
– La mayoría de los programadores piensan de forma
“secuencial”
• Además, todavía están los retos tradicionales
– Eficiencia del código
– Corrección del algoritmo
Nuevos Retos al Escribir Software en
Paralelo
• Es más difícil conseguir eficiencias:
– Afectación por la memoria caché en los CPUs
multinúcleo
– Limpiar el caché, coherencia, etc– Limpiar el caché, coherencia, etc
• Escalabilidad a múltiples núcleos
• Mantenerse productivo al mismo tiempo
que lidia con la complejidad
Agenda
• Ejecución de threads y multitareas en
LabVIEW
• Paralelismo de tareas
• Paralelismo de datos• Paralelismo de datos
• Pipelining
• Consideraciones y herramientas para
depurar aplicaciones multinúcleo
¿Qué son Procesos y Threads?
• Procesos
– Cada programa en ejecución es un proceso
– Los procesos cuentan con recursos necesarios para su ejecución
(memoria, manejadores de memoria, sockets, ventanas)
• Threads• Threads
– Threads son unidades dentro
de un proceso que pueden ser
ejecutadas (regularmente en
paralelo)
– Todos los threads comparten
los recursos del proceso
Aplicaciones Multithreading en
LabVIEW• Automático
– Un algoritmo de agrupación en LabVIEW
automáticamente asigna partes del código a
threads basado en su paralelismo
• Manual
– Forzar secciones del código a ejecutar en un
thread único
8
Multithreading Automático en
LabVIEW
• LabVIEW automáticamente divide cada
aplicación en múltiples threads de
ejecución
threadthread
thread
thread
Multithreading en LabVIEW – a Fondo1. Se agrupan las instrucciones secuenciales del código y sus
dependencias
2. Se almacenan en una fila (queue) de ejecución los diferentes
segmentos de código que pueden correr juntos
3. Si el diagrama de bloques contiene suficiente paralelismo, se
ejecutará simultáneamente en todos los threads del sistema
thread
thread
thread
thread
21 3
ejecutará simultáneamente en todos los threads del sistema
Técnicas de Programación en Paralelo
• Paralelismo de tareas y
multithreading automático
• Paralelismo de datos• Paralelismo de datos
• Pipelining y balanceo de
etapas
Paralelismo de Tareas
1) Busque tareas que se pueden realizar en
paralelo
2) Modifique el código para que refleje ese
paralelismoparalelismo
• Elimine la dependencia de datos
• ¡LabVIEW automáticamente identifica código en
paralelo y lo divide en múltiples threads!
• LabVIEW divide un programa en múltiples threads
(introducido originalmente en 1998 con LabVIEW 5.0)
• La mayoría de los programas existentes correrán más
rápido en un sistema multinúcleo sin alteraciones al
código
Multithreading Automático
threadthread
thread
thread
Paralelismo Automático en LabVIEW
thread
thread
Operaciones Simultáneas
thread
thread
DEMO
Threading Manual con Estructuras
Temporizadas
• El código en estas
estructuras se ejecuta
en un thread
independiente
• Los threads pueden • Los threads pueden
tener una prioridad
relativa
• Capacidad para
definir el procesador
o núcleo
DEMO
1) Busque conjuntos de datos que puedan ser
procesados en dos o más bloques independientes
2) Diseñe su código:
Paralelismo de Datos
2) Diseñe su código:
• Divida los datos
• Procese los datos en paralelo
• Combine los resultados individuales
Ejemplo: Paralelismo de Datos
Resultado
Conjunto de Datos
Procesamiento de ResultadoCPU CoreProcesamiento de
Señales
Co
mb
ina
ció
n d
e R
esu
lta
do
s
Procesamiento de Señales
Conjunto de Datos
CPU Core
CPU Core Procesamiento de Señales
Ejemplo: Paralelismo de Datos
Co
mb
ina
ció
n d
e R
esu
lta
do
s
CPU Core
CPU Core
Procesamiento de Señales
Procesamiento de Señales
Ejemplo: Paralelismo de Datos en
LabVIEW
Multiplicación de Matrices
Desempeño del Paralelismo de Datos
DEMO
• Motivación: muchos programas contienen
algoritmos secuenciales de múltiples pasos
• Implementar pipelining puede mejorar la tasa
de rendimiento
Pipelining
1
2
3
4
Acquire Filter Analyze Log
tiempo
1
2
3
4
Acquire Filter Analyze Log
t0 t3 t4 t7
Acquire
Filter
CPU Core
CPU Core
Estrategia de Pipelining
tiempo
Analyze
Log
t0 t1 t2
CPU Core
CPU Core
t3
Acquire Acquire
Filter Filter
CPU Core
CPU Core
Estrategia de Pipelining
Analyze Analyze
Log Log
CPU Core
CPU Core
tiempot0 t1 t2 t3
Acquire Acquire Acquire Acquire
Filter Filter Filter Filter
CPU Core
CPU Core
Estrategia de Pipelining
Analyze Analyze Analyze Analyze
Log Log Log Log
CPU Core
CPU Core
tiempot0 t1 t2 t3
Secuencial Pipeline
Pipelining en LabVIEW: Registros de
Corrimiento en Cascada
• Cada etapa se ejecuta en bloque
• Hay que tomar en consideración la inicialización y fin de
variables/operaciones
• El cableado en el diagrama de bloques es poco natural
Secuencial Pipeline
Pipelining en LabVIEW: Nodos de
Retroalimentación
• Cada etapa se ejecuta en bloque
• Hay que tomar en consideración la inicialización y fin de
variables/operaciones
• Forma de cablear mucho más natural
Pipelining en LabVIEW: Queues
• Cada etapa corre con cierto grado de libertad
• Es fácil inicializar valores
• Muchos cables
• Las copias de los datos pueden llenar los queues
Balanceo de las Etapas del Pipeline
• La ruta crítica es la etapa que más tiempo tome
• Implementar pipelining con etapas no balanceadas
puede no generar mejoras significativas en desempeño
Sin pipeline (tiempo total = 4 s)
Etapa 1 (3s) Etapa 2 (1s)
Etapa 1 (3s)
Etapa 2 (1s)
Con pipeline (tiempo total = 3 s): Mejora = 1.33X (no ideal para pipeline)
DEMO
Diseñando Aplicaciones Multinúcleo
• Patrones de diseño más comunes:
– Ciclo sencillo con técnicas de programación en
paralelo
– Ciclos múltiples independientes– Ciclos múltiples independientes
– Productor/consumidor (transferencia de datos vía
queues)
Patrón de Diseño
Técnicas Paralelas
Diseños con un Solo Ciclo• Utilice técnicas de paralelismo (paralelismo de datos,
paralelismo de tareas, pipelining) en un mismo ciclo
• La velocidad del ciclo se ve limitada a la etapa crítica
Diseño de Ciclos en Paralelo
• Ciclos separado pueden ejecutar en paralelo
• Permite tener diferentes velocidades de ejecución
Productor / Consumidor
• Los queues funcionan como búfer para las
transferencia de datos entre los ciclos
• El diseño de productor/consumidor es uno de los
patrones más usados
QUEUE 1
PRODUCTOR
CONSUMIDORDEMO
Consideraciones y Herramientas para
Depurar Aplicaciones Multinúcleo
• VIs re-entrantes y ejecución iluminada
• Sincronización de threads
• Trazado de la ejecución
• Consideraciones en la transferencia de datos
• Distribución física del procesador
VIs Re-entrantes• Todos los VIs en LabVIEW se pueden configurar como re-
entrantes
• Permite que cada subVI ocupe un lugar de memoria
separado
Todos los subVIs que se ejecuten múltiples veces en
paralelo deben de configurarse como re-entrantes
Ejecución Iluminada
• Permite visualizar secciones paralelas del código
durante su ejecución
• Nota: esta opción alenta la ejecución, por lo que
debe de apagarla una vez terminada la depuración
Sincronización de Threads
• No hay garantía de que el SO calendarizará los
threads en la secuencia correcta sin primitivas de
sincronización
• El orden de los eventos puede cambiar cada
ejecución debido a la calendarización de los threadsejecución debido a la calendarización de los threadsThread
1Thread
2Thread
3
Thread 2
Thread 3
Thread 1
Primera ejecución
Segunda ejecución
Thread 3
Thread 1
Thread 2Tercera ejecución
Sincronización de Código Usando
Flujo de Datos• El paradigma de flujo de datos garantiza la
sincronización
threadLas rutas de código
paralelo son sincronizadas
thread
paralelo son sincronizadas
y el orden de ejecución es
determinado por los
cables en LabVIEW
El flujo de datos natural en LabVIEW facilita la
programación multinúcleo
Sincronización en LabVIEW
• Existen mecanismos de sincronización cuando se
requiere control a más bajo nivel:
• Queues
• Notifiers
• Semaphores
• Rendezvous
• Occurrences
Trazado de la Ejecución• En sistemas de tiempo real, se refiere a la capacidad de
ver la actividad de cada thread a nivel del SO
• Se puede visualizar la actividad de cada thread por
núcleo al seleccionar el CPU específico
Consideraciones en la Transferencia de
Datos
• Tome en consideración la arquitectura de la memoria
en su sistema al programa sistemas multinúcleo
• Evite transferir conjuntos de datos muy grandes entre
núcleos (relativo al tamaño del caché)
• Transferencias muy pequeñas de memoria pueden
causar actualizaciones constantes del caché y reducir
el rendimiento
Distribución Física del Procesador
• La distancia entre los procesadores y la calidad de las
conexiones entre los mismos puede afectar
considerablemente
• La transferencia de datos a través del bus del sistema es más
lento que de la caché compartida
Ejemplos de Caché
Compartida: Sistema
Dual-Core con Dos
Procesadores
Fuente: Tian and Shih, Software Techniques for Shared-Cache Multi-Core Systems, Intel Software Network
Core 0 Core 1 Core 2 Core 3
L2 Cache L2 Cache
System BusSystem
Memory
Resumen: Estrategias para Paralelismo
• Paralelismo de Tareas
– Ideal para programas con funcionalidades independientes
que tienen una mínima dependencia de datos o recursos
compartidos
• Paralelismo de Datos• Paralelismo de Datos
– Ideal para aplicaciones que trabajan con conjuntos de
datos muy grandes que pueden ser divididos y manejados
independientemente
• Pipelining
– Ideal para código que repite varias etapas en forma
secuencial con dependencia de datos entre las etapas
Recursos Adicionaleswww.ni.com/multicore