Si no estás suscripto: Regístrate

23 de febrero 2012

Reacondicionamiento de Idiomas de programación para un mundo paralelo

James Reinders, Ingeniero Senior de Intel Corp.


Los lenguajes de programación más utilizados hoy en día de programación no fueron diseñados como lenguajes de programación en paralelo. Pero adaptación existentes lenguajes de programación para la programación paralela está en marcha. Podemos comparar y modernizaciones de contraste mirando a cuatro características principales, cinco cualidades clave, y los distintos enfoques de implementación.

En este artículo, me centraré en las características y cualidades, dejando a los debates más furiosos mejores enfoques lingüísticos directivas de la biblioteca frente a frente y abstracta y portátiles frente a bajo nivel con una gran cantidad de los controles) para otro día.

Cuatro características que necesitamos

Las características que cualquier solución de programación paralela, incluyendo modernizaciones, debe incluir un modelo de memoria definida, la sincronización, las tareas, y el paralelismo de datos.

Memoria del modelo

La definición de cómo los cambios en los datos compartidos pueden ser observados por las diferentes tareas había sido un problema subestimado. Hans-J. Boehm, escribió un informe en 2004, titulado  Temas que no puede ser implementado como una biblioteca , lo que explica estas cuestiones. Tener una. Bien definidos orden entre los accesos a distintas variables, y permitiendo la independencia de los cambios a distintas variables, es tan importante que han sido abordados en Java, C11 y C + 11 Sin estas modernizaciones, cada programa paralelo se encuentra en la base se desmorona.

Sincronización

La necesidad de sincronización portátil y eficiente es importante. bibliotecas Boost , Intel de Threading Building Blocks (TBB) y OpenMP ofrecer soluciones que son ampliamente utilizados. C + 11 y C11 ahora ofrecen apoyo. Más allá de esto, el concepto de las transacciones es un tema que vale la pena explorar en un futuro artículo. Adaptación de sincronización está ayudando a la portabilidad. Las oportunidades se mantienen los importantes para ayudar a la eficiencia.

Tareas no, hilos

La programación debe ser un ejercicio de tareas de escritura que se pueden ejecutar al mismo tiempo, sin que el programador especificar el mapeo preciso de las tareas en la rosca de hardware. Una introducción a este desafío es el problema con los temas de Edward A. Lee.

Asignación debe ser el trabajo de las herramientas, incluyendo programadores de tiempo de ejecución, no de programación explícito. Esta filosofía está bien apoyado por modernizaciones como OpenMP, TBB, Cilk Plus , Microsoft Parallel Library Patrones (PPL) y Apple Grand Central Dispatch (GCD). La necesidad de afirmar un cierto control sobre la tarea a la cartografía de hilo para maximizar el rendimiento todavía está presente cuando se utilizan estos sistemas hoy en día, pero no apoyado siempre.

Sin embargo, la programación directamente a threads nativos (por ejemplo, pthreads) en las aplicaciones es algo que debe evitarse por completo. Modernización son suficientes hoy para hacer las tareas del método de elección.

Datos de apoyo paralelo

Debería ser relativamente sencilla de escribir un programa portátil que se aprovecha de hardware en paralelo de datos. Idealmente, el soporte de datos en paralelo debe ser capaz de utilizar las capacidades de vectores y la tarea en paralelo sin un programador de tener que codificar explícitamente la división entre los dos.

Desafortunadamente, sin solución de este tipo es en amplio uso hoy en día, incluso para vectorización solo. A partir de auto-paralelización es muy dependiente de la optimización de los compiladores de alta. Compilador de las características intrínsecas código de bloqueo en un ancho de vector particular (MMX = 64, SSE = 128, AVX = 256, etc.) Funciones elementales en CUDA, OpenCL, y Cilk Plus ofrecen una visión de modernizaciones posibles. Intel propone que adoptemos los beneficios de vectorización de anotaciones de la matriz de Fortran 90 en C y C + + como parte de la Cilk Plus proyecto.

Vector de hardware es cada vez más importante en los procesadores, las GPUs y co-procesadores. OpenCL y OpenMP luchan hoy con la forma de abrazar de datos de hardware paralelo y la fuerza con la programación estará ligada a él. Microsoft C + + AMP tiene problemas similares cuando se trata de mercados con el siguiente Microsoft Visual Studio. Las soluciones estándar, resumen, portátil y eficaz quería!

Cinco cualidades que debe desear

Cinco principales cualidades que son deseables, para la programación paralela, se incluyen la capacidad de componer, razonamiento secuencial, la minimización de la comunicación, la portabilidad de rendimiento y seguridad.

Todas estas cualidades son imposibles de conseguir, en un sentido absoluto, ya sea como modificaciones en una antigua lengua o con un borrón y cuenta nueva y un nuevo lenguaje. Es por eso que no podemos llamar a funciones. Cuanto más de estas cualidades se obtiene la mejor estaremos. Eso los hace muy importante a tener en cuenta.

Componibilidad

Componibilidad es un concepto bien conocido en la programación, se incluyen reglas para la combinación de diferentes cosas juntos (funciones, objetos, módulos, etc) de modo que es fácil de componer (creo: se combinan de maneras no previstas). Es importante pensar en la capacidad de componer tanto en términos de corrección y rendimiento.

OpenCL, en gran parte debido a que es menos abstracto, tiene la capacidad de componer bajo en ambas cuentas. OpenMP y OpenCL componibilidad tienen un rendimiento muy graves a menos que se utilizan con mucho cuidado. Modernizaciones nuevos y abstractos (TBB, Cilk, PPL, GCD) son mucho más tolerantes y capaces de entregar componibilidad alta.

Auto-componibilidad es un primer paso esencial, pero la capacidad de componer múltiples reconversiones juntos es esencial en el largo plazo también. Una buena solución para los vendedores de herramientas, de Microsoft Runtime de simultaneidad ha permitido modernizaciones de múltiples proveedores a convivir con la componibilidad aumentado. Programación en paralelo sin la capacidad de mezclar y combinar libremente, es indeseable y contraproducente.

Componibilidad merece más atención de lo que recibe.

Razonamiento secuencial

Razonamiento secuencial, la norma para la lectura de una implementación en serie, se puede aplicar con un programa debidamente expresado en paralelo. OpenMP utiliza pistas para crear el uso de paralelismo en lugar de cambios de código. Esto permite que la intención de un programa de permanecer evidente en el código. TBB y PPL hincapié en la semántica relajada secuenciales para proporcionar el paralelismo como acelerador sin que sea obligatorio para la corrección. Escribir un programa en forma secuencial coherente que está permitido y alentado.

Un objetivo explícito de Cilk Plus es ofrecer a la semántica secuenciales que lo distinguen de otras modernizaciones. La elisión de serie (o C elisión) de un programa de Cilk se promociona en los periódicos del MIT. Los programas que conserva la semántica secuencial ha recibido elogios como más fácil de aprender y usar. Las funciones elementales en OpenCL, CUDA y Plus Cilk tienen objetivos similares.

Es justo decir que la programación de una manera que requiere la comprensión de la semántica paralelas, a fin de comprender la intención, es a la vez impopular y fuera de moda. Tal es el paralelismo obligatoria más difícil de entender y depurar.

Razonamiento secuencial puede extenderse a depuradores también. Una zona caliente de ver aquí es depuradores de trabajo para presentar una experiencia de depuración más parecido a las experiencias sucesivas, con características como la capacidad de reproducción de Rogue Wave en la Totalview depurador.

En lugar de ser un razonamiento secuencial de adaptación, es más acertado pensar en un razonamiento secuencial con la frecuencia que se buscó a propósito y se conservan en un mundo paralelo.

Minimización de Comunicación

El ajuste del rendimiento de los sistemas paralelos a menudo se centra en asegurar los datos es local cuando se utiliza y reducir al mínimo la necesidad de moverse. El movimiento de datos, una comunicación de algún tipo, y la comunicación es generalmente caro. Las decisiones en el diseño e implementación de reconversión, así como la programación de aplicaciones en sí, a menudo impacto en el rendimiento de forma espectacular. La tarea de robar los algoritmos de TBB, Cilk, PPL y GCD todos tienen la reutilización de caché muy en cuenta en sus diseños. Adaptaciones para ayudar, con la minimización de la comunicación, son un negocio difícil y podría utilizar más la atención.

Rendimiento de portabilidad

El objetivo aquí es que un programa sintonizado en una pieza de hardware funciona razonablemente bien en otra pieza de hardware. Es deseable ser capaz de describir los datos y las tareas de tal manera que las escalas de rendimiento a medida que aumenta paralelismo (número de núcleos, o el tamaño de los vectores, o tamaño de la caché, etc.) Nada es nunca totalmente el rendimiento portátil, pero modernizaciones más abstractas tienden a soportar mejor.

Desgraciadamente, las implementaciones de las captaciones se puede luchar para ofrecer el máximo rendimiento. Tomó años para que los compiladores para ofrecer un rendimiento de MMX o SSE de que era competitivo con la programación en lenguaje ensamblador. El uso de algoritmos de caché, por lo general agnósticos aumentar la portabilidad de rendimiento. Hoy en día, competir en rendimiento con CUDA cuidadosamente elaborado y el código OpenCL puede ser un reto debido a que la codificación es el nivel lo suficientemente bajo como para alentar o exigir, incluso, la estructura del programa para que coincida con el hardware. La falta de portabilidad del desempeño de dicho código se muestra con frecuencia, pero las alternativas siguen siendo eficaces las obras en curso. Opciones de diseño de idioma, de algoritmos y de estilo de programación puede afectar el rendimiento de portabilidad mucho.

Seguridad

La ausencia de interbloqueos y condiciones de carrera, pueden ser los más difíciles de proporcionar a través de una modificación. No existe un método para añadir con total seguridad en C o C + + se ha ganado una gran popularidad. La seguridad no se ha incorporado a no administrados idiomas con facilidad, a pesar de algunos esfuerzos valientes para hacerlo.

Para hacer que un lenguaje fuerte, los punteros tienen que ser eliminados o severamente restringidos. Mientras tanto, las herramientas están madurando para ayudarnos a hacer frente a la seguridad a pesar de la falta de apoyo lenguaje directo, y el estilo de codificación más seguro y más seguras modernizaciones parecen ayudar. Tal vez la seguridad es a través de una combinación de lo “suficientemente bueno” y “podemos hacer frente utilizando las herramientas”.

Un viaje por delante, junto

Hay por lo menos cuatro problemas de programación fundamentales que cualquier solución debería abordar la programación paralela, y cinco cualidades clave que pueden hacer un modelo de programación, de adaptación o de otra manera, más deseable. La evolución en el hardware será de gran ayuda.

—–

Sobre el autor

James Reinders ha ayudado a desarrollar supercomputadoras, los microprocesadores y las herramientas de software para 25 años. Él es un ingeniero senior de Intel en Hillsboro Oregon.

Fuente: HPC Wire

 

Deja un comentario

Powered by WP Symposium - Social Networking for WordPress v12.03.10