30.07.2015 Views

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Actas</strong> XXII Jornadas <strong>de</strong> Paralelismo (<strong>JP2011</strong>) , <strong>La</strong> <strong>La</strong>guna, Tenerife, 7-9 septiembre 2011CUDA.El resto <strong>de</strong> este trabajo se organiza como sigue:En la sección II se hace un resumen <strong>de</strong> las principalescaracterísticas <strong>de</strong> llc. A continuación <strong>de</strong>scriben lasprincipales técnicas <strong>de</strong> optimización disponibles en ellenguaje en la sección III. En la sección IV se estudiala aplicación <strong>de</strong> algunas <strong>de</strong> estas optimizaciones acasos prácticos. Se muestran allí códigos <strong>de</strong> ejemploimplementados en llc así como algunos resultadoscomputacionales para que el lector se haga una i<strong>de</strong>a<strong>de</strong> las características y posibilida<strong>de</strong>s <strong>de</strong>l lenguaje ysu compilador. Por último, se ofrecen algunas conclusionesy líneas <strong>de</strong> trabajo abiertas en la secciónV.II. El lenguage llc y su compiladorllc es un lenguage paralelo <strong>de</strong> alto nivel en el queel paralelismo se expresa mediante directivas <strong>de</strong> compilaciónal estilo <strong>de</strong> OpenMP. <strong>La</strong> mayor parte <strong>de</strong> lasdirectivas <strong>de</strong> éste son aceptadas, aunque se han hechoalgunos añadidos para aumentar la expresividadsemántica <strong>de</strong>l lenguaje y permitir al <strong>de</strong>sarrollador <strong>de</strong>llc expresar con mayor legibilidad las particularida<strong>de</strong><strong>de</strong> su código.Nuestro propósito con llc y su compilador llCoMPno es incrementar la diversidad <strong>de</strong> lenguajes y entornos<strong>de</strong> programación disponibles para CAP. Alcontrario, presentamos una forma simple <strong>de</strong> <strong>de</strong>sarrolloenfocado a diferentes arquitecturas para disminuirla brecha entre ingenieros <strong>de</strong> sistemas y <strong>de</strong>sarrolladores<strong>de</strong> aplicaciones CAP. <strong>La</strong>s extensiones <strong>de</strong>llc o las técnicas implementadas en llCoMP pue<strong>de</strong>nservir <strong>de</strong> guía a <strong>de</strong>sarrolladores mainstream <strong>de</strong> caraa la resolución <strong>de</strong> los problemas <strong>de</strong> programabilidad<strong>de</strong> los sistemas actuales.llCoMP es un compilador source-to-source que traducecódigo C anotado con directivas llc en códigoparalelo <strong>de</strong> alto nivel. Aunque llc soporta losconstructos paralelos más comunes - forall, sections,pipelines y task queues -, la nueva versión <strong>de</strong>l backend<strong>de</strong> CUDA llCoMP solo soporta bucles forall,aunque otros constructos están bajo estudio paraser incluídas en futuras versiones. Puesto que todaslas directivas y cláusulas <strong>de</strong> OpenMP son reconocidaspor llCoMP, a partir <strong>de</strong> un mismo códigofuente pue<strong>de</strong>n generarse diferentes binarios (secuencialo paralelos) <strong>de</strong>pendiendo <strong>de</strong>l compilador seleccionadopara traducir el código generado por nuestrocompilador.<strong>La</strong> nueva versión <strong>de</strong>l compilador llc pue<strong>de</strong> serconsi<strong>de</strong>rada como un extractor <strong>de</strong> kernels <strong>de</strong> CUDAa partir <strong>de</strong> constructos OpenMP, aunque preferimosconsi<strong>de</strong>rarla como una herramienta <strong>de</strong> prototipado.llCoMP representa una capa software intermediaentre llc y diferentes backends para este lenguaje.El compilador ha sido diseñado con el propósito <strong>de</strong>que abordar implementaciones para diferentes arquitecturas<strong>de</strong>stino no requiera <strong>de</strong>masiado esfuerzo.llCoMP se ha implementado usando Python con unenfoque orientado a objetos. Para el frontend, hemosusado el módulo pycparser [6] para construir una representaciónintermedia <strong>de</strong>l código C. <strong>La</strong> arquitecturasofware <strong>de</strong>sarrollada nos permite escribir un conjunto<strong>de</strong> transformaciones source-to-source que posibilitanla escritura <strong>de</strong> kernels CUDA a partir <strong>de</strong> la informaciónextraída <strong>de</strong>l código llc original.A<strong>de</strong>más <strong>de</strong>l enfoque clásico <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong> entornos<strong>de</strong> programación para CAP, don<strong>de</strong> la facilidad<strong>de</strong> uso está <strong>de</strong>stinada al usuario, nuestra propuestatambién está dirigida a arquitectos <strong>de</strong> hardware.Creemos que un rápido <strong>de</strong>sarrollo <strong>de</strong>l backen<strong>de</strong>s la clave para la adopción <strong>de</strong> una nueva arquitectura,y la implementación <strong>de</strong> una gran variedad<strong>de</strong> arquitecturas es esencial para la adaptación <strong>de</strong>un compilador. Si un nuevo backend para un compiladorse pue<strong>de</strong> implementar en pocas semanas, elhardware se pue<strong>de</strong> evaluar en menos tiempo por ungran número <strong>de</strong> usuarios, facilitando por tanto laadopción <strong>de</strong> un nuevo hardware.Para posibilitar un proceso rápido <strong>de</strong> construcción<strong>de</strong> backends introducimos el concepto <strong>de</strong> plantillas.<strong>La</strong>s plantillas capturan los patrones paralelos máshabituales. El compilador se ayuda <strong>de</strong> un conjunto<strong>de</strong> herramientas que, partiendo <strong>de</strong> la representaciónintermedia y <strong>de</strong> un análisis <strong>de</strong>l código fuente, permitengenerar códigos eficientes para la plataforma<strong>de</strong>stino.llCoMP traduce el código <strong>de</strong> entrada a su árbolsintáctico (AST) correspondiente. Este AST setransforma posteriormente para convertirlo en unarepresentación intermedia. Sobre esta representaciónintermedia se trabajará para aplicar cualquier transformacióny así po<strong>de</strong>r generar código CUDA, MPI,etc. Para po<strong>de</strong>r hacer transformaciones, se usan algunospatrones <strong>de</strong> software. Por ejemplo, para buscarun nodo en el AST, se usa el patrón Filter. Unavez que se se ha encontrado un <strong>de</strong>terminado nodo, sele pue<strong>de</strong> aplicar un mutador que es la sustitución <strong>de</strong>ese nodo por otro (patrón Mutator). Tras aplicar lastransformaciones necesarias mediante filtros y mutadores,el AST resultante se procesa mediante la claseWriter para producir el código correspondiente.<strong>La</strong>s transformaciones implementadas a través <strong>de</strong>lpatrón Mutator pue<strong>de</strong>n realizarse utilizando plantillasen lugar <strong>de</strong> implementarlas en código python.Una plantilla es un fragmento <strong>de</strong> código escrito enel lenguaje <strong>de</strong>stino, que se modifica en función <strong>de</strong>ciertos parámetros <strong>de</strong> entrada. Este código es interpretadoy traducido a la representación intermedia,y a continuación se inserta en el punto a<strong>de</strong>cuado <strong>de</strong>lAST. El diseño <strong>de</strong>l backend utilizando plantillas <strong>de</strong>código facilitará la implementación futura <strong>de</strong> nuevosbackends.<strong>La</strong> inicialización y la reserva <strong>de</strong> memoria son operacionescomunes para todos los tipos <strong>de</strong> dispositivoshardware. Cada una <strong>de</strong> estas operaciones i<strong>de</strong>ntificaun patrón y éste se implementa a través <strong>de</strong> una plantilla<strong>de</strong> código. Para manipular estas plantillas e insertarnuevo código en el AST llCoMP agrupa esteconjunto <strong>de</strong> operaciones en una interfaz común. Actualmente,los patrones implementados son:• Inicialización <strong>de</strong>l dispositivo:contiene tareas<strong>JP2011</strong>-688

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!