Multiplicación de Matrices en Sistemas cc-NUMA Multicore Jesús Cámara Moreno Director: Domingo Giménez Cánovas Autor: Índice de Contenido 1. 2. 3. 4. 5. 6. 7. 8. Introducción Línea de Investigación Sistemas Empleados Software Utilizado Planteamiento del Problema Interés del Problema Estudio Experimental Conclusiones Introducción En la mayoría de problemas científicos y de ingeniería la computación se lleva a cabo mediante el uso de rutinas matriciales de álgebra lineal implementadas en librerías como BLAS, LAPACK... Las últimas versiones de estas librerías (MKL, ATLAS, Goto BLAS) permiten multithreading y pueden ser usadas eficientemente en sistemas multicore. Pero… Que ofrezcan implementaciones eficientes no implica que sean usadas eficientemente por científicos Æ Necesario estudiar su comportamiento en diferentes sistemas, variar num_threads, tamaño del problema... Línea de Investigación Analizar cómo se comporta la rutina de multiplicación de matrices en sistemas cc-NUMA multicore en función del tamaño del problema y del número de threads. Decidir el número de threads a usar para obtener el menor tiempo de ejecución. Usar la información obtenida para desarrollar versión de 2 niveles (OpenMP+MKL) de la multiplicación que sea capaz de seleccionar el número de threads en cada nivel en función de las características del sistema Æ Tesis de Máster Sistemas Empleados Arquitectura cc-NUMA con memoria compartida. Bertha: IBM 16 Xeon X7640 hexa-core con 96 cores. Dispone de 4 nodos, cada nodo 4 procesadores, cada procesador hexa-core. 191 GB de memoria compartida. Ben: HP Integrity Superdome con 128 cores. Cada computador consta de 4 Intel Itanium-2 dual core Montvale. 1,5 TB de memoria compartida. Pirineus: SGI Altix UV 1000 con procesadores Xeon X7542 hexa-core Æ 1344 cores (uso limitado 256). 6 TB de memoria compartida. Software Utilizado dgemm: rutina de multiplicación de matrices en doble precisión. OpenMP: entorno de programación paralela en sistemas de memoria compartida. icc (compilador de Intel). Versiones: Bertha: 11.0 Ben: 11.1 Pirineus: 11.1 MKL (BLAS implementada por Intel). Versiones: Bertha: 11.0 Ben: 10.2 Pirineus: 10.2 Planteamiento del Problema Multiplicar dos matrices cuadradas, A y B, usando paralelismo anidado (OpenMP + MKL) Se establece un número determinado de threads OpenMP y cada uno multiplica un bloque de filas adyacentes de la matriz A por la matriz B usando la rutina dgemm de MKL con un número de threads MKL establecido (estática/dinámicamente). La idea es analizar qué ocurre con el paralelismo anidado, no optimizar la multiplicación de matrices. Planteamiento del Problema Esquema de paralelismo anidado empleado: omp_set_nested(1); omp_set_num_threads(nthomp); mkl_set_dynamic(0); mkl_set_num_threads(nthmkl); //Habilita paralelismo anidado //Establece threads OpenMP //Deshabilita paralelismo dinamico //Establece threads MKL #pragma omp parallel { obtener tamaño y posicion inicial de la submatriz A a ser multiplicada llamar a la rutina dgemm para multiplicar esta submatriz por la matriz B } Interés del Problema Se puede pensar que la mejor opción es usar versiones paralelas de BLAS con determinación dinámica de threads sin usar paralelismo OpenMP o incluso usando un número de threads igual al de cores disponibles. Pero dependiendo del sistema computacional, del tamaño de las matrices y del número de threads utilizados, se pueden obtener tiempos menores de ejecución usando otras combinaciones. Tal y como se muestra a continuación, usando solo paralelismo MKL, es preferible usar un número de threads diferente al número de cores del sistema si se quiere obtener el menor tiempo de ejecución. Interés del Problema Estudio Experimental 2 niveles de paralelismo (OpenMP + MKL) Estudio Experimental (sin selección dinámica de threads MKL) (speed-up mostrado con respecto al tiempo obtenido con paralelismo MKL) Estudio Experimental 2 niveles de paralelismo (OpenMP + MKL) Estudio Experimental (sin selección dinámica de threads MKL) (speed-up mostrado con respecto al tiempo obtenido con paralelismo MKL) Estudio Experimental Estudio Experimental 2 niveles de paralelismo (OpenMP + MKL) pirineus pirineus 4,5 16 4 14 500 750 1000 2000 speed-up 3 2,5 2 3000 4000 5000 1,5 1 12 8 4 2 0 0 4 2 1 3000 4000 5000 6 0,5 8 500 750 1000 2000 10 speed-up 3,5 16 8 4 2 1 Estudio Experimental pirineus 30 25 500 750 1000 2000 speed-up 20 15 3000 4000 5000 10000 10 5 0 60 30 20 15 12 10 6 5 4 3 2 1 pirineus 25 speed-up 20 500 750 1000 2000 15 3000 4000 5000 10000 10 5 0 120 60 40 30 24 20 15 12 10 8 6 5 4 3 2 1 Estudio Experimental pirineus 20 18 16 500 750 1000 2000 3000 speed-up 14 12 10 8 4000 5000 10000 6 4 2 0 180 90 60 45 36 30 20 18 15 12 10 9 6 5 4 3 2 1 pirineus 16 14 500 750 1000 2000 12 speed-up 10 8 3000 4000 5000 10000 6 4 2 0 240 120 80 60 48 40 30 24 20 16 15 12 10 8 6 5 4 3 2 1 Estudio Experimental (sin selección dinámica de threads MKL) (speed-up mostrado con respecto al tiempo obtenido con paralelismo MKL) pirineus 1,6 1,4 speed-up 1,2 1 3000 4000 0,8 5000 10000 0,6 0,4 0,2 0 2-30 4-15 10-6 15-4 30-2 60-1 #thr.OMP - #thr.MKL Conclusiones Sin paralelismo dinámico, conforme se aumenta el número de threads OpenMP y el tamaño de las matrices, se observa un incremento del speed-up. En sistemas grandes (muchos cores), suele ser preferible usar un número de threads OpenMP superior o semejante al de MKL. Ben, speed-up entre 1.2 y 1.8 con 16 threads OpenMP y 4 MKL. Bertha, speed-up entre 1.4 y 1.6 con 8 threads OpenMP y 8 MKL. Pirineus, speed-up entre 1 y 1.4 con 4 threads OpenMP y 15 MKL. El uso de dos niveles de paralelismo contribuye a acelerar la multiplicación de matrices especialmente en problemas de gran dimensión.