UPCBLAS : a numerical library for unified parallel C with architecture-aware optimizations

La necesidad de una potencia de computo creciente por parte de aplicaciones de diversos campos de la ciencia y la ingenieria o incluso del ocio, ha sido la impulsora de la evolucion del computador. La aproximacion tradicional para esta evolucion ha sido la mejora de tecnologias ya conocidas. Sin embargo, esta aproximacion esta llegando a su limite fisico. Una nueva era ha empezado, caracterizada por los procesadores multinucleo que habilitan la ejecucion de aplicaciones multihilo. La popularidad de los sistemas multinucleo ha hecho que la programacion paralela llegue a ser una tarea de vital importancia para explotar de forma efectiva el hardware y aumentar el rendimiento de las aplicaciones. La programacion paralela se realiza tradicionalmente mediante la utilizacion de bibliotecas de paso de mensajes en memoria distribuida o de construcciones de programacion concurrente (barreras, semaforos .) en memoria compartida. Hoy en dia Message Passing Interface (MPI) y Open MultiProcessing (OpenMP) constituyen los estandares de facto para la programacion en arquitecturas de memoria distribuida y compartida, respectivamente. Recientemente ha surgido un nuevo modelo de programacion, el modelo Partitioned Global Address Space (PGAS), que proporciona importantes ventajas sobre los modelos tradicionales. En el modelo PGAS todos los hilos comparten un espacio de memoria como en el modelo de memoria compartida. Sin embargo, este espacio de memoria esta logicamente particionado entre los diferentes hilos como en el modelo de memoria distribuida. Los lenguajes PGAS consiguen el equilibrio perfecto entre facilidad de uso y explotacion de la localidad de los datos. En los ultimos anos el modelo PGAS ha estado ganando popularidad, siendo ejemplos representativos de este modelo los lenguajes Unified Parallel C (UPC), Titanium y Co-Array Fortran (CAF). UPC es un lenguaje de programacion paralela que surge como una extension a la especificacion estandar del lenguaje C y que esta ganando interes y popularidad dentro de la comunidad de High Performance Computing (HPC). UPC fue origi nalmente disenado para computadores paralelos de gran escala y entornos cluster. Sin embargo, su modelo de programacion PGAS lo convierte en una excelente opcion para sistemas multinucleo, en los cuales la memoria principal es fisicamente compartida. Hoy en dia existen compiladores de UPC disponibles para la mayoria de los sistemas paralelos de los principales fabricantes, asi como investigacion activa en muchas universidades y centros de investigacion en supercomputacion. A traves de medidas experimentales exhaustivas desarrolladas en trabajos previos, se ha demostrado la viabilidad de UPC frente a otros paradigmas de programacion paralela habituales. Ademas, se ha demostrado tambien que los codigos UPC pueden conseguir buena escalabilidad en hasta cientos de miles de procesadores siempre que cuenten con el adecuado soporte por parte del compilador y del sistema runtime. Sin embargo, una barrera para una mayor aceptacion de UPC por parte de los usuarios es la carencia de bibliotecas de apoyo en este lenguaje para los desarrolladores de algoritmos y aplicaciones. Las rutinas del conjunto Basic Linear Algebra Subprograms (BLAS) proporcionan bloques estandar para realizar operaciones basicas con vectores y matrices. Son utilizadas por cienti? ficos e ingenieros para conseguir buenos rendimientos en arquitecturas monoprocesador. Las rutinas SparseBLAS son una version reducida de las BLAS para matrices y vectores dispersos, los cuales introducen patrones de acceso irregulares. Las Parallel Basic Linear Algebra Subprograms (PBLAS) y las Parallel Sparse Basic Linear Algebra Subprograms (PSBLAS) son una implementacion de las BLAS y las SparseBLAS, respectivamente, para computacion paralela, las cuales han sido desarrolladas para facilitar a los usuarios la programacion en arquitecturas de memoria distribuida. Sin embargo, no existen versiones paralelas en UPC. En la actualidad existe una creciente tendencia a desarrollar codigos que tengan en cuenta el sistema en el que estan siendo ejecutados para realizar optimizaciones de forma automatica. Entre las diferentes arquitecturas paralelas, la optimizacion de aplicaciones en los clusters de sistemas multinucleo presenta un importante desafio ya que poseen una arquitectura de memoria hibrida (distribuida/compartida) con latencias de comunicaciones no uniformes. Ademas, accesos concurrentes a la misma cache o al mismo modulo de memoria desde distintos nucleos pueden conducir a una perdida de ancho de banda a memoria. Esta Tesis Doctoral, "UPCBLAS: A Numerical Library for Unified Parallel C with Architecture-Aware Optimizations", nace del intento de impulsar la utilizacion y expansion de los lenguajes PGAS (especialmente de UPC) aportando a los actuales y futuros programadores una biblioteca de computacion numErica paralela, UPCBLAS. La biblioteca contiene un subconjunto de rutinas BLAS (las mas utilizadas por sus usuarios) con una interfaz basada en las caracteristicas de UPC y centrada en aumentar la programabilidad de este lenguaje, sin comprometer excesivamente por ello el rendimiento. Precisamente con el fin de mejorar el rendimiento de las rutinas numericas, esta Tesis Doctoral tambien ha llevado al desarrollo de Servet, una herramienta que detecta mediante benchmarks de forma automatica un conjunto de parametros hardware muy utiles para optimizar el rendimiento de los codigos paralelos. De hecho, las rutinas de UPCBLAS usaran automaticamente la interfaz proporcionada por Servet para reducir sus tiempos de ejecucion. Por ultimo, esta Tesis proporciona una evaluacion experimental detallada de la biblioteca, asi como ejemplos practicos de su uso.