Taller de Programación Paralela Departamento de Ingeniería Informática Universidad de Santiago de Chile April 17, 2008
Motivación Programar aplicaciones paralelas no es una tarea trivial. Paralelismo debe considerar aspectos tales como: 1. División del problema/solución 2. Acceso a datos compartidos 3. Sincronismo entre las tareas/eventos 4. Asincronismo (no determinismo) en tareas/eventos 5. Balance de carga 6. Deadlocks 7. Paradigma de programación (?) Programación paralela requiere programadores especializados que entiendan computación paralela La vida sería más fácil para programadores si gcc --Paralelize fem.c 3 / 11
Motivación (cont) Idealmente, un software paralelo debiera: ser fácil de usar proveer transparencia a la arquitectura del procesador proveer transparencia a la red de comunicación (si existe) ser portable acomodar heterogeneidad proveer escalabilidad proveer transparencia al paralelismo 4 / 11
Estrategias de paralelismo Exiten dos aproximaciones principales para abordar programación paralels Paralelismo impĺıcito El programador se abstrae de la paralelización misma. Uso de lenguajes y compiladores paralelos El programador no tiene control de cómo los datos y el cómputo es planificado. Codigo fuente Modificacion menor al codigo Paralelizacion automatica Aplicacion paralela 5 / 11
Estrategias de paralelismo Paralelismo semi expĺıcito El código es modificado para hacer uso de librerías y software paralelo Apoyo de librerías para sincronización de tareas y paso de mensajes para comunicación. Identificacion y reemplazo de rutinas Codigo fuente Relink Aplicacion paralela Desarrollo librerias paralelas 6 / 11
Estrategias de paralelismo (cont) Paralelismo expĺıcito El código original sufre modificaciones sustanciales El programador es responsable de la descomposición del problema, comunicación, mapeo de tareas aprocesadores, etc. Codigo fuente Modificacion mayor al codigo Paralelizacion asistida por compilador Aplicacion paralela 7 / 11
Niveles de paralelismo Se puede explotar paralelismo a varios niveles Cada nivel define un nivel de granularidad, es decir el tamaño del código que se paraleliza. En este curso nos concentramos en los dos niveles superiores Tarea i-1 Tarea i Tarea i+1 func1() func2() func3() Granularidad Entidad Paralelizado por Muy Fino Instrucción Procesador Fino Bloque de Compilador instrucción Medio Función Programador Grande Programa Programador a[i] = 4*i a[i+1] =.. a[i] = 4*i a[i+1] =.. * + / a[i] = 4*i a[i+1] =.. 8 / 11
Paso de Mensajes Modelo más popular para implementar paralelismo a nivel de tareas Las tareas no comparten el espacio de direcciones El programador especifica el particionamiento de los datos y el cómputo El programador especifica cuando las tareas deben intercambiar datos Cluster de computadores Memoria Compartida Modelo para paralelizar tareas que comparten la memoria Dependiendo de la herramienta usada, paralelización puede ser impĺıcita o no Comunicación es mediante variables compartidas y puede ser impĺıcita o no Sistemas multiprocesadores Híbridos Paralelismo de Datos 9 / 11
Memoria compartida main() { int A[100][100], B[100][100]; #pragma_omp parallel for num_threads(5) for (i=0; i < 10; i++) { for (j=0; j < 10; j++) A[i][j] = B[i][j]... } Programador inserta directivas para especificar regiones paralelas Compilador realiza la paralelización Es posible reusar mucho código secuencial OpenMP estándar desde 1997 10 / 11
Paso de mensajes main() { int A[20][20], B[20][20]; Programador responsable de distribución de datos y comunicación Uso de librerías (eficientes) Uso de compilador tradicional MPI (Message Passing Interface) estándar desde 1995 MPI_Receive(A,...); MPI_Receive(B,...); for (i=0; i < 20; i++) for (j=0; j < 20; j++) { A[i][j] = B[i][j]... MPI_Send(...); } MPI_send(...) 11 / 11