Programación para arquitecturas multicore


La carrera de creación de procesadores cada vez más rápidos sufrió un punto de inflexión con la aparición de procesadores con arquitectura multicore. Esta arquitectura permitía frenar la escalada de consumo de potencia. Un estudio empírico (Mehta, Pranav, “Unleash the Power of Multi-Core Using a Platform Approach,” Multicore Expo, March, 2006) muestra que un incremento de un 1% del reloj, supone un incremento del 3% en el consumo de potencia. Las arquitecturas multicore permiten obtener un rendimiento equivalente sin la contraprestación del consumo y esto ha provocado un gran desarrollo en los últimos años. Así, a modo de ejemplo, todos hemos oído hablar del lanzamiento del Samsung Galaxy S4 con un procesador con 8 cores.

Sin embargo para poder aprovechar la potencia que ofrecen estos procesadores los desarrolladores de Sw deben transformar las actuales aplicaciones secuenciales y transformarlas en paralelas. Esto, en absoluto es una tarea trivial y The Multicore Association en su Multicore Programming Practices ofrece un método a seguir para esta tarea.

Este método aborda un conjunto de fases a abordar en el objetivo de parelelizar una aplicación:

  • Análisis de la aplicación y diseño de alto nivel: el objetivo de esta fase es analizar las características de la aplicación. A veces, la tendencia es paralelizar todo aquello que es paralelizable y esto es un error, ya que la paralelización de la aplicación siempre añade complejidad a ésta. Se propone la actuación en base a objetivos de rendimiento de la aplicación y la utilización de profilers para conocer dónde consume tiempo la aplicación y concentrar los esfuerzos de paralelización en los puntos críticos para la consecución de los objetivos.
  • Implementacion y diseño de bajo nivel:  esta fase consiste en la selección de los patrones de diseño, algoritmos y estructuras de datos para la posterior codificación de la concurrencia necesaria.
  • Depuración: La introducción de concurrencia implica condiciones especiales en la depuración del código.
  • Rendimiento:  Es un proceso de optimización en el que se analiza la mejora del rendimiento conseguido, identificando nuevos cuellos de botella en la ejecución del código, incluyendo comunicaciones, sincronización, bloqueos, equilibrado de carga y ubicación de los datos.

Los equipos de investigación de Ingeniería Web e Ingeniería del Software y Sistemas de Control Inteligente y Distribuido estamos participando en un proyecto europeo ARTEMIS denominado CRAFTERS: ConstRaint and Application driven Framework for Tailoring Embedded Real-Time Systems, en el que la principal contribución se basa en el análisis de la variabilidad del desarrollo del software en arquitecturas multicore con objeto de proponer métodos de verificación y validación temprana.

 

 

+ No hay comentarios

Añade el tuyo