64
Introducción a la computación de altas prestaciones Ivan Rodero Castro Francesc Guim Bernat PID_00209165

computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

Introduccioacuten a lacomputacioacuten dealtas prestaciones Ivan Rodero CastroFrancesc Guim Bernat PID_00209165

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

Los textos e imaacutegenes publicados en esta obra estaacuten sujetos ndashexcepto que se indique lo contrariondash a una licencia deReconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v30 Espantildea de Creative Commons Podeacuteis copiarlos distribuirlosy transmitirlos puacuteblicamente siempre que citeacuteis el autor y la fuente (FUOC Fundacioacuten para la Universitat Oberta de Catalunya)no hagaacuteis de ellos un uso comercial y ni obra derivada La licencia completa se puede consultar en httpcreativecommonsorglicensesby-nc-nd30eslegalcodees

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

Iacutendice

Introduccioacuten 5

Objetivos 6

1 Motivaciones de la computacioacuten de altas prestaciones 7

11 Utilidad de la simulacioacuten numeacuterica 7

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones 8

121 Aplicaciones HTC 9

122 Aplicaciones HPC 9

2 Paralelismo y arquitecturas paralelas 12

21 Necesidad de la computacioacuten paralela 12

22 Arquitecturas de computacioacuten paralela 14

221 Una instruccioacuten muacuteltiples datos (SIMD) 14

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD) 18

223 Coherencia de memoria cacheacute 22

23 Sistemas distribuidos 26

3 Programacioacuten de aplicaciones paralelas 27

31 Modelos de programacioacuten de memoria compartida 28

311 Programacioacuten con flujos 28

312 OpenMP 29

313 CUDA y OpenCL 30

32 Modelos de programacioacuten de memoria distribuida 33

321 MPI 33

322 PGAS 35

33 Modelos de programacioacuten hiacutebridos 36

4 Rendimiento de aplicaciones paralelas 39

41 Speedup y eficiencia 39

42 Ley de Amdahl 41

43 Escalabilidad 42

44 Anaacutelisis de rendimiento de aplicaciones paralelas 43

441 Medidas de tiempos 44

442 Interfaces de instrumentacioacuten y monitorizacioacuten 45

443 Herramientas de anaacutelisis de rendimiento 46

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones 50

451 Pruebas de rendimiento 51

452 Lista Top500 52

5 Retos de la computacioacuten de altas prestaciones 57

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

51 Concurrencia extrema 58

52 Energiacutea 59

53 Tolerancia a fallos 59

54 Heterogeneidad 60

55 Entradasalida y memoria 60

Bibliografiacutea 63

CC-BY-NC-ND bull PID_00209165 5 Introduccioacuten a la computacioacuten de altas prestaciones

Introduccioacuten

En este primer moacutedulo didaacutectico estudiaremos las motivaciones y caracteriacutes-

ticas de la computacioacuten de altas prestaciones y repasaremos sus fundamentos

de arquitectura y de programacioacuten para poner en contexto y vertebrar los

contenidos de los siguientes moacutedulos didaacutecticos

Estudiaremos las arquitecturas de los sistemas paralelos y otros conceptos de

relevancia como por ejemplo las redes de interconexioacuten Tambieacuten estudiare-

mos conceptos fundamentales relacionados con el rendimiento de sistemas

de altas prestaciones asiacute como meacutetricas y el papel que desempentildean las herra-

mientas de anaacutelisis de rendimiento

Una vez presentados los sistemas paralelos nos centraremos en su programa-

cioacuten Veremos los conceptos fundamentales de los modelos de programacioacuten

tanto para memoria compartida (por ejemplo OpenMP) como para memoria

distribuida (por ejemplo MPI)

Finalmente estudiaremos los retos actuales maacutes importantes de la compu-

tacioacuten de altas prestaciones como los relacionados con la gestioacuten de parale-

lismo masivo o las limitaciones en cuanto a la disponibilidad de energiacutea

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 2: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

Los textos e imaacutegenes publicados en esta obra estaacuten sujetos ndashexcepto que se indique lo contrariondash a una licencia deReconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v30 Espantildea de Creative Commons Podeacuteis copiarlos distribuirlosy transmitirlos puacuteblicamente siempre que citeacuteis el autor y la fuente (FUOC Fundacioacuten para la Universitat Oberta de Catalunya)no hagaacuteis de ellos un uso comercial y ni obra derivada La licencia completa se puede consultar en httpcreativecommonsorglicensesby-nc-nd30eslegalcodees

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

Iacutendice

Introduccioacuten 5

Objetivos 6

1 Motivaciones de la computacioacuten de altas prestaciones 7

11 Utilidad de la simulacioacuten numeacuterica 7

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones 8

121 Aplicaciones HTC 9

122 Aplicaciones HPC 9

2 Paralelismo y arquitecturas paralelas 12

21 Necesidad de la computacioacuten paralela 12

22 Arquitecturas de computacioacuten paralela 14

221 Una instruccioacuten muacuteltiples datos (SIMD) 14

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD) 18

223 Coherencia de memoria cacheacute 22

23 Sistemas distribuidos 26

3 Programacioacuten de aplicaciones paralelas 27

31 Modelos de programacioacuten de memoria compartida 28

311 Programacioacuten con flujos 28

312 OpenMP 29

313 CUDA y OpenCL 30

32 Modelos de programacioacuten de memoria distribuida 33

321 MPI 33

322 PGAS 35

33 Modelos de programacioacuten hiacutebridos 36

4 Rendimiento de aplicaciones paralelas 39

41 Speedup y eficiencia 39

42 Ley de Amdahl 41

43 Escalabilidad 42

44 Anaacutelisis de rendimiento de aplicaciones paralelas 43

441 Medidas de tiempos 44

442 Interfaces de instrumentacioacuten y monitorizacioacuten 45

443 Herramientas de anaacutelisis de rendimiento 46

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones 50

451 Pruebas de rendimiento 51

452 Lista Top500 52

5 Retos de la computacioacuten de altas prestaciones 57

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

51 Concurrencia extrema 58

52 Energiacutea 59

53 Tolerancia a fallos 59

54 Heterogeneidad 60

55 Entradasalida y memoria 60

Bibliografiacutea 63

CC-BY-NC-ND bull PID_00209165 5 Introduccioacuten a la computacioacuten de altas prestaciones

Introduccioacuten

En este primer moacutedulo didaacutectico estudiaremos las motivaciones y caracteriacutes-

ticas de la computacioacuten de altas prestaciones y repasaremos sus fundamentos

de arquitectura y de programacioacuten para poner en contexto y vertebrar los

contenidos de los siguientes moacutedulos didaacutecticos

Estudiaremos las arquitecturas de los sistemas paralelos y otros conceptos de

relevancia como por ejemplo las redes de interconexioacuten Tambieacuten estudiare-

mos conceptos fundamentales relacionados con el rendimiento de sistemas

de altas prestaciones asiacute como meacutetricas y el papel que desempentildean las herra-

mientas de anaacutelisis de rendimiento

Una vez presentados los sistemas paralelos nos centraremos en su programa-

cioacuten Veremos los conceptos fundamentales de los modelos de programacioacuten

tanto para memoria compartida (por ejemplo OpenMP) como para memoria

distribuida (por ejemplo MPI)

Finalmente estudiaremos los retos actuales maacutes importantes de la compu-

tacioacuten de altas prestaciones como los relacionados con la gestioacuten de parale-

lismo masivo o las limitaciones en cuanto a la disponibilidad de energiacutea

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 3: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

Iacutendice

Introduccioacuten 5

Objetivos 6

1 Motivaciones de la computacioacuten de altas prestaciones 7

11 Utilidad de la simulacioacuten numeacuterica 7

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones 8

121 Aplicaciones HTC 9

122 Aplicaciones HPC 9

2 Paralelismo y arquitecturas paralelas 12

21 Necesidad de la computacioacuten paralela 12

22 Arquitecturas de computacioacuten paralela 14

221 Una instruccioacuten muacuteltiples datos (SIMD) 14

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD) 18

223 Coherencia de memoria cacheacute 22

23 Sistemas distribuidos 26

3 Programacioacuten de aplicaciones paralelas 27

31 Modelos de programacioacuten de memoria compartida 28

311 Programacioacuten con flujos 28

312 OpenMP 29

313 CUDA y OpenCL 30

32 Modelos de programacioacuten de memoria distribuida 33

321 MPI 33

322 PGAS 35

33 Modelos de programacioacuten hiacutebridos 36

4 Rendimiento de aplicaciones paralelas 39

41 Speedup y eficiencia 39

42 Ley de Amdahl 41

43 Escalabilidad 42

44 Anaacutelisis de rendimiento de aplicaciones paralelas 43

441 Medidas de tiempos 44

442 Interfaces de instrumentacioacuten y monitorizacioacuten 45

443 Herramientas de anaacutelisis de rendimiento 46

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones 50

451 Pruebas de rendimiento 51

452 Lista Top500 52

5 Retos de la computacioacuten de altas prestaciones 57

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

51 Concurrencia extrema 58

52 Energiacutea 59

53 Tolerancia a fallos 59

54 Heterogeneidad 60

55 Entradasalida y memoria 60

Bibliografiacutea 63

CC-BY-NC-ND bull PID_00209165 5 Introduccioacuten a la computacioacuten de altas prestaciones

Introduccioacuten

En este primer moacutedulo didaacutectico estudiaremos las motivaciones y caracteriacutes-

ticas de la computacioacuten de altas prestaciones y repasaremos sus fundamentos

de arquitectura y de programacioacuten para poner en contexto y vertebrar los

contenidos de los siguientes moacutedulos didaacutecticos

Estudiaremos las arquitecturas de los sistemas paralelos y otros conceptos de

relevancia como por ejemplo las redes de interconexioacuten Tambieacuten estudiare-

mos conceptos fundamentales relacionados con el rendimiento de sistemas

de altas prestaciones asiacute como meacutetricas y el papel que desempentildean las herra-

mientas de anaacutelisis de rendimiento

Una vez presentados los sistemas paralelos nos centraremos en su programa-

cioacuten Veremos los conceptos fundamentales de los modelos de programacioacuten

tanto para memoria compartida (por ejemplo OpenMP) como para memoria

distribuida (por ejemplo MPI)

Finalmente estudiaremos los retos actuales maacutes importantes de la compu-

tacioacuten de altas prestaciones como los relacionados con la gestioacuten de parale-

lismo masivo o las limitaciones en cuanto a la disponibilidad de energiacutea

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 4: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 Introduccioacuten a la computacioacuten de altas prestaciones

51 Concurrencia extrema 58

52 Energiacutea 59

53 Tolerancia a fallos 59

54 Heterogeneidad 60

55 Entradasalida y memoria 60

Bibliografiacutea 63

CC-BY-NC-ND bull PID_00209165 5 Introduccioacuten a la computacioacuten de altas prestaciones

Introduccioacuten

En este primer moacutedulo didaacutectico estudiaremos las motivaciones y caracteriacutes-

ticas de la computacioacuten de altas prestaciones y repasaremos sus fundamentos

de arquitectura y de programacioacuten para poner en contexto y vertebrar los

contenidos de los siguientes moacutedulos didaacutecticos

Estudiaremos las arquitecturas de los sistemas paralelos y otros conceptos de

relevancia como por ejemplo las redes de interconexioacuten Tambieacuten estudiare-

mos conceptos fundamentales relacionados con el rendimiento de sistemas

de altas prestaciones asiacute como meacutetricas y el papel que desempentildean las herra-

mientas de anaacutelisis de rendimiento

Una vez presentados los sistemas paralelos nos centraremos en su programa-

cioacuten Veremos los conceptos fundamentales de los modelos de programacioacuten

tanto para memoria compartida (por ejemplo OpenMP) como para memoria

distribuida (por ejemplo MPI)

Finalmente estudiaremos los retos actuales maacutes importantes de la compu-

tacioacuten de altas prestaciones como los relacionados con la gestioacuten de parale-

lismo masivo o las limitaciones en cuanto a la disponibilidad de energiacutea

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 5: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 5 Introduccioacuten a la computacioacuten de altas prestaciones

Introduccioacuten

En este primer moacutedulo didaacutectico estudiaremos las motivaciones y caracteriacutes-

ticas de la computacioacuten de altas prestaciones y repasaremos sus fundamentos

de arquitectura y de programacioacuten para poner en contexto y vertebrar los

contenidos de los siguientes moacutedulos didaacutecticos

Estudiaremos las arquitecturas de los sistemas paralelos y otros conceptos de

relevancia como por ejemplo las redes de interconexioacuten Tambieacuten estudiare-

mos conceptos fundamentales relacionados con el rendimiento de sistemas

de altas prestaciones asiacute como meacutetricas y el papel que desempentildean las herra-

mientas de anaacutelisis de rendimiento

Una vez presentados los sistemas paralelos nos centraremos en su programa-

cioacuten Veremos los conceptos fundamentales de los modelos de programacioacuten

tanto para memoria compartida (por ejemplo OpenMP) como para memoria

distribuida (por ejemplo MPI)

Finalmente estudiaremos los retos actuales maacutes importantes de la compu-

tacioacuten de altas prestaciones como los relacionados con la gestioacuten de parale-

lismo masivo o las limitaciones en cuanto a la disponibilidad de energiacutea

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 6: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 6 Introduccioacuten a la computacioacuten de altas prestaciones

Objetivos

Los materiales didaacutecticos de este moacutedulo contienen las herramientas necesa-

rias para lograr los objetivos siguientes

1 Entender las motivaciones de la computacioacuten de altas prestaciones y del

paralelismo

2 Conocer los fundamentos del paralelismo y las arquitecturas paralelas tan-

to los relacionados con sistemas de memoria compartida como de memo-

ria distribuida

3 Conocer las caracteriacutesticas de los sistemas paralelos como por ejemplo la

jerarquiacutea de memoria redes de interconexioacuten etc

4 Entender las diferencias entre sistemas paralelos y distribuidos

5 Conocer los modelos de programacioacuten para sistemas de altas prestaciones

tanto de memoria compartida como de memoria distribuida

6 Conocer los fundamentos relacionados con el rendimiento de sistemas de

altas prestaciones y del anaacutelisis de rendimiento

7 Estar al corriente de los retos actuales de la computacioacuten de altas presta-

ciones

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 7: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 7 Introduccioacuten a la computacioacuten de altas prestaciones

1 Motivaciones de la computacioacuten de altasprestaciones

En general la computacioacuten de altas prestaciones ha estado motivada por la

continua y creciente demanda de prestaciones y velocidad de computacioacuten

necesarias para resolver problemas computacionales cada vez maacutes complejos

en un tiempo razonable Esta gran demanda de computacioacuten es requerida por

aacutereas como por ejemplo modelos numeacutericos y simulacioacuten de problemas de

ciencia e ingenieriacutea

11 Utilidad de la simulacioacuten numeacuterica

La simulacioacuten numeacuterica se considera el tercer pilar de la ciencia ademaacutes de

la experimentacioacuten u observacioacuten y la teoriacutea El paradigma tradicional de la

ciencia e ingenieriacutea estaacute basado en la teoriacutea o el disentildeo en papel para despueacutes

realizar experimentos o crear el sistema Este paradigma tiene numerosas limi-

taciones frente al problema que hay que resolver como

bull El problema es muy difiacutecil como por ejemplo construir tuacuteneles de viento

enormes

bull El problema es muy caro econoacutemicamente como por ejemplo fabricar un

avioacuten solo para experimentar

bull El problema es demasiado lento como por ejemplo esperar el efecto del

cambio climaacutetico o la evolucioacuten de galaxias

bull El problema es muy peligroso como por ejemplo pruebas de armas disentildeo

de faacutermacos experimentacioacuten con el medio ambiente etc

El paradigma de la ciencia computacional estaacute basado en utilizarsiste-

masdealtasprestaciones para simular el fenoacutemeno deseado Por lo

tanto la ciencia computacional se basa en las leyes de la fiacutesica y los

meacutetodos numeacutericos eficientes

Algunas de las aplicaciones que tradicionalmente han sido un reto para la co-

munidad y que necesitan computacioacuten de altas prestaciones puesto que no

pueden ser ejecutadas con otro tipo de computador (por ejemplo computado-

res personales) son

bull Aplicaciones cientiacuteficas como por ejemplo el cambio climaacutetico los mo-

delos astrofiacutesicos el anaacutelisis genoacutemico el plegamiento de proteiacutenas (dise-

ntildeo de faacutermacos) etc

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 8: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 8 Introduccioacuten a la computacioacuten de altas prestaciones

bull Aplicaciones de ingenieriacutea como por ejemplo la simulacioacuten de tests de

choque el disentildeo de semiconductores los modelos estructurales de terre-

motos etc

bull Aplicaciones de negocio como por ejemplo los modelos financieros y eco-

noacutemicos el proceso de transacciones los servicios web los motores de

busca etc

bull Aplicaciones de defensa y militares como por ejemplo las simulaciones

de pruebas con armas nucleares la criptografiacutea etc

En aplicaciones de ingenieriacutea la computacioacuten de altas prestaciones permite

disminuir la utilizacioacuten de prototipos en el proceso de disentildeo y optimizacioacuten

de procesos Asiacute pues permite disminuir costes aumentar la productividad ndash

al disminuir el tiempo de desarrollondash y aumentar la seguridad En aplicaciones

cientiacuteficas la computacioacuten de altas prestaciones permite la simulacioacuten de sis-

temas a gran escala sistemas a muy pequentildea escala y el anaacutelisis de la validez

de un modelo matemaacutetico La figura siguiente ilustra el cambio de paradigma

en aplicaciones de ingenieriacutea y ciencia

Figura 1 Cambio de paradigma en aplicaciones de ingenieriacutea y ciencia

12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones

Las aplicaciones que requieren altas prestaciones se pueden dividir en

dos grandes grupos aplicacionesdealtaproductividadoHTC1 y apli-

cacionesdealtasprestacionesoHPC2

Tambieacuten lo podemos ver desde el punto de vista de la manera de tratar el

problema La computacioacuten paralela permite el desarrollo de aplicaciones que

aprovechen la utilizacioacuten de muacuteltiples procesadores de forma colaborativa con

el objetivo de resolver un problema comuacuten De hecho el objetivo fundamen-

tal que persiguen estas teacutecnicas es conseguir reducir el tiempo de ejecucioacuten

de una aplicacioacuten mediante la utilizacioacuten de muacuteltiples procesadores Adicio-

nalmente tambieacuten es posible querer resolver problemas mayores mediante el

aprovechamiento de las diferentes memorias de los procesadores involucrados

en la ejecucioacuten Podemos hablar baacutesicamente de dos conceptos fundamenta-

les

(1)Del ingleacutes high throughput com-puting

(2)Del ingleacutes high performance com-puting

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 9: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 9 Introduccioacuten a la computacioacuten de altas prestaciones

1)Particionamientodetareas consiste en dividir una tarea grande en un

nuacutemero de diferentes subtareas que puedan ser complementadas por diferen-

tes unidades de proceso

2)Comunicacioacutenentretareas a pesar de que cada proceso realice una subta-

rea generalmente seraacute necesario que estos se comuniquen para poder coope-

rar en la obtencioacuten de la solucioacuten global del problema

121 Aplicaciones HTC

El objetivo de las aplicaciones HTC es aumentar el nuacutemero de ejecucio-

nes por unidad de tiempo Su rendimiento se mide en nuacutemero de tra-

bajos ejecutados por unidad de tiempo (por ejemplo trabajos por se-

gundo)

En la figura siguiente se muestran tres tipos de modelos de aplicaciones HTC

suponiendo que la tarea que hay que ejecutar se pueda descomponer en di-

ferentes trabajos (normalmente denominados jobs) En el primero (HTC siacuten-

crono) los trabajos estaacuten sincronizados y acaban a la vez en el segundo (HTC

asiacutencrono) los trabajos acaban en diferentes instantes y en el uacuteltimo (maes-

tro-esclavo) hay un trabajo especializado (maestro) que se encarga de sincro-

nizar el resto de los trabajos (esclavos)

Figura 2 Modelos de aplicaciones HTC

122 Aplicaciones HPC

Aplicaciones HTC

Algunas de las aacutereas que sue-len requerir este tipo de aplica-ciones son la bioinformaacutetica olas finanzas

El objetivo de las aplicaciones HPC es reducir el tiempo de ejecucioacuten de una

uacutenica aplicacioacuten paralela Su rendimiento se mide en nuacutemero de operaciones

en punto flotante por segundo3 (Flops) y normalmente se suele medir en mi-

llones billones trillones etc tal y como muestra la tabla 1

Tabla 1 Unidades de medida de rendimiento

Nombre Flops

Megaflops 106

(3)En ingleacutes floating point opera-tions per second

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 10: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 10 Introduccioacuten a la computacioacuten de altas prestaciones

Nombre Flops

Gigaflops 109

Teraflops 1012

Petaflops 1015

Exaflops 1018

Zettaflops 1021

Yottaflops 1024

Algunas aacutereas que suelen requerir este tipo de aplicaciones son

a) Estudio de fenoacutemenos a escala microscoacutepica (dinaacutemica de partiacuteculas) La

resolucioacuten estaacute limitada por la potencia de caacutelculo del computador Cuantos

maacutes grados de libertad (puntos) mejor se refleja la realidad

b) Estudio de fenoacutemenos a escala macroscoacutepica (sistemas descritos por ecua-

ciones diferenciales fundamentales) La precisioacuten estaacute limitada por la potencia

de caacutelculo del computador Cuantos maacutes puntos maacutes se acerca la solucioacuten

discreta a la continua

Actualmente la computacioacuten de altas prestaciones es sinoacutenimo de paralelismo

por lo tanto del aumento del nuacutemero de procesadores En general se quiere

aumentar el nuacutemero de procesadores para

bull Resolver problemas en un tiempo de ejecucioacuten inferior utilizando maacutes

procesadores

bull Resolver problemas con maacutes precisioacuten utilizando maacutes memoria

bull Resolver problemas maacutes reales utilizando modelos matemaacuteticos maacutes com-

plejos

La prediccioacuten meteoroloacutegica

Un ejemplo de esto es la prediccioacuten meteoroloacutegica que requiere gran capacidad de caacutelcu-lo y de memoria La prediccioacuten meteoroloacutegica es una funcioacuten de la longitud latitud al-tura y tiempo Para cada uno de estos puntos se deben calcular varios paraacutemetros comopor ejemplo la temperatura presioacuten humedad y velocidad del viento Hay casos en losque la prediccioacuten meteoroloacutegica se necesita en ldquotiempo realrdquo (en cuestioacuten de horas node diacuteas) como en el caso de la prediccioacuten de la formacioacuten la trayectoria y el posibleimpacto de un huracaacuten Hay que tener en cuenta que llevar a cabo las simulaciones conuna precisioacuten insuficiente puede provocar perder detalles importantes y llegar a conclu-siones poco acertadas que pueden tener consecuencias devastadoras La figura 3 ilustralos resultados obtenidos con el modelo WRF4 con dos niveles de precisioacuten diferentes

(4)Weather Research and Forecas-ting

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 11: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 11 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 3 Predicciones meteoroloacutegicas con WRF de diferentes precisiones

Fuente The National Center for Atmospheric Research

En la simulacioacuten del graacutefico de la izquierda la cuadriacutecula es de 4 kiloacutemetros cuadradosmientras que en el de la derecha es de 10 kiloacutemetros cuadrados Se puede apreciar clara-mente que hay ciertos fenoacutemenos que no se pueden observar con claridad en la figura dela derecha Hay que tener en cuenta que una prediccioacuten cuidadosa de estos fenoacutemenosaparte del impacto directo en la poblacioacuten tambieacuten afecta a la economiacutea (por ejemplose estima que en Estados Unidos el 40 de pequentildeasmedianas empresas cierran en lossiguientes 36 meses si se ven forzadas a cerrar 3 o maacutes diacuteas despueacutes de un huracaacuten) Asiacutepues disponer de computacioacuten de altas prestaciones puede llegar a salvar vidas yo laeconomiacutea de regiones

La figura 4 muestra otros ejemplos claacutesicos que requieren gran potencia de

caacutelculo y por lo tanto computacioacuten de altas prestaciones y los cuantifica en

cuanto a cantidad de caacutelculo requerido para llevarlos a cabo

Figura 4 Ejemplos de la necesidad de altas prestaciones

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 12: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 12 Introduccioacuten a la computacioacuten de altas prestaciones

2 Paralelismo y arquitecturas paralelas

21 Necesidad de la computacioacuten paralela

Durante las uacuteltimas deacutecadas el rendimiento de los microprocesadores se ha

incrementado de media en un 50 por antildeo Este incremento en rendimiento

y prestaciones significa que los usuarios y los desarrolladores de programas po-

diacutean simplemente esperar la siguiente generacioacuten de microprocesadores para

obtener una mejora sustancial en el rendimiento de sus programas En cambio

desde el 2002 la mejora de rendimiento de los procesadores de forma indivi-

dual se ha frenado en un 20 por antildeo Esta diferencia es muy grande puesto

que si tenemos en cuenta un incremento de rendimiento del 50 por antildeo

en cuestioacuten de 10 antildeos el factor seriacutea de aproximadamente 60 veces mientras

que con un incremento del 20 el factor solo es de 6 veces

Uno de los meacutetodos maacutes relevantes para mejorar el rendimiento de los compu-

tadores ha sido el aumento de la velocidad del reloj del procesador debido al

aumento de la densidad de los procesadores A medida que el tamantildeo de los

transistores disminuye se puede aumentar su velocidad y en consecuencia la

velocidad global del circuito integrado aumenta

Esto estaacute motivado por la ley de Moore una ley empiacuterica que dice que ldquola

densidad de circuitos en un chip se dobla cada 18 mesesrdquo (Gordon Moore

Chairman Intel 1965) La tabla 2 muestra la evolucioacuten de la tecnologiacutea en

los procesadores Intel Aun asiacute la ley de Moore tiene liacutemites evidentes

Los liacutemites de la ley de Moore

Por ejemplo si tenemos en cuenta la velocidad de la luz como velocidad de referenciapara el movimiento de los datos en un chip para desarrollar un computador que tengaun rendimiento de 1 Tflop con 1 TB de datos (1 THz) la distancia (r) para acceder al datoen memoria deberiacutea ser inferior a c1012 Esto quiere decir que el tamantildeo del chip tendriacuteaque ser de 03 x 03 mm Para contener 1 TB de informacioacuten una palabra de memoriadeberiacutea ocupar 3 amstrongs x 3 amstrongs que es el tamantildeo iexclde un aacutetomo

Tabla 2 Evolucioacuten de la tecnologiacutea de microprocesadores (familia Intel no completa)

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

4004 1971 2250 10 μm

8008 1972 3500 10 μm

8080 1974 6000 6 μm

8086 1978 29000 3 μm

286 1982 134000 15 μm

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 13: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 13 Introduccioacuten a la computacioacuten de altas prestaciones

Procesador Antildeo Nuacutemero detransistores

Tecnologiacutea

386 1985 275000 1 μm

486 DX 1989 1200000 08 μm

Pentium 1993 3100000 08 μm

Pentium II 1997 7500000 035 μm

Pentium III 1999 28000000 180 nm

Pentium IV 2002 55000000 130 nm

Core 2 Duo 2006 291000000 65 nm

Core i7 (Quad) 2008 731000000 45 nm

Core i7 (Sandy Bridge) 2011 2300000000 32 nm

Tambieacuten hay que tener en cuenta que a medida que la velocidad de los tran-

sistores aumenta el consumo eleacutectrico tambieacuten lo hace La mayoriacutea de este

consumo se transforma en calor y cuando un circuito integrado se calienta

mucho no es fiable Incluso podemos encontrar limitaciones en cuanto a pa-

ralelismo a nivel de de instruccioacuten5 puesto que haciendo el pipeline maacutes y

maacutes grande se puede acabar obteniendo un peor rendimiento

Asiacute pues actualmente no es viable continuar incrementando la velocidad de

los circuitos integrados En cambio todaviacutea podemos continuar incrementan-

do la densidad de los transistores pero hay que destacar que solo por un cierto

tiempo

La manera que nos queda para sacar partido al aumento en la densidad de

los transistores es mediante el paralelismo En vez de construir procesadores

monoliacuteticos cada vez maacutes raacutepidos y complejos la solucioacuten que la industria

adoptoacute fue el desarrollo de procesadores con muacuteltiples nuacutecleos centraacutendose

en el rendimiento de ejecucioacuten de aplicaciones paralelas en lugar de programas

secuenciales De esta manera en los uacuteltimos antildeos se ha producido un cambio

muy significativo en la industria de la computacioacuten paralela

(5)En ingleacutes instruction level paralle-lism

Actualmente casi todos los ordenadores de consumo incorporan procesadores

multinuacutecleo6 y el concepto de nuacutecleo7 se ha convertido en sinoacutenimo de CPU

Desde la incorporacioacuten de los procesadores multinuacutecleo en dispositivos coti-

dianos desde procesadores duales para dispositivos moacuteviles hasta procesado-

res con maacutes de una docena de nuacutecleos para servidores y estaciones de trabajo

la computacioacuten paralela ha dejado de ser exclusiva de supercomputadores y

sistemas de altas prestaciones Asiacute estos dispositivos proporcionan funciona-

lidades maacutes sofisticadas que sus predecesores mediante computacioacuten paralela

(6)En ingleacutes multicore

(7)En ingleacutes core

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 14: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 14 Introduccioacuten a la computacioacuten de altas prestaciones

Este cambio tambieacuten tiene consecuencias draacutesticas de cara a los programado-

res puesto que las nuevas generaciones de circuitos integrados que incorporan

maacutes procesadores no mejoran automaacuteticamente el rendimiento de las aplica-

ciones secuenciales como sucediacutea hasta entonces Tal y como veremos maacutes

adelante seraacuten necesarias nuevas teacutecnicas y modelos de programacioacuten para

sacar provecho a las nuevas generaciones de procesadores

22 Arquitecturas de computacioacuten paralela

En computacioacuten paralela normalmente se suele utilizar la taxonomiacutea de Flynn

para clasificar las arquitecturas de computadores Esta clasifica un sistema se-

guacuten el nuacutemero de flujos de datos y de instrucciones que pueden gestionar si-

multaacuteneamente A pesar de que veremos esta taxonomiacutea con maacutes detalle en

otro moacutedulo didaacutectico los dos tipos fundamentales se exponen a continua-

cioacuten La figura siguiente muestra la clasificacioacuten de las arquitecturas paralelas

incluyendo la taxonomiacutea de Flynn

Figura 5 Clasificacioacuten de las arquitecturas paralelas

221 Una instruccioacuten muacuteltiples datos (SIMD)

Ved tambieacuten

La taxonomiacutea de Flynn se tratacon detenimiento en el moacutedu-lo ldquoProcesadores y modelos deprogramacioacutenrdquo de esta asigna-tura

En los sistemas SIMD8 una misma instruccioacuten se aplica sobre varios

datos asiacute que se podriacutea ver como tener una uacutenica unidad de control y

muacuteltiples ALU

Una instruccioacuten se enviacutea desde la unidad de control hacia todas las ALU y cada

una de las ALU o bien aplica la instruccioacuten a su conjunto de datos o bien que-

da sin trabajo si no tiene datos asociados Los sistemas SIMD son ideales para

ciertas tareas como por ejemplo para paralelizar bucles sencillos que operan

sobre vectores de datos de gran tamantildeo Este tipo de paralelismo se denomina

paralelismo de datos El problema principal de los sistemas SIMD es que no

siempre funciona bien para todos los tipos de problemas Estos sistemas han

evolucionado de una manera un poco peculiar durante su historia A comien-

(8)Del ingleacutes single instruction mul-tiple data stream

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 15: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 15 Introduccioacuten a la computacioacuten de altas prestaciones

zos de los antildeos noventa la mayoriacutea de los supercomputadores paralelos esta-

ban basados en sistemas SIMD En cambio a finales de la misma deacutecada los

sistemas SIMD eran baacutesicamente procesadores vectoriales Maacutes recientemente

los procesadores graacuteficos o GPU y los procesadores de gran consumo usan as-

pectos de la arquitectura SIMD

Procesadores vectoriales

A pesar de que lo que constituye un procesador vectorial ha ido cam-

biando con el paso de los antildeos su caracteriacutestica clave es que operan

sobrevectoresdedatos mientras que los procesadores convencionales

operan sobre elementos de datos individuales o escalares

Estos tipos de procesadores son raacutepidos y faacuteciles de utilizar para bastantes tipos

de aplicaciones Los compiladores que vectorizan el coacutedigo son muy buenos

identificando coacutedigo que se puede vectorizar y tambieacuten bucles que no se pue-

den vectorizar Los sistemas vectoriales tienen un ancho de banda en memo-

ria muy elevado y todos los datos que se cargan se utilizan en contra de los

sistemas basados en memoria cacheacute que no hacen uso de todos los elementos

de una liacutenea de memoria cacheacute La parte negativa de los sistemas vectoriales

es que no pueden trabajar con estructuras de datos irregulares y por lo tan-

to tienen limitaciones importantes respecto a su escalabilidad puesto que no

pueden tratar problemas muy grandes Los procesadores vectoriales actuales

tienen las siguientes caracteriacutesticas

bull Registros vectoriales son registros que son capaces de guardar vectores de

operandos y operar simultaacuteneamente sobre sus contenidos El tamantildeo del

vector lo fija el sistema y puede oscilar desde 4 hasta por ejemplo 128

elementos de 64 bits

bull Unidades funcional vectorizadas hay que tener en cuenta que la misma

operacioacuten se aplica a cada elemento del vector o en operaciones como por

ejemplo la suma la misma operacioacuten se aplica a cada par de elementos de

los dos vectores de una sola vez Por lo tanto las operaciones son SIMD

bull Instrucciones sobre vectores son instrucciones que operan sobre vectores

en vez de sobre escalares Esto provoca que para realizar las operaciones

en lugar de hacerlo individualmente para cada elemento del vector (por

ejemplo load add y store para incrementar el valor de cada elemento del

vector) se pueda hacer por bloques

bull Memoria intercalada9 el sistema de memoria consiste en muacuteltiples ldquoban-

cosrdquo de memoria a los que se puede acceder maacutes o menos independiente-

mente Despueacutes de acceder a un banco habraacute una demora antes de poder

volver a acceder a eacutel pero a los otros bancos se puede acceder mucho maacutes

(9)En ingleacutes interleaved memory

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 16: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 16 Introduccioacuten a la computacioacuten de altas prestaciones

pronto Si los elementos de un vector estaacuten distribuidos en muacuteltiples ban-

cos habraacute un acceso muy raacutepido para leer o escribir elementos sucesivos

bull Acceso a memoria por intervalos con este tipo de acceso el programa ac-

cede a elementos de un vector localizado a intervalos Por ejemplo acce-

diendo al segundo elemento al sexto al deacutecimo etc seriacutea acceso a me-

moria en un intervalo de 4

La figura siguiente muestra un procesador vectorial simple donde se puede

apreciar que los bloques maacutes baacutesicos pueden actuar sobre un conjunto de re-

gistros vectoriales

Figura 6 Arquitectura vectorial simple

Procesadores graacuteficos (GPU)

Los procesadores graacuteficos tradicionalmente funcionanmedianteun

pipelinedeprocesamiento formado por etapas muy especializadas en

las funciones que desarrollan y que se ejecutan en un orden preesta-

blecido Cada una de las etapas del pipeline recibe la salida de la etapa

anterior y proporciona su salida a la etapa siguiente

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 17: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 17 Introduccioacuten a la computacioacuten de altas prestaciones

Gracias a la implementacioacuten mediante una estructura de pipeline el procesa-

dor graacutefico puede ejecutar varias operaciones en paralelo Como este pipeline

es especiacutefico para la gestioacuten de graacuteficos normalmente se denomina pipeline

graacutefico o pipeline de renderizacioacuten La operacioacuten de renderizacioacuten consiste en

proyectar una representacioacuten en 3 dimensiones en una imagen en 2 dimen-

siones (que es el objetivo de un procesador graacutefico) Aun asiacute hay etapas del pi-

peline graacutefico que se pueden programar e incluso en GPU actuales orientadas a

propoacutesito general hay gran flexibilidad de programacioacuten mediante los llama-

dos kernels Los kernels son normalmente coacutedigos bastante cortos en los que el

paralelismo estaacute impliacutecito puesto que cuando se instancian los kernels estos

se encargan de procesar la parte de los datos que les correspondan De hecho

las GPU tambieacuten pueden utilizar paralelismo SIMD para mejorar el rendimien-

to y las generaciones actuales de GPU lo hacen poniendo un nuacutemero elevado

de ALU (podeacuteis ver la figura 7) en cada nuacutecleo Los procesadores graacuteficos se

estaacuten haciendo muy populares en la computacioacuten de altas prestaciones y va-

rios lenguajes se han desarrollado para facilitar al usuario su programacioacuten

Figura 7 Diagrama de bloques de la arquitectura Evergreen de AMD

Nuacutemero elevado de ALU

En la arquitectura Evergreende AMD se ponen 1600 ALU

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 18: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 18 Introduccioacuten a la computacioacuten de altas prestaciones

222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)

Los sistemas MIMD10 normalmente consisten en un conjunto de unida-

des de procesamiento o nuacutecleoscompletamenteindependientes que

tienen su propia unidad de control y su propia ALU

A diferencia de los sistemas SIMD los MIMD normalmente son asiacutencronos es

decir que pueden operar por su parte En muchos sistemas MIMD ademaacutes

no hay un reloj global y puede ser que no haya relacioacuten entre los tiempos de

los sistemas de dos procesadores diferentes De hecho a no ser que el progra-

mador imponga cierta sincronizacioacuten incluso aunque los procesadores esteacuten

ejecutando la misma secuencia de instrucciones en un momento de tiempo

concreto pueden estar ejecutando partes diferentes

(10)Del ingleacutes multiple instructionmultiple data stream (MIMD)

Hay dos tipos principales de sistemas MIMD sistemas de memoria comparti-

da y sistemas de memoria distribuida tal y como ilustran las figuras 8 y 9

En un sistema de memoria compartida un conjunto de procesadores autoacuteno-

mos se conectan al sistema de memoria mediante una red de interconexioacuten

y cada procesador puede acceder a cualquier parte de la memoria Los proce-

sadores normalmente se comunican impliacutecitamente mediante estructuras de

datos compartidos en la memoria En un sistema de memoria distribuida cada

procesador estaacute ligado a su propia memoria privada y los conjuntos procesa-

dor-memoria se comunican mediante una red de interconexioacuten Por lo tanto

en un sistema de memoria distribuida los procesadores normalmente se co-

munican expliacutecitamente enviando mensajes o utilizando funciones especiales

que proporcionan acceso a la memoria de otro procesador

Actividad

Os proponemos que busqueacuteis informacioacuten sobre Infiniband y de su implementacioacuten deRDMA

Figura 8 Sistema de memoria compartida

Acceder a la memoria deotro procesador

Un ejemplo de este uacuteltimo ti-po es RDMA una caracteriacutesticade interfaces de red que per-miten a un computador acce-der directamente a la memoriade otro computador sin pasarpor el sistema operativo Unaimplementacioacuten que se utilizaen computacioacuten de altas pres-taciones es sobre Infiniband

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 19: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 19 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 9 Sistema de memoria distribuida

Sistemas de memoria compartida

Los sistemas de memoria compartida maacutes utilizados utilizan uno o maacutes pro-

cesadores multinuacutecleo que utilizan una o maacutes de una CPU en un mismo chip

Tiacutepicamente los nuacutecleos tienen una memoria cacheacute privada de nivel 1 mien-

tras que otras memorias cacheacute pueden estar o no compartidas entre los distin-

tos nuacutecleos

En sistemas de memoria compartida con muacuteltiples procesadores multinuacutecleo

la red de interconexioacuten puede o bien conectar todos los procesadores directa-

mente con la memoria principal o bien cada procesador puede tener acceso

directo a un bloque de la memoria principal y los procesadores pueden acce-

der a los bloques de memoria de los otros procesadores mediante hardware

especializado incorporado en los procesadores tal y como muestran las figu-

ras 10 y 11

Figura 10 Sistema multinuacutecleo UMA

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 20: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 20 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 11 Sistema multinuacutecleo NUMA

En el primer tipo de sistema el tiempo de acceso a todas las posiciones de

memoria es el mismo para todos los nuacutecleos mientras que en el segundo tipo

el tiempo de acceso a la memoria a la que el nuacutecleo estaacute directamente conec-

tado seraacute maacutes raacutepido que el de acceder a la memoria de otro chip Por lo tanto

el primer tipo de sistema se denomina UMA11 y el segundo se denomina NU-

MA12 Los sistemas UMA normalmente son mucho maacutes faacuteciles de programar

puesto que el programador no se ha de preocupar del tiempo de acceso a los

datos y por lo tanto de la localidad de los datos Esta ventaja no obstante

queda en cierto modo compensada por el acceso maacutes raacutepido a la memoria a la

que el nuacutecleo estaacute conectado en los sistemas NUMA y tambieacuten por el hecho de

que normalmente estos sistemas suelen disponer de maacutes cantidad de memoria

que los UMA

Por lo tanto podemos decir que la jerarquiacutea de memoria y su gestioacuten eficiente

es clave para la computacioacuten de altas prestaciones La figura siguiente muestra

los niveles claacutesicos de la jerarquiacutea de memoria de un computador enfatizando

el hecho de que cuanto maacutes raacutepida es una memoria maacutes pequentildea y costosa

suele ser La existencia de diferentes niveles de memoria implica que el tiempo

dedicado a realizar una operacioacuten de acceso a memoria de un nivel aumenta

con la distancia al nivel maacutes raacutepido que es el acceso a los registros del proce-

sador Una mala gestioacuten de la memoria provoca muchos fallos de paacutegina que

acaban realizando un uso excesivo del sistema de memoria virtual lo cual im-

plica realizar costosos accesos al disco Por lo tanto el disentildeo de aplicaciones

eficientes requiere un completo conocimiento de la estructura de la memoria

del computador y saber explotarla

(11)Del ingleacutes uniform memory ac-cess

(12)Del ingleacutes non-uniform memoryaccess

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 21: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 21 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 12 Jerarquiacutea de memoria de un computador

La optimizacioacuten del proceso de caacutelculo secuencial implica entre otras cosas

una seleccioacuten adecuada de las estructuras de datos que se van a utilizar para

representar la informacioacuten relativa al problema atendiendo a criterios de efi-

ciencia computacional Por ejemplo la utilizacioacuten de teacutecnicas de almacena-

miento de matrices dispersas pertenece a esta categoriacutea lo que permite alma-

cenar uacutenicamente los elementos no nulos de una matriz Ademaacutes este nivel

incluye la seleccioacuten de los meacutetodos eficientes para la resolucioacuten del problema

Una fase importante de las aplicaciones especialmente para aquellas orienta-

das a procesos de simulacioacuten corresponde a la grabacioacuten de datos en disco

Dado que el acceso a un disco duro presenta tiempos de acceso muy superio-

res a los correspondientes a memoria RAM resulta indispensable realizar una

gestioacuten eficiente del proceso de ES13 para que tenga el miacutenimo impacto sobre

el proceso de simulacioacuten

Finalmente y por encima del resto de las capas aparece la utilizacioacuten de

computacioacuten paralela En este sentido una buena estrategia de particioacuten de

tareas que garantice una distribucioacuten equitativa de la carga entre los procesa-

dores involucrados asiacute como la minimizacioacuten del nuacutemero de comunicaciones

entre estos permite reducir los tiempos de ejecucioacuten Ademaacutes con la partici-

pacioacuten de las principales estructuras de datos de la aplicacioacuten entre los diferen-

tes procesadores se puede conseguir la resolucioacuten de problemas maacutes grandes

Sistemas de memoria distribuida

(13)Se refiere a un proceso de en-tradasalida

Los sistemas de memoria distribuida maacutes extendidos y populares son los de-

nominados cluacutesteres Estos estaacuten compuestos por un conjunto de sistemas de

consumo14 como por ejemplo PC conectados a una red de interconexioacuten tam-

bieacuten de consumo como por ejemplo Ethernet De hecho los nodos de estos

cluacutesteres que son unidades de computacioacuten individuales interconectadas me-

diante una red son normalmente sistemas de memoria compartida con uno o

(14)En ingleacutes commodity

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 22: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 22 Introduccioacuten a la computacioacuten de altas prestaciones

maacutes procesadores multinuacutecleo Para diferenciar estos sistemas de los que son

puramente de memoria distribuida en ocasiones se denominan sistemas hiacute-

bridos

Actualmente se entiende que un cluacutester estaacute compuesto de nodos de memo-

ria compartida Ademaacutes tambieacuten se entiende que los grandes sistemas de

computacioacuten paralelos son cluacutesteres por definicioacuten La principal diferencia

entre grandes centros de procesamiento o de datos15 que utiliza la industria

(por ejemplo Google Facebook etc) y los supercomputadores es la red de

interconexioacuten La clave en estos sistemas estaacute en poder ofrecer una latencia

muy reducida en la red de interconexioacuten para que el paso de mensajes sea

muy raacutepido puesto que las aplicaciones que requieren supercomputacioacuten son

baacutesicamente fuertemente acopladas16 es decir que los diferentes procesos que

se ejecutan en diferentes nodos distribuidos tienen dependencias de datos con

los otros procesos y se deben comunicar muy a menudo mediante paso de

mensajes

223 Coherencia de memoria cacheacute

Hay que recordar que las memorias cacheacute las gestionan sistemas hardware

por lo tanto los programadores no tienen control directo sobre ellas Esto tie-

ne consecuencias importantes para los sistemas de memoria compartida Para

entender esto suponemos que tenemos un sistema de memoria compartida

con dos nuacutecleos cada uno de los cuales tiene su propia memoria cacheacute de da-

tos No habriacutea ninguacuten problema mientras que los dos nuacutecleos solo lean datos

compartidos

Por ejemplo supongamos dos nuacutecleos compartiendo memoria y que x es una variablecompartida que se ha inicializado en 2 y0 es privada y propiedad del nuacutecleo 0 y y1 yz1 son privadas y propiedad del nuacutecleo 1 Ahora supongamos el siguiente escenario quemuestra la tabla 3

Tabla 3 Escenario ilustrativo de coherencia de memoria cacheacute

Tiempo Nuacutecleo 0 Nuacutecleo 1

0 y0 = x y1 = 3 x

1 x = 7 Coacutedigo que no involucra x

2 Coacutedigo que no involucra x z1 = 4 x

Entonces la posicioacuten de memoria de y0 finalmente tomaraacute el valor 2 y la posicioacuten dememoria de y1 tomaraacute el valor 6 En cambio no estaacute claro queacute valor que tomaraacute z1Inicialmente podriacutea parecer que como el nuacutecleo 0 actualiza x a 7 antes de la asignacioacutena z1 z1 tendraacute el valor 4 7 = 28 En cambio en el instante de tiempo 0 x estaacute en lamemoria cacheacute del nuacutecleo 1 Por lo tanto a no ser que por alguna razoacuten x sea desalojadade la memoria cacheacute del nuacutecleo 0 y despueacutes realojada en la memoria cacheacute del nuacutecleo 1en realidad el valor original x = 2 podriacutea ser utilizado y z1 tomaraacute el valor 4 2 = 8

Claramente esto es un problema importante y el programador no tiene por

queacute tener control directo de cuaacutendo las memorias cacheacute son actualizadas y

por lo tanto su programa no podraacute suponer en el caso del ejemplo anterior

(15)En ingleacutes datacenters

(16)En ingleacutes tightly coupled

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 23: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 23 Introduccioacuten a la computacioacuten de altas prestaciones

queacute valor tendraacute z1 Aquiacute hay varios problemas pero lo que se quiere destacar

es el hecho de que las memorias cacheacute de sistemas de un uacutenico procesador

no tienen mecanismos para asegurar que cuando las memorias cacheacute de muacutel-

tiples procesadores guardan la misma variable una modificacioacuten hecha por

uno de los procesadores a la variable en memoria cacheacute sea vista por el resto

de los procesadores Esto quiere decir que los valores en memoria cacheacute en

otros procesadores sean tambieacuten actualizados y por lo tanto hablamos del

problema de coherencia de memoria cacheacute

Teacutecnica de coherencia de memoria cacheacute snooping

Hay dos alternativas baacutesicas para asegurar coherencia en la memoria cacheacute

la teacutecnica de snooping y la basada en directorio La idea de la teacutecnica snooping

viene de los sistemas basados en bus cuando los nuacutecleos comparten un bus

cualquier sentildeal transmitida por el bus puede ser consultada por todos los nuacute-

cleos conectados al bus Por lo tanto cuando el nuacutecleo 0 actualiza la copia de

x que hay en su memoria cacheacute si tambieacuten se distribuye esta informacioacuten por

el bus y el nuacutecleo 1 estaacute escuchaacutendolo este podraacute ver que x se ha actualizado

y podraacute marcar su propia copia de x como invaacutelida Asiacute es baacutesicamente coacutemo

funciona la coherencia por snooping a pesar de que en la implementacioacuten real

cuando se distribuye la informacioacuten de alguacuten cambio se hace informando a los

otros nuacutecleos de que la liacutenea de memoria cacheacute que contiene x se ha actuali-

zado y no de que x se ha actualizado La figura siguiente muestra un esquema

del sistema de coherencia por snooping

Figura 13 Sistema sencillo de coherencia de memoria por snooping

Teacutecnica de coherencia de memoria basada en directorio

En redes de interconexioacuten grandes utilizar la teacutecnica de snooping no es viable

puesto que hay que distribuir datos por la red cada vez que hay un cambio y

esto claramente no es escalable ya que el rendimiento se degradariacutea mucho

Los protocolos de memoria cacheacute basados en directorio intentan resolver este

problema mediante una estructura de datos que se denomina directorio El

directorio almacena el estado de cada liacutenea de memoria cacheacute Tiacutepicamente

esta estructura de datos es distribuida asiacute que cada par de procesadormemoria

es responsable de almacenar la parte de la estructura correspondiente al estado

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 24: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 24 Introduccioacuten a la computacioacuten de altas prestaciones

de las liacuteneas de memoria cacheacute en su memoria local Cuando una variable se

actualiza se consulta el directorio y los controladores de memoria cacheacute de

los nuacutecleos que tienen la liacutenea de memoria cacheacute donde aparece esta variable

en su memoria cacheacute son invalidados

Figura 14 Sistemas de coherencia de memoria basados en directorio (a) con un directoriocentralizado y (b) con directorio distribuido

Con esta teacutecnica claramente se necesita maacutes espacio de memoria para el direc-

torio pero cuando una variable en memoria cacheacute se actualiza solo los nuacute-

cleos que almacenan esta variable necesitan ser contactados y por lo tanto se

reducen las comunicaciones por las redes y en consecuencia el rendimiento

mejora respecto a la teacutecnica de snooping

Falsa comparticioacuten

Es importante recordar que las memorias cacheacute de los procesadores estaacuten im-

plementadas en hardware por lo tanto operan sobre liacuteneas de memoria cacheacute

y no sobre variables individuales Esto puede tener consecuencias catastroacuteficas

en relacioacuten con el rendimiento Como ejemplo supongamos que queremos

llamar repetidamente a una funcioacuten f(ij) y antildeadir el valor devuelto dentro

de un vector tal y como muestra el coacutedigo siguiente

int i j m n

double y[m]

Asignar y = 0

for(i=0 iltm i++)

for(j=0 jltn j++)

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 25: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 25 Introduccioacuten a la computacioacuten de altas prestaciones

y[i] += f(ij)

Podemos paralelizarlo dividiendo las iteraciones del bucle exterior entre los

diferentes nuacutecleos Si tenemos num_cores nuacutecleos podemos asignar las pri-

meras mnum_cores iteraciones al primer nuacutecleo las siguientes mnum_cores

iteraciones al segundo nuacutecleo y asiacute sucesivamente tal y como se muestra en

el siguiente coacutedigo

Variables privadas

int i j num_iter

Variables privadas inicializadas por un nuacutecleo

int m n num_cores

double y[m]

num_iter = mnum_cores

El nuacutecleo 0 hace lo siguiente

for(i=0 iltnum_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

El nuacutecleo 1 hace lo siguiente

for(i=num_iter+1 ilt2num_iter i++)

for(j=0 jltn j++)

y[i] += f(ij)

double y[m]

Assignar y = 0

Supongamos que tenemos un sistema de memoria compartida que tiene dos

nuacutecleos m = 8 el tipo double es de 8 bytes las liacuteneas de memoria cacheacute son de

64 bytes e y[0] estaacute almacenado al principio de una liacutenea de memoria cacheacute

Una liacutenea de memoria cacheacute puede almacenar ocho doubles e y ocupa una liacutenea

de memoria cacheacute completa Si los nuacutecleos 0 y 1 ejecutan simultaacuteneamente

sus coacutedigos como todo el vector y estaacute almacenado en una uacutenica liacutenea de

memoria cacheacute cada vez que uno de los nuacutecleos ejecuta la liacutenea y[i] +=

f(ij) la liacutenea seraacute invalidada y la proacutexima vez que el otro nuacutecleo intente

ejecutar esta liacutenea deberaacute tomar la liacutenea otra vez de memoria principal Por

lo tanto si se realizan muchas (n) iteraciones podemos suponer que un gran

porcentaje de veces que se ejecuta y[i] += f(ij) se accederaacute a memoria

principal a pesar de que tanto el nuacutecleo 0 como el nuacutecleo 1 nunca acceden a

los elementos de y que le corresponden al otro nuacutecleo Esto es la llamada falsa

comparticioacuten17 puesto que el sistema se comporta como si los elementos de y

estuvieran siendo compartidos por los nuacutecleos

Hay que remarcar que la falsa comparticioacuten no causa resultados incorrectos

sino que puede arruinar el rendimiento de un programa porque puede ser que

acceda a la memoria principal muchas maacutes veces de lo necesario Podemos

mitigar este efecto utilizando almacenamiento temporal que sea local al flujo

(17)En ingleacutes false sharing

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 26: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 26 Introduccioacuten a la computacioacuten de altas prestaciones

o proceso y despueacutes copiando el almacenamiento temporal en el almacena-

miento compartido Tambieacuten se pueden aplicar altas teacutecnicas como por ejem-

plo padding

Actividad

Os proponemos que busqueacuteis informacioacuten sobre la teacutecnica de padding

23 Sistemas distribuidos

A pesar de que el modelo de computacioacuten de altas prestaciones es tradicional-

mente el que hemos visto en las arquitecturas paralelas en la uacuteltima deacutecada

se han desarrollado sistemas distribuidos que han aparecido como una fuente

viable para ciertas aplicaciones de computacioacuten de altas prestaciones como

son los sistemas grid

Los sistemasgrid proporcionan la infraestructura necesaria para trans-

formar redes de computadores distribuidos geograacuteficamente a traveacutes de

Internet en un sistema unificado de memoria distribuida

En general estos sistemas son muy heterogeacuteneos puesto que individualmente

los nodos que los componen pueden ser de diferentes tipos de hardware e in-

cluso de diferentes tipos de software Aun asiacute mediante una capa intermedia18

de software la infraestructura grid proporciona las interfaces y abstracciones

necesarias para trabajar con computadores distribuidos y de diferentes insti-

tuciones de manera transparente como si fuera un sistema convencional

(18)En ingleacutes middleware

Tambieacuten se han desarrollado otros tipos de sistemas altamente distribuidos

que inicialmente no estaban disentildeados para la computacioacuten de altas presta-

ciones como el peer-to-peer o el cloud computing

Ved tambieacuten

Los sistemas peer-to-peer ycloudcomputing justamentecon la computacioacuten en gridse trataraacuten en el cuarto moacute-dulo de esta asignatura y tam-bieacuten se trataraacute su relacioacuten conla computacioacuten de altas pres-taciones

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 27: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 27 Introduccioacuten a la computacioacuten de altas prestaciones

3 Programacioacuten de aplicaciones paralelas

La mayoriacutea de los programas que se han desarrollado para sistemas conven-

cionales con un uacutenico nuacutecleo no pueden explotar los muacuteltiples nuacutecleos de

los procesadores actuales Podemos ejecutar diferentes instancias de un pro-

grama por ejemplo dejando que el sistema operativo las planifique en los di-

ferentes procesadores pero normalmente esta solucioacuten no es suficiente espe-

cialmente en la computacioacuten de altas prestaciones donde se requiere parale-

lismo masivo Las principales soluciones son o bien reescribir los programas

o utilizar herramientas que paralelicen automaacuteticamente los programas Des-

graciadamente todaviacutea no se han podido encontrar soluciones aceptables pa-

ra esta segunda opcioacuten

La manera de escribir programas paralelos depende del modo como se quiera

dividir el trabajo Hay dos tipos principales paralelismo a nivel de tareas y

paralelismo a nivel de datos

En el paralelismoaniveldetareas el trabajo se reparte en varias tareas

que se distribuyen por los diferentes cores En el paralelismoanivelde

datos los datos se dividen para resolver el problema entre los diferen-

tes nuacutecleos que realizan operaciones similares sobre los datos que les

corresponden

Actualmente los programas paralelos maacutes potentes se escriben utilizando cons-

trucciones de paralelismo expliacutecito utilizando extensiones de lenguajes como

por ejemplo CC++ Estos programas incluyen instrucciones que son especiacute-

ficas para gestionar el paralelismo ndashpor ejemplo el nuacutecleo 0 ejecuta la tarea

0 el nuacutecleo 1 ejecuta la tarea 1 etcndash sincronizar todos los nuacutecleos etc y

por lo tanto los programas devienen muchas veces muy complejos Hay otras

opciones para escribir programas paralelos como por ejemplo utilizar lengua-

jes de maacutes alto nivel pero estos suelen sacrificar rendimiento para facilitar el

desarrollo y mejorar la productividad

Paralelismo a nivel dedatos

Un ejemplo de paralelismo anivel de datos es la compu-tacioacuten graacutefica o basada enGPU

Nos centraremos en los programas que son expliacutecitamente paralelos Los prin-

cipales modelos de programacioacuten son paso de mensajes o MPI19 flujos (por

ejemplo flujos POSIX o Pthreads) y OpenMP MPI y Pthreads son libreriacuteas con

definiciones de tipos funciones y macros que se pueden utilizar por ejemplo

en programas escritos en C OpenMP consiste en una libreriacutea y tambieacuten ciertas

modificaciones del compilador por ejemplo de C Adicionalmente tambieacuten

trataremos otros modelos de programacioacuten como los de computacioacuten graacutefica

u otros que proporcionan abstracciones maacutes modernas

(19)Del ingleacutes message passing inter-face

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 28: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 28 Introduccioacuten a la computacioacuten de altas prestaciones

Estos modelos de programacioacuten dan respuesta a los dos tipos principales de

sistemas paralelos sistemas de memoria compartida y sistemas de memoria

distribuida En un sistema de memoria compartida los nuacutecleos pueden com-

partir el acceso a la memoria por lo que hay que coordinar el acceso de los

diferentes nuacutecleos a memoria teniendo que examinar y actualizar el espacio

compartido de la memoria En un sistema de memoria distribuida cada nuacutecleo

tiene su propio espacio de memoria privado y los nuacutecleos se deben comunicar

expliacutecitamente haciendo paso de mensajes por la red de interconexioacuten Pth-

reads y OpenMP se disentildearon para programar sistemas de memoria compar-

tida y proporcionan mecanismos para acceder a posiciones de memoria com-

partida En cambio MPI se disentildeoacute para programar sistemas de memoria dis-

tribuida y proporciona mecanismos para paso de mensajes

31 Modelos de programacioacuten de memoria compartida

311 Programacioacuten con flujos

A pesar de que se pueden considerar diferentes tipos de flujos para programar

programas paralelos como por ejemplo flujos propios de UNIX o de Java nos

centraremos en los Pthreads que son una libreriacutea que cumple los estaacutendares

POSIX y que nos permiten trabajar con diferentes flujos al mismo tiempo (con-

currentemente) Pthreads son maacutes efectivos en un sistema multiprocesador o

en un sistema multinuacutecleo donde el flujo de ejecucioacuten se puede planificar en

otro procesador o nuacutecleo con lo que se gana velocidad debido al paralelismo

Los Pthreads tienen menos sobrecoste que el fork o creacioacuten de un nuevo pro-

ceso porque el sistema no inicializa un nuevo espacio de memoria virtual y en-

torno para el proceso A pesar de que son maacutes efectivos en sistemas con muacutel-

tiples procesadores o nuacutecleos tambieacuten se puede obtener beneficio en un sis-

tema uniprocesador puesto que permite explotar la latencia de la entradasa-

lida y otras funciones del sistema que pueden parar la ejecucioacuten del proceso

en ejecucioacuten Los Pthreads se utilizan en sistemas de memoria compartida y

todos los flujos de un proceso comparten el mismo espacio de direcciones

Para crear un flujo hay que definir una funcioacuten y sus argumentos que seraacuten

utilizados por el flujo El objetivo principal de utilizar Pthreads es conseguir

maacutes velocidad (mejor rendimiento)

El siguiente coacutedigo muestra un ejemplo donde se puede apreciar coacutemo crear

dos flujos (cada uno con diferentes paraacutemetros) y esperar su finalizacioacuten

include ltstdiohgt

include ltstdlibhgt

include ltpthreadhgt

void print_message_function( void ptr )

main()

pthread_t thread1 thread2

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 29: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 29 Introduccioacuten a la computacioacuten de altas prestaciones

char message1 = Thread 1

char message2 = Thread 2

int iret1 iret2

Crea flujos independientes que ejecutaraacuten la funcioacuten

iret1 = pthread_create( ampthread1 NULL print_message_function (void) message1)

iret2 = pthread_create( ampthread2 NULL print_message_function (void) message2)

Espera a que todos los flujos acaben antes de continuar con el programa principal

pthread_join( thread1 NULL)

pthread_join( thread2 NULL)

printf(Thread 1 returns dniret1)

printf(Thread 2 returns dniret2)

exit(0)

void print_message_function( void ptr )

char message

message = (char ) ptr

printf(s n message)

Uno de los elementos clave en la gestioacuten de flujos Pthread es su sincronizacioacuten

y exclusioacuten mutua que habitualmente se lleva a cabo mediante semaacuteforos

312 OpenMP

A pesar de que tanto Pthreads como OpenMP son interfaces de programacioacuten

para memoria compartida tienen muchas diferencias importantes Con Pth-

reads se requiere que el programador especifique expliacutecitamente el compor-

tamiento de cada flujo Por otro lado OpenMP permite que el programador

solo tenga que especificar que un bloque de coacutedigo se ejecute en paralelo y

determinar las tareas y queacute flujo las ejecutaraacute se deja en manos del compilador

y del sistema de ejecucioacuten20 Esto sugiere otra diferencia importante con Pth-

reads mientras que Pthreads es una libreriacutea de funciones que se puede antildeadir

al montar un programa en C OpenMP necesita soporte a nivel de compilador

y por lo tanto no necesariamente todos los compiladores de C han de com-

pilar programas OpenMP como programas paralelos Por lo tanto podemos

decir que OpenMP permite mejorar la productividad mediante una interfaz de

maacutes alto nivel que la de Pthreads pero por otro lado no nos permite controlar

ciertos detalles relacionados con el comportamiento de los flujos

OpenMP fue concebido por un grupo de programadores y cientiacuteficos informaacute-

ticos que pensaban que escribir programas de altas prestaciones a gran esca-

la utilizando interfaces como la de Pthreads era demasiado difiacutecil De hecho

OpenMP se disentildeoacute expliacutecitamente para permitir a los programadores paraleli-

zar programas secuenciales existentes progresivamente y no tener que volver

a escribirlos desde cero

(20)En ingleacutes runtime

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 30: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 30 Introduccioacuten a la computacioacuten de altas prestaciones

OpenMP proporciona una interfaz de memoria compartida basada en las lla-

madas ldquodirectivasrdquo Por ejemplo en CC++ esto quiere decir que hay ciertas

instrucciones especiales para el preprocesador denominadas pragmes Normal-

mente se antildeaden pragmes en un programa para especificar comportamientos

que no son parte de la propia especificacioacuten del lenguaje de programacioacuten

Esto significa que los compiladores que no entienden estos pragmes los pueden

ignorar lo que permite que un programa pueda ejecutarse en un sistema que

no los soporta

Los pragmes en CC++ empiezan por pragma al igual que otras directivas de

procesamiento A continuacioacuten se muestra un programa OpenMP muy senci-

llo que implementa el tiacutepico ldquohello worldrdquo En este podemos apreciar la uti-

lizacioacuten de una directiva (o pragma) de OpenMP y tambieacuten algunas funciones

tiacutepicas asociadas a OpenMP

include ltstdiohgt

include ltstdlibhgt

include ltomphgt

void Hello(void)

int main(int argc char argv[])

Obtener el nuacutemero de flujos del inteacuterprete de oacuterdenes

int thread_count = strtol(argv[1] NULL 10)

pragma omp parallel num_threads(thread_count)

Hello()

return 0

void Hello(void(

int my_rank = omp_get_thread_num()

int thread_count = omp_get_num_threads()

printf(Hello from thread d of dn my_rank thread_count)

313 CUDA y OpenCL

CUDA21 es una especificacioacuten inicialmente de propiedad desarrollada por Nvi-

dia como plataforma para sus productos de computacioacuten graacutefica (GPU) CUDA

incluye las especificaciones de la arquitectura y un modelo de programacioacuten

asociado

(21)Del ingleacutes compute unified devicearchitecture

CUDA se desarrolloacute para aumentar la productividad en el desarrollo de aplica-

ciones de propoacutesito general para computacioacuten graacutefica Desde el punto de vis-

ta del programador el sistema estaacute compuesto por un procesador principal22

que es una CPU tradicional como por ejemplo un procesador de arquitectura

Intel y por uno o maacutes dispositivos23 que son GPU

(22)En ingleacutes host

(23)En ingleacutes devices

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 31: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 31 Introduccioacuten a la computacioacuten de altas prestaciones

CUDA pertenece al modelo SIMD por lo tanto estaacute pensado para explotar el

paralelismo a nivel de datos Esto quiere decir que un conjunto de operaciones

aritmeacuteticas se pueden ejecutar sobre un conjunto de datos de manera simultaacute-

nea Afortunadamente muchas aplicaciones tienen partes con un nivel muy

elevado de paralelismo a nivel de datos

Un programa en CUDA consiste en una o maacutes fases que pueden ser ejecutadas o

bien en el procesador principal (CPU) o bien en el dispositivo GPU Las fases en

las que hay muy poco o nada de paralelismo a nivel de datos se implementan

en el coacutedigo que se ejecutaraacute en el procesador principal y las fases con un

nivel de paralelismo a nivel de datos elevado se implementan en el coacutedigo que

se ejecutaraacute al dispositivo

Los elementos fundamentales de CUDA son

a)Modelodememoria Es importante remarcar que la memoria del procesa-

dor principal y del dispositivo son espacios de memoria completamente sepa-

rados Esto refleja la realidad de que los dispositivos son tiacutepicamente tarjetas

que tienen su propia memoria DRAM Para ejecutar un kernel en el dispositivo

GPU normalmente hay que seguir los pasos siguientes

bull Reservar memoria en el dispositivo

bull Transferir los datos necesarios desde el procesador principal al espacio de

memoria asignado al dispositivo

bull Invocar la ejecucioacuten del kernel en cuestioacuten

bull Transferir los datos con los resultados desde el dispositivo hacia el proce-

sador principal

bull Liberar la memoria del dispositivo (si ya no es necesaria) una vez finali-

zada la ejecucioacuten del kernel

b)Organizacioacutendeflujos En CUDA un kernel se ejecuta mediante un con-

junto de flujos (por ejemplo un vector o una matriz de flujos) Como todos

los flujos ejecutan el mismo kernel (modelo SIMT) se necesita un mecanismo

que permita diferenciarlos y asiacute poder asignar la parte correspondiente de los

datos a cada flujo de ejecucioacuten CUDA incorpora palabras clave para hacer re-

ferencia al iacutendice de un flujo

c)Kernels El coacutedigo que se ejecuta en el dispositivo (kernel) es la funcioacuten que

ejecutan los diferentes flujos durante la fase paralela cada uno en el rango de

datos que le corresponde Cabe sentildealar que CUDA sigue el modelo SPMD24 y

por lo tanto todos los flujos ejecutan el mismo coacutedigo

A continuacioacuten se muestra la funcioacuten o kernel de la suma de matrices y su

llamada

__global__ matrix_add_gpu (fload A float B float C int N)

(24)Del ingleacutes single program multi-ple data

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 32: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 32 Introduccioacuten a la computacioacuten de altas prestaciones

int i = blockIdxx blockDimx + threadIdxx

int j = blockIdxy blockDimy + threadIdxy

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

int main()

dim3 dimBlock(blocksize blocksize)

dim3 dimGrid(NdimBlockx NdimBlocky)

matrix_add_gpultltltdimGrid dimBlockgtgtgt(a b c N)

OpenCL es una interfaz estaacutendar abierta libre y multiplataforma para la pro-

gramacioacuten paralela La principal motivacioacuten para el desarrollo de OpenCL fue

la necesidad de simplificar la tarea de programacioacuten portable y eficiente de

la creciente cantidad de plataformas heterogeacuteneas como por ejemplo CPU

multinuacutecleo GPU o incluso sistemas empotrados OpenCL fue concebida por

Apple a pesar de que la acaboacute desarrollando el grupo Khronos que es el mis-

mo que impulsoacute OpenGL y es su responsable

OpenCL consiste en tres partes la especificacioacuten de un lenguaje multiplata-

forma una interfaz a escala de entorno de computacioacuten y una interfaz para

coordinar la computacioacuten paralela entre procesadores heterogeacuteneos OpenCL

utiliza un subconjunto de C99 con extensiones para el paralelismo y utiliza

el estaacutendar de representacioacuten numeacuterica IEEE 754 para garantizar la interope-

rabilidad entre plataformas

Hay muchas similitudes entre OpenCL y CUDA a pesar de que OpenCL tiene

un modelo de gestioacuten de recursos maacutes complejo puesto que soporta muacuteltiples

plataformas y portabilidad entre diferentes fabricantes OpenCL soporta mo-

delos de paralelismo tanto a nivel de datos como nivel de tareas

Del mismo modo que en CUDA un programa en OpenCL estaacute formado por

dos partes los kernels que se ejecutan en uno o maacutes dispositivos y un programa

en el procesador principal que invoca y controla la ejecucioacuten de los kernels

Cuando se efectuacutea la invocacioacuten de un kernel el coacutedigo se ejecuta en tareas

elementales25 que corresponden a los flujos de CUDA Las tareas elementales

y los datos asociados a cada tarea elemental se definen a partir del rango de

un espacio de iacutendices de dimensioacuten N26 Las tareas elementales forman grupos

de tareas27 que corresponden a los bloques de CUDA Las tareas elementales

tienen un identificador global que es uacutenico Ademaacutes los grupos de tareas ele-

mentales se identifican dentro del rango de dimensioacuten N y para cada grupo

cada una de las tareas elementales tiene un identificador local que iraacute desde 0

(25)En ingleacutes work items

(26)En ingleacutes ND ranges

(27)En ingleacutes work groups

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 33: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 33 Introduccioacuten a la computacioacuten de altas prestaciones

hasta la medida del grupo-1 Por lo tanto la combinacioacuten del identificador del

grupo y del identificador local dentro del grupo tambieacuten identifica de manera

uacutenica una tarea elemental

OpenCL tambieacuten tiene su propio modelo de memoria y de gestioacuten de kernels

y de dispositivos A continuacioacuten se muestra la funcioacuten o kernel de la suma

de matrices en OpenCL

__kernel void matrix_add_opencl ( __global const float A

__global const float B

__global float C

int N)

int i = get_global_id(0)

int j = get_global_id(1)

int index = i + jN

if (iltN ampamp jltN)

C[index] = A[index] + B[index]

32 Modelos de programacioacuten de memoria distribuida

321 MPI

MPI es una libreriacutea de paso de mensajes Se puede utilizar baacutesicamente

en programas C o Fortran desde los cuales se hacen llamadas a funcio-

nes de MPI para la gestioacuten de procesos y para comunicar los procesos

entre siacute

MPI no es la uacutenica libreriacutea disponible de paso de mensajes pero puede con-

siderarse el estaacutendar actual para el paradigma de memoria distribuida Ante-

riormente a MPI hubo otros modelos como por ejemplo PVM28 pero MPI se

acaboacute imponiendo

Esta especificacioacuten fue desarrollada por el MPI Forum una agrupacioacuten de uni-

versidades y empresas que especificaron las funciones que deberiacutea tener una

libreriacutea de paso de mensajes A partir de la especificacioacuten los diferentes fabri-

cantes de multicomputadores incluyeron implementaciones de MPI especiacutefi-

cas para sus equipos y aparecieron varias implementaciones libres de que las

maacutes extendidas son MPICH y OpenMPI (que es una distribucioacuten de coacutedigo

libre de MPI2)

(28)Del ingleacutes parallel virtual machi-ne

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 34: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 34 Introduccioacuten a la computacioacuten de altas prestaciones

Resumiendo MPI ha conseguido una serie de hitos entre los que podemos

encontrar los siguientes

bull Estandarizacioacuten Las implementaciones de la especificacioacuten han hecho

que se convirtiera en el estaacutendar de paso de mensajes y que no sea nece-

sario desarrollar programas diferentes para maacutequinas diferentes

bull Portabilidad Los programas MPI funcionan sobre multiprocesadores de

memoria compartida multicomputadores de memoria distribuida cluacuteste-

res de computadores sistemas heterogeacuteneos etc siempre que haya una

versioacuten de MPI para ellos

bull Altasprestaciones Los fabricantes han desarrollado implementaciones

eficientes para sus equipos

bull Ampliafuncionalidad MPI incluye gran cantidad de funciones para lle-

var a cabo de manera sencilla las operaciones que suelen aparecer en pro-

gramas de paso de mensajes

Cuando se pone en marcha un programa MPI se crean varios procesos ejecu-

tando el mismo coacutedigo cada uno con sus propias variables (modelo SPMD) A

diferencia de OpenMP no hay un proceso maestro que controla al resto (como

en OpenMP)

A continuacioacuten se muestra un programa que implementa el ldquohello worldrdquo en

MPI

include ltstdiohgt

include ltmpihgt

int main ( int argc char argv[])

int rank size

MPI_Init (ampargc ampargv) starts MPI

MPI_Comm_rank (MPI_COMM_WORLD amprank) Obtiene el identificador del proceso

MPI_Comm_size (MPI_COMM_WORLD ampsize) Obtiene el nuacutemero de procesos

printf( Hello world from process d of dn rank size )

MPI_Finalize()

return 0

A pesar de que se trata de un coacutedigo muy simple se pueden observar algunos

componentes esenciales de MPI

bull Hay que incluir la libreriacutea de MPI (mpih)

bull Todos los procesos ejecutan el mismo coacutedigo desde el principio con lo

que todos tienen variables myrank y size A diferencia de OpenMP estas

Altas prestaciones

IBM por ejemplo tiene supropia libreriacutea de MPI para sussistemas BlueGene

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 35: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 35 Introduccioacuten a la computacioacuten de altas prestaciones

variables son diferentes y pueden estar en memorias diferentes en proce-

sadores distintos

bull Los procesos trabajan de manera independiente hasta que se inicializa MPI

con la funcioacuten MPI_Init A partir de este punto los procesos pueden

colaborar intercambiando datos sincronizaacutendose etc

bull La funcioacuten MPI_Finalize se llama cuando ya no es necesario que los

procesos colaboren entre siacute Esta funcioacuten libera todos los recursos reserva-

dos por MPI

bull Las funciones MPI tienen la forma MPI_Nombre(paraacutemetros) De la mis-

ma manera que en OpenMP es necesario que los procesos sepan su iden-

tificador (entre 0 y el nuacutemero de procesos menos 1) y el nuacutemero de pro-

cesos que se han puesto en marcha Las funciones MPI_Comm_rank y

MPI_Comm_size se utilizan para conseguir esto

bull Vemos que estas funciones tienen un paraacutemetro MPI_COMM_WORLD que es

una constante MPI y que identifica el comunicador al que estaacuten asociados

todos los procesos Un comunicador es un identificador de un grupo de

procesos y las funciones MPI han de identificar en queacute comunicador se

estaacuten realizando las operaciones que se llaman

Tal y como veremos en otro moacutedulo de esta asignatura MPI ofrece una am-

plia interfaz donde podemos encontrar operaciones tanto punto a punto (por

ejemplo para enviar una fecha de un proceso a otro) como colectivas (por

ejemplo para sincronizar todos los procesos en un punto concreto o reducir

un conjunto de datos que estaacuten distribuidos entre los diferentes procesos del

programa MPI)

322 PGAS

Muchos programadores encuentran los modelos de programacioacuten de memo-

ria compartida mucho maacutes atractivos y praacutecticos que los de paso de mensa-

jes Para dar respuesta a esto diferentes grupos estaacuten desarrollando lenguajes

de programacioacuten paralela que permiten utilizar algunas teacutecnicas de memoria

compartida para programar sistemas que realmente son de memoria distribui-

da Esto no es tan simple como parece puesto que si por ejemplo escribimos

un compilador que gestione un conjunto de memorias distribuidas como si

fueran una compartida nuestros programas tendriacutean un rendimiento extraor-

dinariamente bajo y difiacutecil de predecir ya que no estaacute claro cuaacutendo se accede

a la memoria local o distribuida Acceder a la memoria de otro nodo puede ser

centenares o incluso miles de veces maacutes lento que acceder a la memoria local

Ved tambieacuten

La interfaz de MPI se trata enel tercer moacutedulo de esta asig-natura

Los lenguajes PGAS29 proporcionan algunos de los mecanismos de los progra-

mas de memoria compartida pero tambieacuten proporcionan herramientas al pro-

gramador para poder controlar la localidad de los datos dentro del espacio

(29)Del ingleacutes partitioned global ad-dress space

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 36: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 36 Introduccioacuten a la computacioacuten de altas prestaciones

(abstracto) de memoria compartida Las variables privadas se alojan en la me-

moria local del nuacutecleo en el que el proceso se estaacute ejecutando y el programador

puede controlar la distribucioacuten de los datos en estructuras de datos comparti-

dos De este modo por ejemplo el programador puede saber queacute elementos

de un vector compartido estaacuten en la memoria local de cada proceso

Hay varias implementaciones de lenguajes PGAS las maacutes importantes de las

cuales son UPC30 Co-Array Fortran y Titanium que extienden C Fortran y

Java respectivamente

33 Modelos de programacioacuten hiacutebridos

Los modelos de programacioacuten vistos anteriormente como OpenMP y MPI

dan soluciones concretas a sistemas de memoria compartida y distribuida res-

pectivamente En cambio los actuales sistemas de altas prestaciones combinan

sistemas de memoria distribuida (baacutesicamente cluacutesteres) con sistemas de me-

moria compartida (procesadores o incluso multiprocesadores multinuacutecleo)

Asiacute pues tambieacuten se utilizan modelos de programacioacuten hiacutebridos como por

ejemplo MPI+OpenMP para aplicaciones que tienen maacutes de un nivel de para-

lelismo (multinivel) A pesar de que hay diferentes maneras de combinar dos

tipos de modelos de programacioacuten en estos casos se suele utilizar MPI para

los bucles maacutes exteriores y OpenMP para los bucles internos aprovechando

asiacute la localidad de los datos

A continuacioacuten se muestra un programa hiacutebrido MPI+OpenMP muy sencillo

que implementa una versioacuten del ldquohello worldrdquo visto anteriormente En este

ejemplo no hay realmente paso de mensaje pero ilustra el modo de consultar

maacutes de un nivel de paralelismo

include ltstdiohgt

include mpih

include ltomphgt

int main(int argc char argv[])

int numprocs rank namelen

char processor_name[MPI_MAX_PROCESSOR_NAME]

int iam = 0 np = 1

MPI_Init(ampargc ampargv)

MPI_Comm_size(MPI_COMM_WORLD ampnumprocs)

MPI_Comm_rank(MPI_COMM_WORLD amprank)

MPI_Get_processor_name(processor_name ampnamelen)

pragma omp parallel default(shared) private(iam np)

np = omp_get_num_threads()

iam = omp_get_thread_num()

printf(Hello from thread d out of d from process d out of d on sn

iam np rank numprocs processor_name)

(30)Del ingleacutes unified parallel C

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 37: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 37 Introduccioacuten a la computacioacuten de altas prestaciones

MPI_Finalize()

Otra motivacioacuten de los modelos de programacioacuten hiacutebridos es que los diferen-

tes modelos de programacioacuten tienen sus ventajas e inconvenientes y la com-

binacioacuten de maacutes de un modelo de programacioacuten puede aprovechar sus venta-

jas y dejar de lado sus inconvenientes Podemos comparar diferentes aspectos

de MPI y OpenMp los dos paradigmas maacutes habituales

bull Granodeparalelismo OpenMP es maacutes apropiado para paralelismo de

grano maacutes fino es decir cuando hay poca computacioacuten entre sincroniza-

ciones entre procesos

bull Arquitecturadeejecucioacuten OpenMP funciona bien en sistemas de me-

moria compartida pero en sistemas distribuidos es preferible MPI

bull Dificultaddeprogramacioacuten En general los programas OpenMP son maacutes

parecidos a los secuenciales que los MPI y es maacutes faacutecil desarrollar progra-

mas OpenMP

bull Herramientasdedepuracioacuten Se dispone de maacutes herramientas de desa-

rrollo depuracioacuten autoparalelizacioacuten etc para memoria compartida que

para paso de mensajes

bull Creacioacutendeprocesos En OpenMP los flujos se crean dinaacutemicamente

mientras que en MPI los procesos se crean estaacuteticamente a pesar de que

algunas versiones de MPI permiten la gestioacuten dinaacutemica

bull Usodelamemoria El acceso a la memoria es maacutes sencillo con OpenMP

por el hecho de utilizar memoria compartida Aun asiacute la localizacioacuten de los

datos en la memoria y el acceso simultaacuteneo puede reducir el rendimiento

La utilizacioacuten de memorias locales con MPI puede producir en accesos maacutes

raacutepidos

Asiacute pues algunas de las ventajas de la programacioacuten hiacutebrida son

bull Puede ayudar a mejorar la escalabilidad y a mejorar el balanceo de las ta-

reas

bull Se puede utilizar en aplicaciones que combinan paralelismo de grano fino

y grueso o que mezclan paralelismo funcional y de datos

bull Puede utilizarse para reducir el coste de desarrollo por ejemplo si se tienen

funciones que utilizan OpenMP y se utilizan dentro de programas MPI

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 38: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 38 Introduccioacuten a la computacioacuten de altas prestaciones

Aun asiacute tambieacuten hay que tener en cuenta que utilizar dos paradigmas de ma-

nera hiacutebrida puede complicar su programacioacuten

Finalmente los modelos hiacutebridos tambieacuten son una solucioacuten para determina-

das funcionalidades que no se suelen dar con un uacutenico modelo de programa-

cioacuten Un ejemplo de ello es el modelo de programacioacuten MPI+CUDA Mientras

que CUDA permite aprovechar el gran potencial de coacutemputo de los procesa-

dores graacuteficos MPI permite distribuir las tareas en varios nodos y asiacute poder usar

simultaacuteneamente maacutes aceleradores graacuteficos de los que puede tener un uacutenico

nodo fiacutesicamente

Ved tambieacuten

En el tercer moacutedulo se trataraacutenlos diferentes modelos de pro-gramacioacuten brevemente intro-ducidos en este subapartado

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 39: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 39 Introduccioacuten a la computacioacuten de altas prestaciones

4 Rendimiento de aplicaciones paralelas

Cuando escribimos programas paralelos normalmente podremos apreciar una

mejora en el rendimiento puesto que en muchos casos se puede sacar prove-

cho de disponer de maacutes nuacutecleos En cambio escribir un programa paralelo es

un arte pues hay muchas formas de hacerlo ya que no hay una norma gene-

ral Asiacute pues hay que saber queacute es lo que podemos esperar de nuestra imple-

mentacioacuten y necesitaremos poder evaluarla para saber si se puede mejorar su

rendimiento y coacutemo hacerlo A continuacioacuten veremos las principales meacutetricas

utilizadas para determinar el rendimiento de un programa paralelo veremos

los principales estaacutendares en relacioacuten con la computacioacuten de altas prestaciones

y comprobaremos que existen herramientas muy convenientes que permiten

analizar el rendimiento de nuestras aplicaciones de tal modo que podemos

mejorar nuestra productividad al desarrollar programas paralelos

41 Speedup y eficiencia

Normalmente el mejor modo de escribir nuestros programas paralelos es divi-

diendo el trabajo entre los diferentes nuacutecleos a partes iguales a la vez que no

se introduce ninguacuten trabajo adicional para los nuacutecleos Si realmente podemos

conseguir ejecutar el programa en p nuacutecleos mediante un flujo o proceso en

cada uno de los nuacutecleos entonces nuestro programa paralelo iraacute p veces maacutes

raacutepido que el programa secuencial Si denominamos el tiempo de ejecucioacuten

secuencial Tseq y el tiempo de ejecucioacuten de nuestro programa paralelo Tpar

entonces el liacutemite que podemos esperar es Tpar = Tseqp Cuando esto sucede

decimos que el programa paralelo tiene speedup lineal

En la praacutectica es muy difiacutecil poder obtener speedup lineal porque solo por el

hecho de utilizar muacuteltiples procesosflujos se antildeade un sobrecoste31

Por ejemplo en programas con memoria compartida hay que antildeadir mecanismos deexclusioacuten mutua como por ejemplo semaacuteforos y en programas de memoria distribuidaen alguacuten momento habraacute que transmitir datos por la red para implementar el paso demensajes Ademaacutes hay que tener en cuenta que los costes adicionales aumentaraacuten amedida que se incremente el nuacutemero de procesos o flujos

Asiacute pues si definimos el speedup de un programa paralelo de la siguiente forma

entonces el speedup lineal tiene S = p que no es nada habitual Ademaacutes a

medida que p aumente hemos de esperar que S sea una fraccioacuten cada vez maacutes

pequentildea del speedup lineal p que es el ideal Otra manera de verlo es que S

p seraacute probablemente cada vez maacutes pequentildeo puesto que p aumenta La tabla

(31)En ingleacutes overhead

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 40: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 40 Introduccioacuten a la computacioacuten de altas prestaciones

4 muestra un ejemplo de coacutemo S y S p cambian a medida que p aumenta

Este valor S p se denomina eficiencia del programa paralelo Si sustituimos la

foacutermula por S vemos que la eficiencia es

Tabla 4 Speedups y eficiencias de un programa paralelo

p 1 2 4 8 16

S 10 19 36 65 108

E = Sp 10 095 090 081 068

Es evidente que Tpar S y E dependen del nuacutemero de procesos o flujos (p) Tam-

bieacuten hay que tener presente que Tpar S E y Tseq dependen del tamantildeo del pro-

blema

Por ejemplo si ejecutamos la aplicacioacuten con la que se obtuvo la tabla 4 pero con la mitady el doble del tamantildeo del problema podriacuteamos obtener los speedups y las eficiencias quese muestran en las figuras 15 y 16 respectivamente

Figura 15 Speedups del programa paralelo con diferente tamantildeo del problema

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 41: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 41 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 16 Eficiencias del programa paralelo con diferente tamantildeo del problema

Tal como vemos en este ejemplo cuando el tamantildeo del problema es maacutes gran-

de los speedups y las eficiencias aumentan mientras que disminuyen cuando

el tamantildeo del problema es maacutes pequentildeo Este comportamiento es muy habi-

tual

Muchos programas paralelos se desarrollan dividiendo el trabajo de la versioacuten

secuencial entre los diferentes procesosflujos y antildeadiendo el sobrecoste nece-

sario para manejar el paralelismo como por ejemplo por la exclusioacuten mutua

o por las comunicaciones Asiacute pues si denominamos este sobrecoste del para-

lelismo Toverhead tenemos que

Tambieacuten hay que tener en cuenta que habitualmente a medida que el tamantildeo

del problema aumenta Toverhead aumenta maacutes lentamente que Tseq Si esto su-

cede tanto el speedup como la eficiencia aumentaraacuten En otras palabras si hay

maacutes trabajo para realizar por parte de los diferentes procesosflujos la propor-

cioacuten de tiempo destinada a coordinar las tareas seraacute inferior a si el tamantildeo del

problema es maacutes pequentildeo

42 Ley de Amdahl

La ley de Amdahl (Gene Amdahl 1967) dice que a no ser que un pro-

grama secuencial pudiera ser completamente paralelizado el speedup

que se obtendriacutea seraacute muy limitado independientemente del nuacutemero

de nuacutecleos disponibles

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 42: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 42 Introduccioacuten a la computacioacuten de altas prestaciones

Supongamos que hemos podido paralelizar el 90 del coacutedigo del programa

secuencial y que ademaacutes lo hemos paralelizado perfectamente Seguacuten la ley

de Amdahl independientemente del nuacutemero de nuacutecleos p que utilicemos el

speedup de esta parte del programa seraacute p Si la parte secuencial de la ejecucioacuten

es Tseq = 20 segons el tiempo de ejecucioacuten de la parte paralela seraacute 09 times Tseqp

= 18p y el tiempo de ejecucioacuten de la parte no paralela seraacute 01 times Tseq = 2 El

tiempo de ejecucioacuten de la parte paralela seraacute

y el speedup seraacute

Si el nuacutemero de nuacutecleos p se hiciera maacutes y maacutes grande (p rarr infin) entonces 09

times Tseqp = 18p tenderiacutea a 0 y por lo tanto el tiempo de ejecucioacuten total no

podriacutea ser maacutes pequentildeo que 01 times Tseq = 2 Por lo tanto el speedup deberiacutea ser

maacutes pequentildeo que

Esto quiere decir que aunque hagamos una paralelizacioacuten perfecta del 90

del programa nunca podriacuteamos obtener un speedup mejor que 10 aunque

dispusieacuteramos de millones de nuacutecleos

De modo general si una fraccioacuten r del programa secuencial no se puede para-

lelizar entonces la ley de Amdahl dice que no podremos obtener un speedup

mejor que 1r La aplicacioacuten de la ley de Amdahl puede parecer muy pesimista

pero tambieacuten existe la ley de Gustafson que considera que la parte no parale-

la de un programa decrece cuando el tamantildeo del problema aumenta Por lo

tanto seguacuten la ley de Gustafson cualquier problema suficientemente grande

puede ser paralelizado eficientemente y el speedup pasa a ser

43 Escalabilidad

De modo general podemos decir que una tecnologiacutea es escalable si es

capaz de manejar un problema de tamantildeo creciente Maacutes formalmente

decimos que un programa es escalable si la eficiencia se mantiene cons-

tante independientemente de si el tamantildeo del problema aumenta

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 43: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 43 Introduccioacuten a la computacioacuten de altas prestaciones

Hay dos nociones comunes de la escalabilidad La primera es el escalado fuerte

en el que si se incrementa el nuacutemero de procesosflujos se puede conservar la

eficiencia sin la necesidad de incrementar el tamantildeo del problema El segundo

es el escalado deacutebil en el que si queremos conservar la eficiencia fija hay

que incrementar el tamantildeo del problema del mismo modo que se aumenta el

nuacutemero de procesosflujos

44 Anaacutelisis de rendimiento de aplicaciones paralelas

En el momento de programar nuestras aplicaciones paralelas podemos seguir

algunos estaacutendares generales o seguir procedimientos de buenas praacutecticas pe-

ro es difiacutecil saber si nuestra aplicacioacuten podraacute cumplir los requisitos de rendi-

miento que deseamos En el caso de querer mejorar el rendimiento de nues-

tra aplicacioacuten o simplemente si obtenemos un rendimiento que consideramos

pobre por la propia experiencia es muy difiacutecil poder identificar la fuente del

problema y encontrar solucioacuten sin analizarla detenidamente

En general el anaacutelisis y la optimizacioacuten de rendimiento de aplicaciones para-

lelas es un proceso ciacuteclico tal y como muestra la figura siguiente

bull La fase de instrumentacioacuten y monitorizacioacuten consiste en antildeadir a la apli-

cacioacuten una cierta informacioacuten de instrumentacioacuten que permite recopilar

informacioacuten respecto al comportamiento de la aplicacioacuten (por ejemplo

nuacutemero de fallos en la memoria cacheacute de nivel 2)

bull La fase de anaacutelisis consiste en inspeccionar la informacioacuten recopilada en

la fase anterior para encontrar problemas de rendimiento deducir las po-

sibles causas y determinar soluciones

bull La fase de refinamiento consiste en aplicar los cambios oportunos al coacutedigo

de la aplicacioacuten para poder corregir los posibles problemas de rendimiento

identificados

Figura 17 Proceso ciacuteclico de mejora del rendimiento

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 44: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 44 Introduccioacuten a la computacioacuten de altas prestaciones

Para analizar el rendimiento de aplicaciones paralelas se pueden utilizar dife-

rentes mecanismos unos maacutes simples y otros maacutes complejos maacutes generales y

maacutes precisos tal y como veremos en los siguientes subapartados Hay que re-

marcar que la utilizacioacuten de estos mecanismos no es siempre igual para todos

los casos y el anaacutelisis de rendimiento de aplicaciones paralelas normalmente

deviene un arte y se aprende mediante la experimentacioacuten

441 Medidas de tiempos

Esta es la manera maacutes simple y tradicional de instrumentacioacuten y monitoriza-

cioacuten de aplicaciones pero en ciertas ocasiones puede ser muy eficaz y raacutepi-

da De hecho hay varias razones para tomar medidas de tiempos como por

ejemplo para determinar si el programa que se estaacute desarrollando se comporta

como lo deberiacutea hacer o una vez el programa ya estaacute desarrollado poder de-

terminar hasta queacute punto es bueno su rendimiento

Hay que tener en cuenta que no siempre seraacute importante conocer el tiempo de

ejecucioacuten de toda la aplicacioacuten sino que seraacute maacutes importante medir el tiempo

de ejecucioacuten de ciertas partes del programa Debido a esto normalmente no se

podraacute utilizar la llamada time tiacutepica del inteacuterprete de oacuterdenes de Unix la cual

devuelve el tiempo de ejecucioacuten del programa desde el principio hasta el final

Tambieacuten hay que tener presente que no siempre nos interesaraacute saber el tiempo

de procesador que es el que devuelve la funcioacuten estaacutendar de C clock De

hecho se trata del tiempo total que el programa pasa ejecutando coacutedigo del

programa Esto puede ser un problema puesto que no incluye el tiempo que

el programa estaacute parado

Por lo tanto para tomar medidas de programas paralelos como normal gene-

ral habraacute que tener en cuenta el tiempo total de ejecucioacuten32 A continuacioacuten se

muestra un coacutedigo sencillo para medir el tiempo de ejecucioacuten de un programa

Double start finish

start = get_current_time()

Coacutedigo que queremos medir

finish = get_current_time()

printf(Tiempo transcurrido = e segundosn finish-start)

Programa en espera

Un ejemplo de esto es cuan-do un programa de memoriadistribuida estaacute esperando aque le llegue un mensaje des-de otro nodo

(32)Tambieacuten conocido como wallclock

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 45: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 45 Introduccioacuten a la computacioacuten de altas prestaciones

En este ejemplo la funcioacuten get_current_time() es una hipoteacutetica funcioacuten

que devuelve los segundos que han transcurrido desde un instante de tiempo

prefijado del pasado La funcioacuten concreta que deberemos utilizar dependeraacute

de la interfaz de programacioacuten

Hay una cuestioacuten muy importante que se debe tener en cuenta a la hora de to-

mar medidas de tiempos la resolucioacuten de las funciones de medida de tiempo

Siempre seraacute necesario que la resolucioacuten que es el intervalo de tiempo entre

dos medidas sea menor a la medida que queremos tomar puesto que si no

obtendremos una medida de 0

Finalmente cabe destacar que cuando se toman medidas de tiempos se pue-

den obtener diferentes valores en diferentes ejecuciones Por tanto habraacute que

tener en cuenta esta posible variabilidad de las medidas y cuando se realicen

estudios a partir de medidas de tiempos utilizar valores estadiacutesticos como por

ejemplo el valor medio obtenido de varias ejecuciones Tambieacuten hay que tener

en cuenta que nos podemos encontrar medidas anoacutemalas debido a factores

puntuales como por ejemplo un mal funcionamiento de la red de intercone-

xioacuten

442 Interfaces de instrumentacioacuten y monitorizacioacuten

Las herramientas de monitorizacioacuten normalmente constan de dos partes una

libreriacutea o conjunto de libreriacuteas que permiten insertar coacutedigo de instrumenta-

cioacuten para medir y almacenar datos y una serie de moacutedulos que ofrecen la

posibilidad de mostrar los datos generados durante la monitorizacioacuten de la

aplicacioacuten paralela Hay que tener en cuenta que la instrumentacioacuten puede

afectar a las caracteriacutesticas de rendimiento de la aplicacioacuten paralela puesto

que pueden antildeadir un cierto sobrecoste relacionado con la instrumentacioacuten

Ejemplo

Por ejemplo MPI disponede la funcioacuten MPI_Wtime yOpenMP dispone de la funcioacutenomp_get_wtime Ambas de-vuelven el tiempo total de eje-cucioacuten y no el tiempo de pro-cesador

La resolucioacuten

Hay muchas funciones de me-dida de tiempo que tienen unaresolucioacuten de microsegundos(10-3) y muchas veces nece-sitaremos resoluciones de na-nosegundos (10-9) para poderidentificar acontecimientos deintereacutes para el anaacutelisis

A pesar de que hay muchas una de las herramientas de instrumentacioacuten maacutes

utilizadas es PAPI33 PAPI es una interfaz para poder acceder a los contadores de

hardware relacionados con el rendimiento que estaacuten disponibles en la mayo-

riacutea de los procesadores actuales Estos contadores son un conjunto de registros

que van contando las veces que determinados acontecimientos suceden en el

procesador

El kernel del sistema operativo puede necesitar algunas modificaciones para

permitir acceder a los contadores de hardware mediante el uso de PAPI De-

pendiendo del procesador y del sistema operativo puede llegar a ser necesario

aplicar un patch (por ejemplo PertCtr) y tener que recompilar el kernel La

figura siguiente muestra la arquitectura baacutesica de PAPI

(33)Del ingleacutes performance applica-tion programming interface

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 46: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 46 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 18 Arquitectura de PAPI

Cuando antildeadimos PAPI a una parte de nuestro coacutedigo se le pueden pasar a la

aplicacioacuten como paraacutemetros los nombres de los contadores de hardware de los

que se quiere obtener informacioacuten Hay que tener presente que hay bastantes

contadores de hardware a los que se puede acceder mediante PAPI

Uso de PAPI

A modo de ejemplo para obtener el nuacutemero de MIPS o MFlops que la aplicacioacuten es-taacute obteniendo se necesitan los siguientes contadores de hardware PAPI_FP_OPS (nuacuteme-ro de operaciones en coma flotante) PAPI_TOT_INS (nuacutemero total de instrucciones) yPAPI_TOT_CYC (nuacutemero total de ciclos) Otros contadores de maacutequina dan por ejemploinformacioacuten relacionada con la memoria como el nuacutemero de fallos en memoria cacheacute decada uno de sus niveles A continuacioacuten se muestra un ejemplo de la utilizacioacuten de PAPI

include amp8220papihamp8221define NUM_EVENTS 2int Events[NUM_EVENTS] = PAPI_FP_OPS PAPI_TOT_CYCINT EventSetLong long valiacuteas[NUM_EVENTS] Inicializacioacuten de la libreriacutea retval = PAPI_library_init (PAPI_VER_CURRENT) Alocatar espacio para el nuevo elemento retval = PAPI_create_eventSet (ampEventSet)Antildeade Flops y otros ciclos que hay que monitorizar retval = PAPI_add_eventset (ampEventSet Events NUM_EVENT) Empiezan a funcionar los contadores retval = PAPI_start(EventSet)hacer_trabajo() Lo que suponemos que monitorizamos Para los contadores y restaura los valores por defecto retval = PAPI_stop(EventSet valiacuteas)

443 Herramientas de anaacutelisis de rendimiento

El objetivo de las herramientas de anaacutelisis de rendimiento es analizar de ma-

nera maacutes o menos automaacutetica la informacioacuten generada durante la fase de mo-

nitorizacioacuten Mediante estas herramientas podemos identificar posibles cue-

llos de botella y otros problemas propios de las aplicaciones paralelas aunque

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 47: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 47 Introduccioacuten a la computacioacuten de altas prestaciones

no proporcionan la solucioacuten a estos problemas de modo automaacutetico sino que

requiere la intervencioacuten humana para extraer conclusiones y proponer solu-

ciones o mejoras

La forma claacutesica de anaacutelisis de rendimiento estaacute basada en la visualizacioacuten de

la ejecucioacuten de la aplicacioacuten paralela mediante una traza una vez que esta

ha acabado de ejecutarse Este proceso se muestra en la figura siguiente y se

denomina post-mortem

Figura 19 Metodologiacutea claacutesica de anaacutelisis de rendimiento

Normalmente las herramientas que se utilizan en este proceso muestran infor-

macioacuten especiacutefica sobre el comportamiento de la aplicacioacuten mediante diferen-

tes vistas graacuteficas y numeacutericas Por ello primeramente se requiere el uso de la

herramienta que realice la monitorizacioacuten para obtener datos de rendimiento

de la ejecucioacuten del programa paralelo La insercioacuten de la instrumentacioacuten se

puede realizar de manera estaacutetica a traveacutes de la herramienta o manualmente

por el usuario El proceso de monitorizacioacuten se puede realizar siguiendo varias

teacutecnicas

bull Basadas en tiempo de ejecucioacuten mediante la cual se detecta queacute parte de

la aplicacioacuten paralela se ejecuta maacutes tiempo

bull Basadas en contadores que indican el nuacutemero de veces de un determinado

acontecimiento en la aplicacioacuten (por ejemplo el caso de PAPI)

bull Basadas en muestreo que generan medidas perioacutedicamente sobre el estado

de la aplicacioacuten

bull Basadas en trazas de acontecimientos que proporcionan informacioacuten aso-

ciada a acontecimientos concretos definidos en la aplicacioacuten

Como los datos se almacenan en un fichero de traza de la aplicacioacuten las he-

rramientas de visualizacioacuten generan graacuteficos sobre patroacuten que sigue la aplica-

cioacuten como por ejemplo diagramas de Gantt diagramas circulares de barras

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 48: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 48 Introduccioacuten a la computacioacuten de altas prestaciones

etc La informacioacuten mostrada se debe corresponder con aspectos relacionados

con paso de mensajes comunicaciones colectivas ejecucioacuten de rutinas de la

aplicacioacuten entre otros Finalmente el usuario debe analizar estas representa-

ciones graacuteficas buscando problemas de rendimiento determinando las causas

de estos problemas y cambiando el coacutedigo fuente manualmente si es necesa-

rio De este modo el proceso global se repite volviendo a compilar y ejecutar

la aplicacioacuten hasta que obtengamos el rendimiento que deseamos

El anaacutelisis de rendimiento claacutesico requiere un elevado grado de experiencia

en programacioacuten paralela para llevarlo a teacutermino de modo eficiente asiacute que

resulta una tarea especialmente difiacutecil para usuarios no expertos La compleji-

dad de esta tarea se debe principalmente a la interpretacioacuten y el tamantildeo del

fichero de traza que es proporcional al tamantildeo y al tiempo de ejecucioacuten de

la aplicacioacuten Ademaacutes esta aproximacioacuten no es fiable cuando las aplicaciones

o los entornos de ejecucioacuten tienen un comportamiento dinaacutemico Muchas

aplicaciones tienen un comportamiento diferente seguacuten los datos de entrada

o incluso pueden variar durante la misma ejecucioacuten Ademaacutes muchas herra-

mientas de visualizacioacuten no escalan bien por lo que cuando el nuacutemero de

procesos implicados en la aplicacioacuten es muy elevado los graacuteficos generados

no son legibles correctamente

La figura siguiente muestra una traza donde se puede observar un alto nivel de

desbalanceo en los tiempos de espera de varios procesos MPI en una barrera

En esta situacioacuten sabemos que los nuacutecleos permaneceraacuten sin trabajo durante

los tiempos de espera en la barrera (color rojo del graacutefico) pero no es tan

evidente encontrar una solucioacuten

Figura 20 Ejemplo de traza Muestra un alto nivel de desbalanceo en una barrera MPI

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 49: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 49 Introduccioacuten a la computacioacuten de altas prestaciones

A continuacioacuten veremos un par de ejemplos de herramientas de anaacutelisis de

rendimiento de aplicaciones paralelas Vampir y Taubench Cabe sentildealar que

hay una gran diversidad de herramientas de anaacutelisis de rendimiento como

por ejemplo comerciales como VTune de Intel PPW34 o Paraver y otras de

visualizacioacuten como Jumpshot

Vampir es una herramienta de anaacutelisis de rendimiento que permite la visuali-

zacioacuten graacutefica y el anaacutelisis de los datos del estado de un programa mensajes

punto a punto operaciones colectivas y contadores de rendimiento de hard-

ware junto con resuacutemenes estadiacutesticos Estaacute disentildeada como una herramienta

de faacutecil utilizacioacuten que permite a los desarrolladores visualizar raacutepidamente

el comportamiento de su aplicacioacuten en un determinado nivel de detalle

Vampir empezoacute a desarrollarse en el centro de matemaacutetica aplicada del Centro

de Investigacioacuten de Juumllich en Alemania y en el Centro de Computacioacuten de

Altas Prestaciones de la Universidad Teacutecnica de Dresde tambieacuten en Alemania

y estaacute disponible como producto comercial desde 1996 Esta herramienta se

ha utilizado ampliamente por la comunidad de la computacioacuten de altas pres-

taciones durante muchos antildeos El formato de traza que gestiona (actualmente

Open Trace u OTF) es compatible con otras muchas herramientas

Esta herramienta permite visualizar las actividades y comunicaciones de la

aplicacioacuten a lo largo del tiempo en graacuteficos temporales que el usuario pue-

de explorar haciendo zooms y desplazaacutendose por la ejecucioacuten para detectar la

causa de los problemas de rendimiento ademaacutes de permitir la correcta para-

lelizacioacuten y balanceo de carga Tambieacuten proporciona graacuteficos estadiacutesticos por

caraacutecter cuantitativos Vampir estaacute disponible para praacutecticamente todas las

plataformas de 32 y 64 bits como PC cluacutesteres Linux IBM etc Tambieacuten hay

disponible un software de instrumentacioacuten y medida conocido como Vampir-

Trace

VampirTrace proporciona una infraestructura que permite el desarrollo con

instrumentacioacuten y facilidades para recoger medidas en aplicaciones HPC Cu-

bre el anaacutelisis de aplicaciones desarrolladas en MPI y OpenMP La instrumen-

tacioacuten modifica la aplicacioacuten para detectar y almacenar acontecimientos de

intereacutes generados durante la ejecucioacuten por ejemplo una operacioacuten de comu-

nicacioacuten MPI o una determinada llamada a funcioacuten Esto se puede hacer a ni-

vel de coacutedigo fuente durante la compilacioacuten o en tiempo de enlace mediante

varias teacutecnicas La libreriacutea de VampirTrace se encarga de la recogida de datos

en todos los procesos Estos datos incluyen acontecimientos definidos por el

usuario acontecimientos MPI y OpenMP asiacute como informacioacuten sobre tempo-

rizacioacuten o localizacioacuten Ademaacutes tambieacuten permite obtener informacioacuten por

medio de contadores de hardware mediante PAPI La instrumentacioacuten auto-

maacutetica del coacutedigo fuente se puede llevar a cabo con varios compiladores entre

los que se encuentra el de GNU La instrumentacioacuten binaria se realiza con Dy-

(34)Del ingleacutes parallel performancewizard

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 50: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 50 Introduccioacuten a la computacioacuten de altas prestaciones

nist Finalmente los datos de rendimiento recogidos se almacenan en fichero

de formato OTF En la figura 20 se mostraba un ejemplo de traza visualizada

con Vampir

TAU35 es un sistema de anaacutelisis de rendimiento paralelo que integra un en-

torno y un conjunto de herramientas automaacuteticas para la instrumentacioacuten la

medida el anaacutelisis y la visualizacioacuten del rendimiento de aplicaciones ejecuta-

das en sistemas paralelos de gran escala Una de sus principales caracteriacutesticas

es el gran nuacutemero de plataformas de hardware y software que soporta TAU

se puede ejecutar en la mayoriacutea de los entornos de altas prestaciones y permi-

te varios lenguajes como por ejemplo CC++ Java Python Fortan OpenMP

MPI y Charm Su arquitectura se organiza en tres capas instrumentacioacuten me-

dida y anaacutelisis

TAU utiliza un modelo de instrumentacioacuten flexible basado en instrumenta-

cioacuten dinaacutemica que le permite al usuario insertar instrumentacioacuten de rendi-

miento llamando a la interfaz de medidas de TAU El concepto clave de la ca-

pa de instrumentacioacuten es que en esta capa es donde se definen los aconteci-

mientos de rendimiento El mecanismo de instrumentacioacuten de TAU permite

diferentes tipos de acontecimientos que definen el rendimiento incluyendo

acontecimientos definidos por localizaciones de coacutedigo acontecimientos de

interfaz de libreriacutea acontecimientos del sistema y acontecimientos definidos

por el propio usuario Asiacute pues la salida de la instrumentacioacuten es informacioacuten

sobre los acontecimientos de un experimento de rendimiento que seraacute utili-

zada por otras herramientas La capa de instrumentacioacuten se comunica con la

capa de medida mediante la interfaz de medida de TAU Los moacutedulos de TAU

se dividen en componentes para hacer la depuracioacuten del coacutedigo y obtener tra-

zas que se pueden visualizar con herramientas especializadas como ParaProf

o Vampir

45 Anaacutelisis de rendimiento de sistemas de altas prestaciones

Del mismo modo que podemos analizar el rendimiento de nuestras aplicacio-

nes paralelas en un determinado sistema tambieacuten hemos de poder analizar

los sistemas de altas prestaciones en relacioacuten con las aplicaciones que quere-

mos ejecutar Esto nos seraacute uacutetil de cara a decidir o disentildear las caracteriacutesticas

del sistema que necesitamos para que nuestras aplicaciones nos puedan dar el

rendimiento deseado

Tal y como hemos visto anteriormente hay unidades de medida de rendimien-

to como por ejemplo los Flops que resultan sencillas de obtener desde un

punto de vista teoacuterico puesto que viene determinado por la arquitectura En

cambio este rendimiento teoacuterico no se puede lograr en la praacutectica puesto que

existen los sobrecostos relacionados con el paralelismo y con la escalabilidad

en siacute de las aplicaciones paralelas que hemos visto anteriormente

(35)Del ingleacutes tuning and analysisutilities

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 51: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 51 Introduccioacuten a la computacioacuten de altas prestaciones

Identificar la red de interconexioacuten

Un ejemplo de este tipo de estudio es identificar queacute red de interconexioacuten necesitaremosen cuanto a ancho de banda y latencia para lograr un cierto rendimiento (por ejemplomedido en Mflops) de una aplicacioacuten de memoria distribuida con paso de mensajes Pa-ra llevar a cabo este tipo de estudio normalmente se utilizan herramientas de anaacutelisisde rendimiento que pueden obtener el patroacuten de comportamiento de la aplicacioacuten uti-lizando una configuracioacuten determinada y sistemas de prediccioacuten que nos pueden decircuaacutel seriacutea el rendimiento despueacutes de modificar la configuracioacuten del sistema Aun asiacute esteproceso no es sencillo y es especiacutefico para cada aplicacioacuten paralela

Por tanto para poder comparar sistemas y establecer una referencia en cuanto

al rendimiento que pueden ofrecer los sistemas de altas prestaciones se suelen

utilizar pruebas de rendimiento36 tal y como veremos a continuacioacuten

451 Pruebas de rendimiento

Como hemos comentado las pruebas de rendimiento o benchmarks nos per-

miten medir el rendimiento de un sistema o de un componente en concreto

(CPU memoria disco etc) Mediante los benchmarks podemos establecer re-

ferencias y tener criterios para comparar diferentes sistemas o componentes

En concreto los benchmarks son un conjunto de programas representativos de

la carga del sistema que se quiere analizar

El benchmark de referencia para sistemas de altas prestaciones es el Linpack que

fue desarrollado por Jack Dongarra en 1976 en el Argone National Laboratory

El Linpack es un conjunto de subrutinas que analizan y resuelven ecuaciones

lineales de alta densidad las cuales se suelen utilizar en las aplicaciones de

altas prestaciones Los sistemas de ecuaciones lineales que se tiene en cuenta

utilizan diferentes formas de matrices generales simeacutetricas triangulares etc

En general el benchmark realiza la resolucioacuten de un sistema de ecuaciones ge-

nerado aleatoriamente expresado como una matriz de coeficientes que se re-

presentan con nuacutemero de punto flotante normalmente de precisioacuten de 64

bits El paso crucial de esta solucioacuten es la descomposicioacuten LU con piacutevot parcial

de la matriz de coeficientes El resultado del benchmark es un valor de rendi-

miento expresado en MFlops la unidad tradicionalmente utilizada para hacer

comparaciones entre diferentes sistemas

(36)En ingleacutes benchmarks

Originalmente Linpack se implementoacute en Fortran para maacutequinas uniprocesa-

dor vectoriales y de memoria compartida A medida que los sistemas de me-

moria distribuida se popularizaron se hizo necesario desarrollar el benchmark

HPL37 HPL es una implementacioacuten de Linpack desarrollada en lenguaje C que

se puede ejecutar en cualquier equipo que disponga de una implementacioacuten

de MPI

HPL es el benchmark utilizado para medir el rendimiento de los computadores

maacutes raacutepidos del mundo que se recopilan cada seis meses en la lista Top500

(37)Del ingleacutes high performance Lin-pack

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 52: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 52 Introduccioacuten a la computacioacuten de altas prestaciones

Otro benchmark representativo es el HPC Challenge Benchmark De hecho

se trata de un conjunto de benchmarks que prueban varias caracteriacutesticas de

sistemas de altas prestaciones En concreto estaacute compuesto por los siguientes

siete tests

bull HPL es el high performance Linpack que hemos comentado anteriormente

bull DGEMM estaacute centrado en la memoria y mide el rendimiento en coma

flotante de la ejecucioacuten de la multiplicacioacuten de matrices de nuacutemeros reales

de doble precisioacuten

bull STREAM es un benchmark basado en un programa sinteacutetico que mide el

ancho de banda a memoria sostenido (en GBs)

bull PTRANS38 estaacute centrado en las comunicaciones entre pares de procesado-

res que se comunican entre ellos simultaacuteneamente Este benchmark estaacute

orientado a la evaluacioacuten de la capacidad de la red

bull Acceso aleatorio estaacute centrado en medir el rendimiento de accesos aleato-

rios a memoria (tambieacuten denominado GUPS)

bull FFT es un benchmark que mide el rendimiento en punto flotante de la eje-

cucioacuten de una transformada discreta de Fourier compleja unidimensional

de doble precisioacuten

(38)Del ingleacutes parallel matrix trans-pose

bull Ancho de banda y latencia de comunicaciones es un conjunto de pruebas

que miden la latencia y el ancho de banda de varios patrones de comuni-

caciones simultaacuteneamente Estaacute basado en el benchmark b_eff39

452 Lista Top500

Cada seis meses los 500 supercomputadores maacutes raacutepidos del mundo se eva-

luacutean ejecutando el benchmark Linpack que hemos comentado anteriormente

sobre un conjunto de datos muy grande (entre otras razones para evitar limi-

taciones de escalabilidad debido a un tamantildeo de problema demasiado peque-

ntildeo) La lista llamada Top500 variacutea de antildeo en antildeo y se puede ver como una

especie de competicioacuten

Ademaacutes de hacer puacuteblicos los supercomputadores maacutes raacutepidos en cada mo-

mento y sus caracteriacutesticas el Top500 tambieacuten publica estadiacutesticas de otra in-

formacioacuten de intereacutes para entender la evolucioacuten de la computacioacuten de altas

prestaciones

(39)Del ingleacutes effecive bandwidthbenchmark

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 53: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 53 Introduccioacuten a la computacioacuten de altas prestaciones

Es interesante observar en la figura siguiente la evolucioacuten en el tiempo de la

arquitectura de los supercomputadores del Top500 En 1993 250 sistemas eran

baacutesicamente de memoria compartida y todos ellos desaparecieron de la lista

en junio del 2002 Los sistemas SIMD desaparecieron en 1997 Los sistemas

MPP fueron muy populares hacia el antildeo 2000 pero han tenido una evolucioacuten

a la baja a pesar de que todaviacutea se pueden encontrar en la lista En cambio

los sistemas basados en cluacutester aparecieron en 1999 y actualmente son los maacutes

populares del Top500 representando la clase de arquitectura dominante La

principal diferencia entre los cluacutesteres y los sistemas MPP es que los cluacutesteres

utilizan componentes de mercado mientras que los sistemas MPP tienen los

propios disentildeos especiacuteficos de nodos moacutedulos red de interconexioacuten etc

Figura 21 Evolucioacuten del tipo de arquitecturas de los sistemas del Top500 desde 1993Fuente httpwwwtop500org

La figura siguiente muestra la evolucioacuten del rendimiento de los supercompu-

tadores del Top500 desde 1993 hasta junio del 2012 El eje de las Y estaacute escala-

do en teacuterminos de rendimiento sostenido medido en GFlops TFlops y PFlops

La serie del medio corresponde al rendimiento del supercomputador maacutes raacutepi-

do del mundo durante las casi dos deacutecadas que se incrementa de 587 GFlops

a 1632 PFlops La serie inferior corresponde a la velocidad del uacuteltimo sistema

del Top500 (en la posicioacuten nuacutemero 500) y la superior corresponde a la suma

del rendimiento de los 500 supercomputadores de un mismo periodo de tiem-

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 54: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 54 Introduccioacuten a la computacioacuten de altas prestaciones

po En junio del 2012 la suma de los 500 supercomputadores suma 12341

PFlops Es interesante observar que la suma total de rendimiento aumenta de

manera praacutecticamente lineal

Figura 22 Evolucioacuten del rendimiento de los supercomputadores del Top500 desde 1993Fuente httpwwwtop500org

En la tabla siguiente se muestran las caracteriacutesticas de los diez supercompu-

tadores maacutes raacutepidos en la lista del Top500 de junio del 2012 junto con su

rendimiento La velocidad sostenida Rmax (en PFlops) se mide a partir de la

ejecucioacuten del benchmark Linpack con el maacuteximo tamantildeo de matriz Rpeak es

la velocidad maacutexima sostenida cuando todos los elementos del sistema estaacuten

siendo utilizados completamente La potencia eleacutectrica es en KW lo que quie-

re decir que el supercomputador de la lista que requiere maacutes potencia eleacutectrica

pasa los 12 MW Hay que destacar que el orden de los sistemas en cuanto a su

rendimiento no coincide con el de nuacutemero de nuacutecleos o potencia

Tabla 5 Lista de los 10 supercomputadores maacutes raacutepidos de la lista del Top500 de junio del2012

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

1 DOENNSALLNLEstados Unidos

Sequoia - BlueGe-neQ Power BQC16C 160 GHz Cus-tom 2011IBM

1572864 1632420132

7890

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 55: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 55 Introduccioacuten a la computacioacuten de altas prestaciones

Institucioacuten ComputadorAntildeoFabricante

Nuacutecleos RmaxRpeak

Potencia

2 RIKEN Advanced Ins-titute for Compu-tational Science (AI-CS)Japoacute

K computerSPARC64 VIIIfx20GHz Tofu inter-connect 2011Fujitsu

705024 1051011280

12659

3 DOESCArgonneNational LaboratoryEstados Unidos

Mira - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

786432 816210066

3945

4 Leibniz Rechenzen-trumAlemania

SuperMUC - iDa-taPlex DX360M4Xeon E5-2680 8C270GHz InfinibandFDR 2012IBM

147456 28973185

3422

5 National Supercom-puting Center inTianjinChina

Tianhe-1A - NUDTYH MPP XeonX5670 6C 293 GHzNVIDIA 2050 2010NUDT

186368 25664701

4040

6 DOESCOak RidgeNational LaboratoryEstados Unidos

Jaguar - Cray XK6Opteron 6274 16C2200GHz Cray Ge-mini interconnectNVIDIA 2090 2009Cray Inc

298592 19412627

5142

7 CINECAItalia

Fermi - BlueGeneQPower BQC 16C160GHz Custom 2012IBM

163840 17252097

821

8 ForschungszentrumJuelich (FZJ)Alemania

JuQUEEN - BlueGe-neQ Power BQC16C 160GHz Cus-tom 2012IBM

131072 13801677

657

9 CEATGCC-GENCIFrancia

Curie thin no-des - Bullx B510Xeon E5-2680 8C2700GHz Infini-band QDR 2012Bull

77184 13591667

2251

10 National Supercom-puting Centre inShenzhen (NSCS)China

Nebulae - DawningTC3600 Blade Sys-tem Xeon X56506C 266GHz Infini-band QDR NVIDIA2050 2010Dawning

120640 12712984

2580

Tambieacuten hay que destacar otras iniciativas relacionadas como el Graph500

o Green500 Mientras que el primero ordena los sistemas de altas prestacio-

nes orientado a aplicaciones intensivas de datos puesto que cada vez estaacuten

Ved tambieacuten

La eficiencia energeacutetica se tra-ta en el uacuteltimo moacutedulo de estaasignatura

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 56: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 56 Introduccioacuten a la computacioacuten de altas prestaciones

tomando maacutes protagonismo en la computacioacuten de altas prestaciones el se-

gundo se centra en la eficiencia energeacutetica tal y como veremos en el uacuteltimo

moacutedulo de la asignatura

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 57: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 57 Introduccioacuten a la computacioacuten de altas prestaciones

5 Retos de la computacioacuten de altas prestaciones

Con los avances tecnoloacutegicos el rendimiento de los computadores de altas

prestaciones mejora antildeo tras antildeo como hemos visto anteriormente en la figu-

ra 32 Aun asiacute muchos de estos avances tecnoloacutegicos (por ejemplo el aumen-

to de densidad de transistores en los microprocesadores) estaacuten llegando a sus

liacutemites por varios motivos como pueden ser los liacutemites fiacutesicos o energeacuteticos

y es necesario un cambio de paradigma para poder construir un computador

que tenga un rendimiento sostenido de un exaflop

El objetivo actual de la comunidad cientiacutefica es poder desarrollar sistemas de

la escala del exaflop aproximadamente en el 2018 Este objetivo coincide con

la proyeccioacuten del rendimiento de los supercomputadores de cara al 2020 tal

y como muestra la figura siguiente pero ndashcomo veremos a continuacioacutenndash hay

nuevos retos que habraacute que tomar muy seriamente para lograr el exaflop De

hecho dentro de las muacuteltiples iniciativas en esta direccioacuten hay que destacar el

proyecto ldquoThe International Exascale Softwarerdquo en el que cientiacuteficos de todo

el mundo han definido una hoja de ruta para conseguir esta escala de rendi-

miento de manera sostenible El proyecto cuenta con el apoyo de institucio-

nes gobiernos y empresas de todo el mundo especialmente de la NSF40 y del

Departamento de Energiacutea de Estados Unidos y agencias en Europa y Asia

(40)Del ingleacutes National ScienceFoundation

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 58: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 58 Introduccioacuten a la computacioacuten de altas prestaciones

Figura 23 Proyeccioacuten del rendimiento de los supercomputadores del Top500 hasta el antildeo 2020

Fuente httpwwwtop500org

51 Concurrencia extrema

Para conseguir un rendimiento de exaflop habraacute que aumentar el nivel de

concurrencia en hasta 1000 veces maacutes por cada trabajo individual Esto quiere

decir que los trabajos estaraacuten compuestos posiblemente de centenares de miles

o millones de elementos que hay que sincronizar y gestionar adecuadamente

y de modo eficiente

De esta manera habraacute que disponer de nuevos modelos de programacioacuten que

den respuesta a la necesidad de tanto nivel de paralelismo y que ademaacutes faci-

liten que grupos de aplicaciones puedan gestionar la concurrencia correspon-

diente de manera maacutes natural Esta capacidad seguramente deberaacute incluir una

escalabilidad fuerte puesto que el aumento del volumen de memoria principal

no coincidiraacute con el de los procesadores Esto tambieacuten querraacute decir que habraacute

que reducir al miacutenimo el sobrecoste relacionado con las capas de software que

seraacuten necesarias

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 59: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 59 Introduccioacuten a la computacioacuten de altas prestaciones

52 Energiacutea

La eficiencia energeacutetica es una de las prioridades actuales de los profesionales

que trabajan en el disentildeo de los futuros sistemas de exaflop que si se desarro-

llara con tecnologiacutea actual consumiriacutea varios centenares de MW de potencia

eleacutectrica lo que no es viable ni sostenible desde varias perspectivas Asiacute pues

se requiere una reduccioacuten de la energiacutea de varias oacuterdenes de magnitud y esto

debe ir acompantildeado de optimizaciones a diferentes niveles junto con nuevos

algoritmos y disentildeos de aplicaciones

Con la eficiencia energeacutetica como prioridad se espera que hacia el 2017 los

computadores llegaraacuten a 200 petaflops con un liacutemite de consumo energeacutetico

de 10 MW De cara a como mucho el 2020 el reto es llegar a 1 exaflop con un

consumo de 20 MW Esto supondriacutea una eficiencia energeacutetica 20 veces superior

a la de las maacutequinas que consumen menos en la actualidad (por ejemplo

BlueGeneQ podeacuteis ver la tabla 5)

Primero hay que tener en cuenta que no toda la energiacutea se destina a alimentar

los nuacutecleos En los sistemas actuales los procesadores necesitan un gran volu-

men de energiacutea a menudo un 40 o incluso maacutes La energiacutea restante se utiliza

para las memorias la red de interconexioacuten y el sistema de almacenamiento

Estas proporciones estaacuten cambiando y la memoria principal cada vez consume

una proporcioacuten maacutes grande de energiacutea

Tambieacuten hay que tener en cuenta que la energiacutea que se requiere no solo es

para coacutemputo sino que tambieacuten es para transportar por la red y analizar los

datos que se pueden ir generando durante simulaciones a escalas extremas

Como una parte importante de la energiacutea requerida para un sistema a escala

de exaflop se deberaacute destinar a mover los datos entre procesadores y memoria

y de forma maacutes global habraacute que tener la infraestructura de software que lo

pueda gestionar eficazmente

53 Tolerancia a fallos

Los futuros sistemas de exaflop estaraacuten construidos con dispositivos VLSI que

no seraacuten tan fiables como los que se utilizan actualmente Todo el software

y por lo tanto todas las aplicaciones deberaacuten tener en cuenta la tolerancia a

fallos como un factor maacutes en su disentildeo Asiacute cuando la escala del sistema au-

mente hasta el exaflop tendremos que soportar el reconocimiento y la adapta-

cioacuten a errores de manera continua y proporcionar los mecanismos necesarios

para que las aplicaciones hagan lo mismo De hecho el paralelismo masivo y

el elevado nuacutemero de componentes electroacutenicos de estos sistemas haraacute que los

fallos sean inevitables y tambieacuten que haya una cierta incertidumbre que se de-

beraacute tener en cuenta como elemento en el disentildeo de estas futuras aplicaciones

Ved tambieacuten

Recordad que estas cuestionesde la eficiencia energeacutetica setrataraacuten en el uacuteltimo moacutedulode esta asignatura

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 60: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 60 Introduccioacuten a la computacioacuten de altas prestaciones

54 Heterogeneidad

Los sistemas heterogeacuteneos ofrecen la oportunidad de explotar el rendimiento

de dispositivos como GPU para computacioacuten de propoacutesito general Un ejem-

plo de ello es el computador Nebulae el cual utiliza CPU Intel Xeon y acele-

radores Nvidia De la misma manera las aplicaciones cientiacuteficas tambieacuten se

estaacuten volviendo maacutes heterogeacuteneas

55 Entradasalida y memoria

No disponer de suficiente capacidad de entradasalida hoy en diacutea es un cuello

de botella Ademaacutes habraacute que gestionar y analizar grandes voluacutemenes de da-

tos que se generaraacuten muy raacutepidamente lo que aumentaraacute vertiginosamente

durante la proacutexima deacutecada

La jerarquiacutea de memoria deberaacute cambiar puesto que habraacute nuevas tecnologiacuteas

de memoria que habraacute que tener en cuenta Este cambio en la jerarquiacutea de

memoria acabaraacute afectando tanto a los modelos de programacioacuten como a las

optimizaciones La figura siguiente muestra la diferencia de acceso a los distin-

tos niveles de la jerarquiacutea de memoria como motivacioacuten para la incorporacioacuten

de nuevas tecnologiacuteas como por ejemplo la memoria no volaacutetil o NVRAM41

Figura 24 Diferencias en tiempos de acceso a los distintos niveles de la jerarquiacutea de memoriaFuente Fusion-IO

Hay que tener en cuenta que los dos ejes de la figura anterior estaacuten en escala

logariacutetmica Asiacute pues podemos ver claramente que hay una diferencia muy

elevada tanto de rendimiento como de tiempo de acceso entre la memoria

DRAM y el disco duro En la tabla 6 se presenta una analogiacutea bastante ilustra-

tiva

(41)Del ingleacutes non-volatile ran-dom-access memory

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 61: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 61 Introduccioacuten a la computacioacuten de altas prestaciones

Tabla 6 Analogiacutea de los tiempos de acceso a los diferentes niveles de la jerarquiacutea de memoria

Nivel Comida Tiempo de acceso relativo

Cacheacute nivel 1 Comer de la boca Fracciones de segundo

Cacheacute nivel 2 Coger comida del plato 1 segundo

Cacheacute nivel 3 Coger comida de la mesa Unos pocos segundos

DRAM Coger comida de la cocina Unos pocos minutos

FLASH Coger la comida deuna tienda cercana

Unas pocas horas

Disco duro Coger la comida de Marte 3-5 antildeos

Teniendo en cuenta lo expuesto una de las soluciones que se estaacuten adoptando

y que pasaraacuten a tener un papel destacado en el desarrollo de sistemas de exa-

flop es extender la jerarquiacutea de memoria con un nuevo nivel que ocuparaacute la

memoria no volaacutetil como muestra la figura siguiente que extiende los con-

ceptos que salieron en la figura 12 Tambieacuten se espera la utilizacioacuten de otras

tecnologiacuteas que proporcionan rendimientos intermedios como la utilizacioacuten

de tecnologiacutea SSD42

Figura 25 Jerarquiacutea de memoria extendida con memoria RAM no volaacutetil

(42)Del ingleacutes solid state drive

Ved tambieacuten

Encontrareacuteis la figura 12 en elsubapartado 222 al tratar lossistemas de memoria compar-tida

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 62: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la

CC-BY-NC-ND bull PID_00209165 63 Introduccioacuten a la computacioacuten de altas prestaciones

Bibliografiacutea

Buyya R (1999) High Performance Cluster Computing Architectures and Systems (vol 1) En-glewood Cliffs NJ Prentice Hall

Grama A Karypis G Kumar V Gupta A (2003) Introduction to Parallel ComputingReading Massachusetts Addison-Wesley

Hwang K Fox G C Dongarra J J (2012) Distributed and Cloud Computing FromParallel Processing to the Internet of Things Burlington Massachusetts Morgan Kaufmann

Jain R (1991) The Art of Computer System Performance Analysis Techniques for ExperimentalDesign Measurement Simulation and Modeling Wiley-Interscience

Kirk D B Hwu W W (2010) Programming Massively Parallel Processors A Hands-on Ap-proach Burlington Massachusetts Morgan Kaufmann

Lin C Snyder L (2008) Principles of Parallel Programming Reading Massachusetts Ad-dison Wesley

Munshi A Gaster B Mattson T G Fung J Ginsburg D (2011) OpenCL Pro-gramming Guide Reading Massachusetts Addison-Wesley Professional

Pacheco P (2011) An Introduction to Parallel Programming Burlington Massachusetts Mor-gan Kaufmann

  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea
Page 63: computación de Introducción a la altas prestacionesopenaccess.uoc.edu/webapps/o2/bitstream/10609/76185... · lo y de memoria. La predicción meteorológica es una función de la
  • Introduccioacuten a la computacioacuten de altas prestaciones
    • Introduccioacuten
    • Objetivos
    • Iacutendice
    • 1 Motivaciones de la computacioacuten de altas prestaciones
      • 11 Utilidad de la simulacioacuten numeacuterica
      • 12 Tipos baacutesicos de aplicaciones orientadas a altas prestaciones
        • 121 Aplicaciones HTC
        • 122 Aplicaciones HPC
            • 2 Paralelismo y arquitecturas paralelas
              • 21 Necesidad de la computacioacuten paralela
              • 22 Arquitecturas de computacioacuten paralela
                • 221 Una instruccioacuten muacuteltiples datos (SIMD)
                • 222 Muacuteltiples instrucciones muacuteltiples datos (MIMD)
                • 223 Coherencia de memoria cacheacute
                  • 23 Sistemas distribuidos
                    • 3 Programacioacuten de aplicaciones paralelas
                      • 31 Modelos de programacioacuten de memoria compartida
                        • 311 Programacioacuten con flujos
                        • 312 OpenMP
                        • 313 CUDA y OpenCL
                          • 32 Modelos de programacioacuten de memoria distribuida
                            • 321 MPI
                            • 322 PGAS
                              • 33 Modelos de programacioacuten hiacutebridos
                                • 4 Rendimiento de aplicaciones paralelas
                                  • 41 Speedup y eficiencia
                                  • 42 Ley de Amdahl
                                  • 43 Escalabilidad
                                  • 44 Anaacutelisis de rendimiento de aplicaciones paralelas
                                    • 441 Medidas de tiempos
                                    • 442 Interfaces de instrumentacioacuten y monitorizacioacuten
                                    • 443 Herramientas de anaacutelisis de rendimiento
                                      • 45 Anaacutelisis de rendimiento de sistemas de altas prestaciones
                                        • 451 Pruebas de rendimiento
                                        • 452 Lista Top500
                                            • 5 Retos de la computacioacuten de altas prestaciones
                                              • 51 Concurrencia extrema
                                              • 52 Energiacutea
                                              • 53 Tolerancia a fallos
                                              • 54 Heterogeneidad
                                              • 55 Entradasalida y memoria
                                                • Bibliografiacutea