Você está na página 1de 100

Paralelismo em Mecnica Computacional

Renato Elias, Marcos Martins, Alvaro Coutinho


{renato, marcos, alvaro}@nacad.ufrj.br

Ncleo de Atendimento em Computao de Alto Desempenho


E Departamento de Engenharia Civil
Universidade Federal do Rio de Janeiro, Brasil
www.nacad.ufrj.br

Contedo

Conceitos bsicos envolvidos na paralelizao de cdigos de mecnica


computacional
Reviso de mtodos discretos (elementos, volumes, diferenas, finitas)
Representao dos dados e esquemas de armazenamento

Paralelizao de programas com o OpenMP


Reviso de OpenMP;
Blocagem de dados Mesh coloring;
Operaes bsicas de cdigos de mecnica computacional em OpenMP.

Paralelizao de programas com o MPI


Particionamento e distribuio de dados Metis;
Operaes bsicas de cdigos de mecnica computacional em MPI.

Reviso de mtodos discretos em 6 slides (1/6)

O que uma discretizao?

infinito
incgnitas
analtico
tratamento
limitado aplicabilidade
geralmente no aproximao

finito
numrico
ampla
geralmente sim

Mtodos discretos: Diferenas finitas, volumes finitos e elementos finitos


3

Diferenas Finitas (2/6)

As equaes diferenciais so convertidas em stencils nos ns de uma grade

Simples, rpido

Pouco flexvel

Volumes Finitos (3/6)

As equaes diferenciais so reformuladas em termos de fluxo atravs dos contornos


dos elementos

Flexvel

Gerao de malha em 3D difcil

Elementos Finitos (4/6)

Equao diferencial reformulada em termos de formulao variacional e funes de


teste

Flexvel

Gerao de malha em 3D difcil

O que todos tem em comum? (5/6)

No final sempre teremos um sistema de equaes

Frequentemente muito grande para ser resolvido com um mtodo direto

Mtodos iterativos so utilizados, introduzindo um outro nvel de aproximao

O paralelismo viabiliza que problemas cada vez maiores sejam resolvidos

Representao computacional de uma malha no estruturada (6/6)

ndim: nmero de dimenses espaciais


nnos: nmero de ns

nnoel: nmero de ns por elemento


nel: nmero de elementos

Formas de representao de dados:


Malhas, Grades, Grafos e Matrizes

Matriz esparsa
a1,1
a
2,1

a1,3
a2,3

a1,4

a3,1

a4,1
a5,1

a3,2

a3,3
a4,3

a3,4
a4,4
a5,4

a6,1
a
7,1

a6,2

a1,2
a22

a9,2

a10,2

representao geomtrica
9

representao relacional

a8,3
a9,3

a1,6
a2,6

a1,7
a2,9
a3,8
a4,8

a4,5
a5,5
a7,5

a1,5

a5,7
a6,6
a7 ,6

a8,4

a6,7
a7,7

a6,10
a8,8

a10,6
a11,3

a2,10

a3,9

a11,8

representao algbrica

a9,9

a9,10

a10,9

a10,10

a11,9

Reordenao Nodal

O perfil da matriz resultante est diretamente relacionado ordem com que os ns da


malha esto numerados;

Algoritmos de ordenao tal como o Reverse Cuthill Mckee reordenam a malha com
intuito de reduzir a largura de banda

problema real

exemplo bsico
10

Efeito da reordenao de dados

11

Outras formas de reordenao


Improving data locality: RCM
vertex reordering and edge
reordering in ascending vertex order

x 1000

Reordering for minimizing i/a

100

Node i

80

Node j

Nodes

60

Original edge order

40

20

0
0

100

200

300

400

500

600

700
x 1000

Edges

Improving data locality with


NO memory dependencies

12

Data reordering
schemes provided by
EdgePack

Improving data locality for


each superedge type.
Superedge improves the use
of CPU registers

Armazenamento de matrizes esparsas

Os mtodos descritos anteriormente do origem matrizes com um


alto grau de esparsidade e consequentemente uma elevada
quantidade de termos nulos;

Existem diversos esquemas destinados ao armazenamento de


matrizes esparsas;

Estes esquemas tiram proveito da esparsidade da matriz e


armazenam somente os termos no-nulos de uma forma compacta;

Mostraremos alguns desses esquemas e algumas implicaes


relacionadas eles;

13

Estrutura de dados: consideraes gerais

O uso de uma estrutura de dados apropriada crucial para se


atingir uma boa performance x espao de armazenamento;

Ncleos de lgebra linear bsicos (p. ex., produtos matriz-vetor)


dependem da estrutura de dados;

Estruturas compactas para o armazenamento de matrizes esparsas


so convenientes somente para mtodos iterativos de soluo;

Pacotes de soluo de problemas de lgebra linear (p. ex. Petsc


Trilinos, etc...) geralmente utilizam estruturas padronizadas e
reconhecidas (p. ex., CSR, BSR).

14

Exemplos de estruturas de dados

DNS: Dense

DIA: Diagonal;

BND: Linpack Banded;

BSR: Block Sparse Row

COO: Coordinate;

SSK: Symmetric Skyline;

CSR: Compressed Sparse Row;

NSK: Nonsymmetric Skyline;

CSC: Compressed Sparse

JAD: Jagged Diagonal;

Column;

EBE: Element-by-Element;

MSR: Modified CSR;

EDS: Edge-by-Edge

ELL: Ellpack-Itpack;

15

CSR: Compressed Sparse Row


1.
3.

A 6.

0.
0.

0. 0. 2. 0.
4. 0. 5. 0.
0. 7. 8. 9.

0. 10. 11. 0.

0. 0. 0. 12.

Armazena a matriz na forma global (assemblada)

Muito utilizada em pacotes de lgebra linear;

Difcil de programar;

Favorece a construo de pr-condicionadores;

AA(nnz)=

1.

2.

3.

4.

5.

6.

7.

8.

9.

JA(nnz)=

10

12

13

IA(n+1)=

10.

11.

12.

10

11

12

AA: coeficientes no-nulos de A


JA: ndices das colunas dos no-nulos
IA: nmero de no-nulos por linha

16

Produto matriz-vetor CSR (SERIAL)


do i = 1, n
k1 = ia(i)
k2 = ia(i+1)-1
y(i) = dotproduct(a(k1:k2),x(ja(k1:k2)))
End do

AA(nnz)=
1.
3.
JA(nnz)=
6.
0.
IA(n+1)=
0.

1.

20.
. 3. 4. 5.

1
1

6.

7.

80.
. 9. 10. 11.

12.

4.
0.
1
2
4
1
3
4
5
3
4
0.
7.
3
4
6
8
11
9
2
5
7
10
0.
10.
3
6
10
12
13
0.
0.
3
6
2
4
5

Onde n o nmero de linhas da matriz e dotproduct o produto escalar entre a linha da


matriz (a(k1:k2)) e o vetor de entrada.
Para realizar a operao dotproduct normalmente utilizamos a rotina ddot da BLAS
17

5
12

BSR: Block Sparse Row


Adequada para armazenar coeficientes construdos aos blocos (normalmente quando se

trabalha com vrios graus de liberdade acoplados);

Eventualmente armazenar termos nulos;

Mais complexo de se trabalhar do que o CSR

2.
6.

0.
0.

0.

0.

9. 10. 11.

0.

0. 13. 14. 15.

1.
5.

3.
7.

17. 18.

0.

0. 20.

22. 23.

0.

0. 24.

18

0.
0.

4.

AA =

8.

12.

16.
JA =

21.
IA =
25.

1.
5.
2.
6.

3.
7.
4.
8.

9.
13.
10.
14.

11.
15.
12.
16.

17.
22.
18.
23.

20.
24.
21.
25.

EBE: Element-by-Element

Esquema onde as contribuies de cada elemento so armazenadas


individualmente;

Como as contribuies so armazenadas individualmente a matriz global


no necessita ser montada, ou seja, esse esquema guarda coeficientes
no-assemblados;

19

Dificulta o pr-condicionamento;

EBE: Element-by-Element

Considere a seguinte malha de elementos finitos formada por tringulos (3


ns por elemento) contendo 2 graus de liberdade por n (ngl):

t(ngl*nnoel,ngl*nnoel,nel)
Sendo:
nel : nmero de elementos
nnoel: nmero de ns por elemento
ngl : nmero de graus de liberdade
20

Produto matriz-vetor EBE (SERIAL)


do ie = 1, nel
neq1 = lm(1,ie)
neq2 = lm(2,ie)
neq3 = lm(3,ie)
neq4 = lm(4,ie)
...
retrieve and multiply 16 coefs
...
p(neq1) = p(neq1) + ap1
p(neq2) = p(neq2) + ap2
p(neq3) = p(neq3) + ap3
p(neq4) = p(neq4) + ap4
end do
para cada elemento fazer:
Localize os coeficientes no vetor global
Realize a multiplicao
Espalhe o resultado na posio global correspondente
fim

21

EDS: Edges-by-Edges

Similar estrutura EBE porm ao invs de armazenarmos os


coeficientes dos elementos, armazenamos somente as
contribuies de suas arestas;

A globalizao (assembling) das contribuies das arestas s


realizada no momento da multiplicao matriz-vetor (assim como
ocorre com o esquema EBE);

Dificuldade na construo de pr-condicionadores;

A estrutura de dados EDS oferece uma srie de benefcios em


relao s estruturas EBE e CSR

22

Comparativo de estruturas de dados (CSR, EBE, EDS)

23

EDS: Edges-by-Edge (cont.)


desmontando algebricamente um tetraedro

T1e

1
T11
1
T
21
0

Je

e
1

J12
J22
J32

J41

JT
e
42

5

e
2

J11
J21
J31

e
3

e
4

e
5

e
6

J T T T T T T

0 0
0

0
0 0
e
T

0 0 2
0

0 0
0

2
T22

2
T23

2
T32

2
T33

4 3
T

0
T
11
14

0
00

T3
3
0
T31
0
0
0
0

4
4
0
13
0
TJ
0
0 J14
T
44
41

J23
J24
0
0
0

0J 0
0J 0

33
34
0

5
50
0
e0
0J T22
T24
J
T

43
44

6
6

0
0
T
33

0
0
0
0
6

5
5
0
0
T43
0
T42
0 T44

4
T11

T4e

1
T12
1
T22
0
0

0
0

0
0
e

3
T13
0
3
T33
0

0
6

T34
6
T44

Na prtica, os bloco diagonais nodais so utilizados como pr-condicionadores do tipo


block-Jacobi.
24

EDS: Edge-by-Edge

Compare os esquemas de armazenamento EBE e EDS:

t(ngl*3,ngl*3,nel)

t(ngl*2,ngl*2,nedges)

Custo computacional
Elemento tetradrico linear
u-p fully coupled incompressible flow (4 dofs)
nel 5.5nnodes, nedges 7nnodes.

25

Produto matriz-vetor EDS (SERIAL)


Edges

(1 degree of freedom)

do ie = 1, nedges
neq1 = lm(1,ie)
neq2 = lm(2,ie)
...
retrieve and multiply 4 coefs.
...
p(neq1) = p(neq1) + ap1
p(neq2) = p(neq2) + ap2
end do

do ie = 1, nel
neq1 = lm(1,ie)
neq2 = lm(2,ie)
neq3 = lm(3,ie)
neq4 = lm(4,ie)
...
retrieve and multiply 16 coefs
...
p(neq1) = p(neq1) + ap1
p(neq2) = p(neq2) + ap2

STORAGE REQUIREMENTS:

p(neq3) = p(neq3) + ap3

For 4 degrees of freedom:

p(neq4) = p(neq4) + ap4

Elements: (nel x 192 coefs.) + BDiag


Edges: (nedges x 32 coefs) + BDiag

26

Elements (1 degree of freedom)

end do

Paralelizando cdigos de mecnica computacional

Consideraes bsicas:
O que dever ser paralelizado?
Que modelo de paralelismo devo adotar?
Quais as implicaes do modelo de paralelismo escolhido?
Arquitetura que o programa rodar
Estrutura de dados a ser adotada
Eficincia computacional
Facilidade de implementao e manuteno

Adaptarei um programa ou iniciarei o trabalho do zero?

Botando a mo na massa
Por onde eu comeo?
Como me certifico que o programa est rodando corretamente?

27

O que dever ser paralelizado?

REGRA BSICA: O mesmo cdigo dever rodar em paralelo e serial!


...Um programa serial nada mais do que um programa paralelo rodando em 1
processador, processo ou tarefa...

Devemos considerar:
O programa ser integralmente paralelo ou somente algumas partes?
Quais partes do programa merecem ser paralelizados? ...considere os requisitos
de esforo computacional e volume de dados manipulados...

Os algoritmos e mtodos escolhidos podem ser eficientemente paralelizados


com o modelo escolhido?
Leitura e escrita de dados ser em paralelo? ...esse questionamento se aplica mais
ao MPI do que ao OpenMP...

28

Que modelo de paralelismo adotar?

OpenMP: Paralelismo exclusivamente de memria compartilhada

fcil implementao; baixa escalabilidade; restries de hardware;


dependncia de memria (mesh coloring);

MPI: Paralelismo de memria distribuda E/OU compartilhada

Implementao difcil; alta escalabilidade; pequena restrio de hardware;


particionamento de dados, balanceamento e distribuio de tarefas.

Hibrido: MPI+OpenMP

Implementao dificil, alta escalabilidade e flexibilidade, dados devem tratar


dependncia de memria e particionamento ao mesmo tempo.

29

Adaptar ou comear do zero?

Depende:

Qual o tamanho do programa?

Qual a complexidade do programa? ...programas que concentram esforo computacional em pequenos


trechos (rotinas) podem tirar proveito do paralelismo atravs de pequenas intervenes estratgicas sem
modificaes drsticas...

Est documentado?

A documentao realmente satisfatria?

Converso ser feita pelo mesmo programador que criou a verso original serial?

Considere:

Vale a pena iniciar do zero?! ...as vezes a adaptao leva mais tempo do que a recriao...

Iniciar um programa do zero acrescentando os componentes do antigo;

Iniciar um programa do zero aproveitando para implementar novas tecnologias.

O paralelismo deve ser um fator fortemente considerado no projeto de softwares


novos. ...mesmo que a primeira verso no seja paralela o programador dever vislumbrar que isso ser
necessrio futuramente e prover mecanismos que facilitem as modificaes que sero necessrias...

30

Por onde eu comeo?

Considere a seguinte anatomia bsica de programas de mecnica computacional

Pr-processamento
Gerao de malha
Condies iniciais
Lao de integrao no tempo
Lao de iteraes no-lineares
Formao do sistema de equaes
Soluo do sistema de equaes
fim do lao
Fim do lao
Ps-processamento
Sada de dados
Visualizao

31

Por onde eu comeo?

O que os programas de mecnica computacional normalmente fazem?


Para cdigos de elementos, volumes e diferenas finitas, basicamente utilizamos uma
representao discreta (uma malha) de algo real para resolvermos equaes
diferenciais de uma forma aproximada;
Na parte mais interna desse tipo de programa geralmente teremos a soluo de
sistemas de equaes lineares;
Esses sistemas de equaes lineares so resolvidos diversas vezes
CONCLUSO: Uma boa forma de obter ganhos reais de processamento seria acelerar a
soluo do sistema de equaes ou reduzir a quantidade de vezes que ele resolvido.

O esforo em resolver esse sistema de equaes diretamente proporcional a:


Qualidade da discretizao nmero de elementos, arestas, ns
Fsica do problema nmero de graus de liberdade
Acoplamentos condicionamento do sistema
Outros fatores localidade de dados

ou seja, encontramos alguns pontos que podem ser explorados.

32

Algumas formas de pensarmos o paralelismo


Funes
f1 x, y , z , t ...

f 2 x, y, z , t ...

Graus de liberdade
CPU 0
CPU 1

f v x , v y , vz , p , t

CPU 4
CPU 3

M
f n x, y, z , t ...

CPU n

Domnio
f x, y ...

CPU 2
CPU 1
CPU 0

f x, y ...

Note que nos 2 primeiros exemplos o paralelismo fica limitado pelo nmero de funes ou graus
de liberdade que esto sendo resolvidos;

Sabemos que o tamanho da malha est diretamente relacionada ao tamanho do sistema de


equaes;

Uma boa forma de abordar o paralelismo pode ser obtida tratando-se diretamente de nossas
discretizaes;

NOTA: Podemos paralelizar somente o esforo computacional (tarefas), somente os dados do


problema (memria) ou ambos simultaneamente. ... buscaremos sempre tratar de ambos...

33

Introduo ao OpenMP

O que OpenMP?

OpenMP uma API para o desenvolvimento de aplicaes multitarefa (multithread) em ambientes de memria compartilhada;

Consiste de um conjunto de diretivas do compilador e rotinas da


biblioteca;

Relativamente fcil de criar aplicaes multi-tarefa em Fortran, C e


C++

35

Maiores informaes em http://www.openmp.org

Modelo de programao OpenMP

Uma tarefa mestre cria outras equipes de tarefas quando requisitado atravs de
diretivas;

O paralelismo acrescentado incrementalmente ao programa;

O programa serial possui diversos trechos paralelos:

Tarefa mestre
(serial)

Tarefa mestre
(serial)
Regies paralelas

36

Programando em OpenMP

O programador insere diretivas OpenMP (comentrios em Fortran e


#pragma em C) em pontos especficos do cdigo-fonte;

O compilador interpreta essas diretivas e gera chamadas biblioteca para


paralelizar essas regies
Serial:

Paralelo:

void main() {
double x[1000];
for (int i=0; i<1000; i++) {
big_calc(x[i]);
}
}

void main() {
double x[1000];
#pragma omp parallel for
for (int i=0; i<1000; i++) {
big_calc(x[i]);
}
}

Divide as iteraes do lao entre as tarefas


37

Programando em OpenMP

O nmero de tarefas pode ser controlado de dentro do programa ou


definindo-se a varivel de ambiente OMP_NUM_THREADS

O programador responsvel por sincronizar os dados e resolver


as dependncias!!!!

38

Como as tarefas interagem entre si?

Memria compartilhada
As tarefas se comunicam compartilhando os dados da memria (PERIGO!!!)

O compartilhamento no intencional de dados pode criar condies


de competio entre as tarefas;
Para evitar tais situaes utilize sincronizao ou remova TODAS as
dependncias de dados

A sincronizao de dados computacionalmente cara!


Ou seja, REMOVA AS DEPENDNCIAS DE DADOS!!!

39

Importncia da (IN)dependncia de memria

Resolver as dependncias de memria so importantes para:


OpenMP: paralelismo real;
Auto-paralelismo: paralelismo gerado pelo compilador;
Vetorizao;
Pipelining;
OOO: Execuo de instrues fora de ordem;

40

Tipos de dependncia

Dependncia de fluxo:

Variveis lidas e escritas em

Variveis escritas e lidas em

iteraes diferentes

for (j=1; j<MAX; j++) {

iteraes diferentes

for (j=1; j<MAX; j++) {


A[j]=A[j+1];

A[j]=A[j-1];
}

41

Anti-dependncia:

A[1]=A[0];

A[1]=A[2];

A[2]=A[1];

A[2]=A[3];

Tipos de dependncia

Dependncia externa:

Dependncia interna:

Varivel sobrescrita em iteraes

Dependncia no corpo do lao

diferentes

for (j=1; j<MAX; j++) {


A[j]=B[j];

k = 1;
for (j=1; j<MAX; j++) {
A[j]=A[j]+1;

A[j+1]=C[j];

B[k]=A[k]+1;

k = k + 2;
A[1]=B[1];

A[2]=C[1];

A[1]=A[1]+1;
A[2]=B[1];
A[3]=C[1];

42

B[1]=A[1]+1;

OpenMP: Como funciona na prtica?

Suponha o seguinte lao sendo

Em OpenMP o lao ser dividido de tal


maneira que as iteraes pares sejam

executado em 2 threads:

executadas pela thread 1 e as impares


pela thread 2 (veremos mais tarde

!$OMP PARALLEL DO

como controlar a diviso dessas

do i=1,1000

tarefas);

a(i) = a(i+1)**2
enddo
!$OMP END PARALLEL DO

Qual o problema desse lao?

Note que a thread 1 depender de valores


calculados pela thread 2 e vice-versa, ou
seja, as threads sero interdependentes e
competiro por informao (dados).

43

OpenMP: Regras gerais da sintaxe

As construes em OpenMP so em sua maioria diretivas de processamento:

C e C++:
#pragma omp construct [clausula [clausula]...]

Fortran
c#omp construct [clausula [clausula]...]
!#omp construct [clausula [clausula]...]
*#omp construct [clausula [clausula]...]

Como so utilizadas diretivas, os compiladores que no suportam o OpenMP


conseguem compilar programas em OpenMP sem maiores problemas (obviamente
que sero produzidos programas seriais...);

O cdigo-fonte sofre somente pequenas modificaes pela adio das diretivas


OpenMP.

44

OpenMP: Regras gerais

As diretivas de OpenMP s se aplicam blocos estruturados, ou


seja, com incio e fim bem definidos:

C$OMP PARALLEL

C$OMP PARALLEL

10 wrk(id) = junk(id)

10 wrk(id) = junk(id)

res(id) = wrk(id)**2
if (conv(res)) goto 10

30 res(id) = wrk(id)**2
if (conv(res)) goto 20
goto 10

C$OMP END PARALLEL


C$OMP END PARALLEL
print *, id

Bloco estruturado
45

if (not_done) goto 30
20 print *, id

Bloco no-estruturado

Regies paralelas

Construes fundamentais que iniciam a execuo paralela:

Fortran:
c$omp parallel
c$omp& shared(var1, var2, ...)
c$omp& private(var1, var2, ...)
c$omp& firstprivate(var1, var2, ...)
c$omp& reduction(operador|intrinseco: var1, var2, ...)
c$omp& if(expression)
c$omp& default (private|shared|none)
! algum bloco estruturado
c$omp end parallel

46

Diretivas de OpenMP

shared(var1, var2, ...)

private(var1, var2, ...)

Controla como as iteraes dos laos sero distribudas entre as tarefas

reduction(operator|intrinsic:var1, var2, ...)

47

Define o escopo padro das variveis no interior de regio paralela

schedule(type [,chunk])

Somente paraleliza se a expresso for verdadeira

default(shared|private|none)

Variveis privadas que so salvas ao sair da regio paralela

if(expresso)

Variveis privadas que so iniciadas fora da regio paralela

lastprivate(var1, var2, ...)

Cada tarefa mantm sua prpria cpia da varivel dentro da regio paralela

firstprivate(var1, var2, ...)

Variveis compartilhveis entre as tarefas (utilizam a mesma rea de memria)

Garante que a operao de reduo (p. ex., soma global) seja executada de modo seguro

Exemplo de private, default


C$OMP PARALLEL DO SHARED(A)

Cada tarefa tem sua prpria cpia de x


e myid

C$OMP& PRIVATE(MYID,X)
myid=omp_get_thread_num()
x = work(myid)

if (x<1.0) then

A menos que x seja feito privado, seu


valor indeterminado dentro da regio

a(myid) = x

paralela

end if
C$OMP END PARALLEL

Valores de variveis privadas so


indefinidos no inicio e no fim da regio

Equivale a:

paralela

C$OMP PARALLEL DO DEFAULT(PRIVATE)


C$OMP& SHARED(A)

A clausula default automaticamente


torna x e myid privados

48

Exemplo de firstprivate

O firstprivate faz com que as


variveis privadas (local para cada

Executando-se 4 threads o cdigo


produzir:

thread), sejam iniciadas com o ltimo


valor da regio serial
T:1 c=98
program first
integer myid, c

T:2 c=98

c=98

T:0 c=98

C$OMP PARALLEL PRIVATE(MYID) &


C$OMP FIRSTPRIVATE(C)
myid = omp_get_thread_num()
print *, T:,myid,c=,c
C$OMP END PARALLEL
end program
49

T:3 c=98

A clusula schedule(type, [chunk])

Controla como o esforo distribudo entre as threads

chunk usado para especificar o tamanho de cada parcela de esforo


(nmero de iteraes)

type pode ser uma das seguintes opes:


static
dynamic
guided
runtime

50

O argumento chunk opcional.

schedule(static)

As iteraes so divididas igualmente entre as tarefas.


C$OMP PARALLEL DO SHARED(X) PRIVATE(I)
C$OMP& SCHEDULE(STATIC)
do i=1,1000
x(i) = a
enddo

thread 0 (i=1,250)
thread 1 (i=251,500)
thread 0

thread 0
thread 2 (i=501,750)
thread 3 (i=751,1000)

51

schedule(static,chunk)

Divide o esforo em parcelas com o tamanho de chunk.


C$OMP PARALLEL DO SHARED(X) PRIVATE(I)
C$OMP& SCHEDULE(STATIC,1000)
do i=1,12000
x(i) = a
enddo
thread 0
(1,1000),(4001,5000),(8001,9000)

thread 1
(1001,2000),(5001,6000),(9001,10000)

thread 0

thread 2
(2001,3000),(6001,7000),(10001,11000)

thread 3
(3001,4000),(7001,8000),(11001,12000)

52

thread 0

schedule(dynamic,chunk)

Divide o esforo em parcelas de tamanho


chunk

Quando a thread finaliza seu trabalho ela

C$OMP DO SHARED(X) PRIVATE(I)


C$OMP& SCHEDULE(DYNAMIC,1000)
do i=1,10000

assume a prxima

Valor padro de chunk 1

Maior overhead, mas promove um melhor

... trabalho ...

balano de carga

end do

iterao 1
thread 0

iterao 2
iterao 3

thread 1

iterao 4
iterao 5
thread 3

iterao 6
iterao 7

53

thread 2

schedule(guided,chunk)

Similar ao agendamento dinmico porm o tamanho do chunk varia dinamicamente;

O tamanho do chunk depende do nmero de iteraes rfs (teraes restantes)

Alcana um bom balano de carga com um overhead relativamente baixo

Garante que nenhuma thread ficar presa fazendo um alto nmero de trabalho
restante enquanto outras permaneam ociosas
C$OMP DO SHARED(X) PRIVATE(I)
C$OMP& SCHEDULE(GUIDED,55)
do i=1,12000
...trabalho...
end do

54

reduction(operator|intrinsic:var1[,var2])

Realiza um clculo global ou uma

C$OMP DO SHARED(X) PRIVATE(I)

comparao segura;

C$OMP& REDUCTION(+:SUM)
do i=1,n

Uma cpia privada de cada varivel listada


criada e iniciada dependendo do operator
ou intrinsic (p.ex., 0 para +)

sum = sum + x(i)


enddo

Somas parciais e demais operaes so

C$OMP DO SHARED(X) PRIVATE(I)

determinadas pelas threads em paralelo

C$OMP& REDUCTION(MIN:GMIN)
do i=1,n

As somas parciais so adicionadas para se


obter o valor global

Os mnimos parciais so comparados para


obter o valor global

55

gmin = min(gmin,x(i))
enddo

Operaes de reduction

As variveis listadas devem ser shared e fechadas dentro da regio


paralela:
Em Fortran:
operator pode ser +, *, -, .and., .or., .eqv., neqv.
intrinsic pode ser max, min, iand, ior, ieor

Em C:
operator pode ser +, *, -, &, ^, |, &&, ||
ponteiros no so permitidos em operaes de reduo!

56

schedule(runtime)

A distribuio das tarefas definida em tempo de execuo

Depende do valor da varivel de ambiente OMP_SCHEDULE

Esta varivel de ambiente verificada em tempo de execuo, e a diviso de


tarefas consequentemente ajustada;

O mtodo de agendamento padro o static

O tamanho do chunk opcional

til para experimentar os diferente mtodos de distribuio sem


necessidade de recompilao

setenv OMP_SCHEDULE static,1000


setenv OMP_SCHEDULE dynamic

57

OpenMP em mtodos discretos

O OpenMP pode ser facilmente adotado por qualquer cdigo j


existente desde que sejam tomados os devidos cuidados para
solucionar problemas de dependncia de memria;

Qualquer lao onde no haja dependncia de memria pode ser


paralelizado com o OpenMP;

Aconselha-se a insero das diretivas de paralelismo OpenMP de


uma maneira incremental ao programa, do lao mais intenso para o
menos intenso, avaliando-se sempre os efeitos no desempenho do
cdigo;

58

Dependncia de memria em OpenMP (e vetorizao)

Considere o seguinte lao nos elementos da malha sendo executado por 2 threads:

C$OMP PARALLEL DO
do i=1,nel
! recupere os ns do elemento
x(no) = x(no) + a
enddo
C$OMP END PARALLEL DO

Note no exemplo acima que as threads estaro COMPETINDO para modificar o valor da varivel x
para o n 3 pois cada thread estar trabalhando com o seu elemento e os seus dados
correspondentes (ns, vetores, etc...).

CONCLUSO: No exemplo acima as threads no poderiam compartilhar a informao referente


ao n 3

59

Resolvendo a dependncia de memria em malhas

Para resolvemos o problema de dependncia de memria em malhas, basta separarmos os


elementos da malha em blocos de elementos onde no haja o compartilhamento dos ns;

Esse procedimento chama-se colorao ou blocagem de malha

ielm = 0
do icor = 1, ncores
nvec = ielblk(icor)
C$OMP PARALLEL DO
C$OMP& FIRSTPRIVATE(NVEC)
do i = ielm+1, ielm+nvec
! recupere os ns do elemento
x(no) = x(no) + a
enddo
C$OMP END PARALLEL DO
ielm = ielm+nvec
enddo

60

Utilizamos um algoritmo guloso


(greedy) para colorir a malha;
A colorao de malha perturba
qualquer ordenao feita previamente
realizada (RCM)

Produto Matriz vetor EBE ou EDS (OpenMP)

Exemplo para esquema EDS com 1 grau de liberdade


iside = 0
DO iblk = 1, nedblk
nvec = iedblk(iblk)
!DIR$ IVDEP
!$OMP PARALLEL DO
DO ka = iside+1, iside+nvec, 1
neq1 = lm(1,ka)
neq2 = lm(2,ka)
...
! retrieve and multiply 4 coefs.
...
p(neq1) = p(neq1) + ap
p(neq2) = p(neq2) + ap
ENDDO
!$OMP END PARALLEL DO
iside = iside + nvec
ENDDO

61

Diretiva de vetorizao.
Afirma ao compilador que
no bloco a seguir no h
nenhuma dependncia de
dados

Produto matriz-vetor CSR (OpenMP)


!$OMP PARALLEL DO
DO i = 1, n
k1 = ia(i)
k2 = ia(i+1)-1
y(i) = dotproduct(a(k1:k2),x(ja(k1:k2)))
ENDDO
!$OMP END PARALLEL DO

AA(nnz)=
1.
3.
JA(nnz)=
6.
0.
IA(n+1)=
0.

1.

20.
. 3. 4. 5.

1
1

6.

7.

80.
. 9. 10. 11.

4.
0.
1
2
4
1
3
4
5
3
4
0.
7.
3
4
6
8
1
1
9
2
5
7
10
0.
10.
3
6
10
12
13
0.
0.
3
6
2
4
5

Onde n o nmero de linhas da matriz e dotproduct o produto escalar entre a linha da matriz
(a(k1:k2)) e o vetor de entrada.
Para realizar a operao dotproduct normalmente utilizamos a rotina ddot da BLAS
62

12.
5
12

PARALELISMO POR TROCA DE MENSAGENS

Message Passing Interface

Aspectos Gerais

Fcil de entender difcil de implementar:

Bastante verstil/porttil pois funciona em sistemas de memria distribuda


e/ou compartilhada;

Idia bsica:
convertemos um problema grande em vrios problemas menores e atribumos
cada sub-problema a um processador (ou processo);

Vrias cpias idnticas do programa so executadas simultaneamente;

Cada cpia atua em sua poro do problema independentemente;

Partes em comum so sincronizadas atravs de operaes de trocas


de mensagens utilizando as rotinas do MPI;

Paralelismo baseado na chamada de rotinas da biblioteca MPI para a troca


de informaes entre os processos (MPI_BROADCAST, MPI_SEND,

MPI_ALLREDUCE, ...)
64

O que e como paralelizar?

A forma mais intuitiva, e amplamente difundida, de se aplicar o MPI problemas de


mecnica computacional atravs da diviso do domnio em diversos subdomnios
menores e mais fceis de serem calculados. Desta forma, cada processador pode atuar de
forma colaborativa na soluo mais rpida do problema global.

concluso: temos de aprender como particionar um problema adequadamente


65

Peculiaridades do MPI

Enquanto alguns algoritmos podem ser diretamente implementados


no modelo de paralelismo proposto pelo MPI, outros so
particularmente desafiantes, p. ex.:
mtodos baseados em avano de fronteira ou algoritmos no qual o mtodo
segue a fronteira de soluo so bons exemplos no qual o paralelismo com o
MPI requer cuidados especiais.
Avalie o seguinte exemplo:

66

Formas de representao de dados:


Malhas, Grades, Grafos e Matrizes

Matriz esparsa
a1,1
a
2,1
a3,1

a1,2
a22
a3,2

a4,1
a5,1

a6,1
a
7,1

a4,3

a9,2

67

a8,3
a9,3

a10,2

a1,5

a1,6
a2,6

a1,7

a3,4
a4,4
a5,4

a3,8
a4,5
a5,5
a7,5

a1,4

a6,2

a1,3
a2,3
a3,3

a2,10

a4,8
a5,7
a6,6
a7 ,6

a8,4

a6,7
a7,7

a6,10
a8,8

a10,6
a11,3

a2,9
a3,9

a11,8

a9,9

a9,10

a10,9
a11,9

a10,10

Particionamento de malhas e grafos

Dada a seguinte malha e suas possveis representaes, avaliar o seu


particionamento:

Grafo dual

Malha

Grafo nodal
68

matriz

Partio Dual (por elemento)


Malha particionada

Malha

Grafo dual

Note
Noteque
queos
osns
ns33ee44pertencem
pertencemas
asduas
duassub-malhas
sub-malhassimultaneamente,
simultaneamente,ou
ouseja,
seja,
esses
ns
so
ns
de
interface
entre
as
parties;
esses ns so ns de interface entre as parties;
Na
Naprtica,
prtica,teremos
teremosde
demanter
manteras
asinformaes
informaesdos
dosns
nsde
deinterface
interfacedevidamente
devidamente
compatibilizadas
(iguais
ou
sincronizadas)
compatibilizadas (iguais ou sincronizadas)
Concluso:
Concluso:OOvolume
volumede
decomunicao
comunicaoentre
entreas
asparties
partiesdiretamente
diretamenteproporcional
proporcional
ao
nmero
de
ns
de
interface
ao nmero de ns de interface

69

Partio nodal

Alternativamente, poderamos utilizar o grafo nodal para realizarmos


o particionamento. Na prtica, o particionamento dual ou nodal
escolhido de acordo com o nmero de parties que se deseja
produzir.

Malha

70

Grafo nodal

Particionamento de dados
(Aspectos Importantes)

O bom particionamento dever:


Minimizar o volume de comunicao mantendo uma carga (esforo)
computacional balanceado;
Minimizar o volume de comunicao significa minimizar o nmero de cortes de
arestas do grafo (nodal ou dual);
Balancear carga significa distribuir uniformemente o nmero de vrtices do grafo
por partio;

NOTA: sistemas heterogneos, formados por mquinas com capacidades de


processamento distintas, requerem particionamentos desbalanceados
estrategicamente.

71

Qualidade do Particionamento

MUITA comunicao
Carga BALANCEADA

POUCA comunicao
Carga (DES)BALANCEADA
Core I3

Core I7

Ruim ou boa?! Depende do sistema...

POUCA comunicao
Carga BALANCEADA
Core I7

72

Core I7

Particionando uma malha na prtica


10.264.863 elementos
1.858.246 ns

Como eu vou partir isso?


Por onde eu comeo?

73

Softwares para particionamento


de dados

Chaco

Jostle

74

http://wwwcs.unipaderborn.de/fachbereich/AG/monien/RESEARC
H/PART/party.html

Scotch

http://glaros.dtc.umn.edu/gkhome/views/metis/ind
ex.html

PARTY

http://staffweb.cms.gre.ac.uk/~c.walshaw/jostle/

Metis/ParMetis

http://www.cs.sandia.gov/~bahendr/chaco.html

http://www.labri.fr/perso/pelegrin/scotch/

S-Harp

Comparao entre
os algoritmos de
particionamento

75

Comparativo de particionadores

76

Metis

Jostle

Party/DB

Metis

Jostle

Party/DB

Metis

Jostle

Party/DB

Metis

O que a Metis?
Particionador de grafos e malhas;
malhas
Reduz largura de banda de matrizes esparsas;
Extremamente rpido;
Produz parties balanceadas ou no (particionamento ponderado);
Baseado em mtodos de minimizao de corte de arestas;
Desenvolvido em C com interface para Fortran;
Fortran
Possui verso em paralelo (ParMetis);
ParMetis
Gratuita e de cdigo aberto.
Maiores informaes em: http://www-users.cs.umn.edu/~karypis/metis/
Pode ser usada como um programa stand-alone ou biblioteca

77

Malha particionada!

METIS

78

Biblioteca Metis

Particionamento de grafos:

METIS_PartGraphRecursive;

METIS_PartGraphKway;

METIS_PartGraphVKway;

METIS_mCPartGraphRecursive;

METIS_mCPartGraphKway;

METIS_WPartGraphRecursive;

METIS_WPartGraphKway;

METIS_WPartGraphVKway;

Reordenao de matrizes
esparsas
METIS_EdgeND;
METIS_NodeND;
METIS_NodeWND

Rotinas auxiliares:
METIS_MeshToNodal;
METIS_MeshToDual;

79

Particionamento de malhas:

METIS_PartMeshNodal;

METIS_PartMeshDual;

METIS_EstimateMemory.

Usando a Metis
(por onde eu comeo?)

Baixe os arquivos em:


http://glaros.dtc.umn.edu/gkhome/metis/metis/download
Metis-4.0.zip
(precompilaes para Win32)

80

Metis-4.0.tar.gz
(codigo fonte)

Usando a Metis stand-alone


(Exemplo prtico)
arq.msh
10 2
1
2
1
8
1
5
3
1
8
6
5
6
8
6
6 10
8
9
8 11

6
4
8
8
7
9
11
9
11
9

3
3
6
6
3
8
7
11
6
12

C:\partdmesh.exe arq.msh 2

0
0
1
0
0
1
0
1
1
1

arq.msh.epart.2
81

0
0
0
0
1
0
0
1
1
1
1
1

arq.msh.npart.2

Metis para Fortranianos


(usando a biblioteca)
Arquivo libmetis.a

linkar seu programa com a biblioteca


ifort o <meuprog> *.o libmetis.a
82

FAQ (Frequently Asked Questions)

A Metis particiona malhas hbridas (com mais de um tipo de


elemento)?
Sim e no: A Metis particiona preferencialmente GRAFOS, ou seja, a Metis
conseguir particionar a malha desde que seja feita a converso da mesma
para um grafo nodal ou dual.
OBS.: A verso paralela da Metis (ParMetis) possui suporte nativo para
particionamento de malhas hibridas.

Como eu descubro quais so os ns de interface?


A Metis no retorna essa informao explicitamente pois ela bastante
simples de ser obtida. Toda vez que um n estiver contido em uma partio
de numerao diferente daquela referente ao elemento que o n pertence
significa que esse n de interface.

83

Metis: Descobrindo os ns de interface

ie

1
2
3
4
5
6
7
8
9
10

n1

1
1
1
3
8
5
8
6
8
8

n2

n3

n4

2
8
5
1
6
6
6
10
9
11

6
4
8
8
7
9
11
9
11
9

3
3
6
6
3
8
7
11
6
12

part

0
0
1
0
0
1
0
1
1
1

n
1
2
3
4
5
6
7
8
9
10
11
12

part
0
0
0
0
1
0
0
1
1
1
1
1

Note que o n 1 pertence a partio 0 e faz parte do elemento 3 que est na


partio 1, ou seja, o n 1 um n de interface!
84

Indo alm do particionamento

Aps realizarmos o particionamento da malha devemos tentar transformar o


problema original em vrios sub-problemas menores e independentes (a
no ser pelos ns de interface);

Uma boa alternativa renumerar independentemente cada entidade de


malha nas parties criadas, assim teramos uma forma natural de construir
problemas independentes;

Existem diversas tcnicas de se realizar essa reordenao. Aqui trataremos


da forma mais simples;

Note que os dados referentes interface sero replicados para cada


partio;

Em alguns tratamentos mais criteriosos so criadas camadas de elementos


fantasmas (ghosts) com intuito se de minimizar a quantidade de
comunicao entre as parties (no faremos esse tratamento)

85

Reordenao das parties

Aps a reordenao ns teremos como tratar cada partio como se fosse um problema
completamente independente e combinar as informaes da interface somente quando necessrio
86

Tratamento de interface

O que seria melhor:


trocar mensagens grandes ou muitas pequenas?

87

Uma outra alternativa: Utilizao de ghosts

88

Raciocinando em Paralelo

Programas em MPI normalmente possuem um maestro: O rank 0


O rank 0 normalmente controla o fluxo principal do programa
O rank 0 tambm deve ser utilizado em processamento no desperdice
nenhum processador!!!

Programas em MPI devem funcionar tambm em modo serial


(somente 1 processador)

O resultado de uma rodada paralela deve ser igual ao de uma


rodada serial (mas nem sempre idntico!)

DICA DE PROGRAMADOR: Utilize macros de pr-processamento


para produzir verses 100% seriais de seu programa (veremos
exemplos)

89

Construindo programas em MPI

Quem faz o que?

Quem l os dados?

Cada processo l o seu dado ou o rank 0 l e distribui?

O que deve ser comunicado/sincronizado?

Quando eu devo comunicar/sincronizar os processos?

Quem imprimir mensagens na tela?

Quem gravar os arquivos de sada?

Os arquivos de sada devem ser unificados?

...Depurar em MPI a arte de saber escrever mensagens na tela em


trechos estratgicos do programa...

90

Garantindo portabilidade

ifort c fpp foo.f90


program foo
integer :: nprocs, myrank

Cdigo fonte original


program foo

Cdigo serial

#ifdef MPICODE

endif

character*60 message

stop

dimension :: istatus(MPI_STATUS_SIZE)

end program

#endif
::

if (myrank.eq.0) then
! faa algo

include 'mpif.h'

integer

irank=0; nprocs=1

nprocs, myrank

ifort c fpp MPICODE foo.f90

irank=0; nprocs=1
#ifdef MPICODE

program foo

CALL MPI_INIT(ierr)

include 'mpif.h'

CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)

character*60 message

CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)

dimension :: istatus(MPI_STATUS_SIZE)

#endif

integer

if (myrank.eq.0) then

irank=0; nprocs=1

else
! Termine algo iniciado no rank 0
#endif
endif
#ifdef MPICODE
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
call MPI_FINALIZE(ierr)
#endif
stop
end program

91

nprocs, myrank

CALL MPI_INIT(ierr)

! Inicie algo
#ifdef MPICODE

::

CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)

Cdigo paralelo

CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)


if (myrank.eq.0) then
! Inicie algo
else
! Termine algo iniciado no rank 0
endif
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
call MPI_FINALIZE(ierr)
stop
end program

Produto escalar (MPI)


Clculo serial

.82
.8
2
.1
.1
x xgx 2 = .78
.2
.2
2

.3
.3

Clculo paralelo

.8

.1

P0

.1

.2

.01

.09

.64

.3

MPI_ALLREDUCE

.3
P1

92

.12
.1

x0 .3 x0gx0 .32
.82
.8

.22
.2

x1 = .1 x1gx1 .12
.32
.3

.0
4

.01

.0
9

.01

+. 0 9
+. 6 8
.78
.68

+. 0 1
+. 0 9
.78

Produto escalar (MPI) - Algoritmo


function pddot(n,nit,dx,dy)
use mpidefs
! n=numero de valores internos, nit=numero de valores de interface
integer :: n, nit, ddot1, ddot2, drec, pddot
real*8 :: dx(1), dy(1)
#ifdef MPICODE
if (nprocs.ne.1) then
ddot1 = ddot( n,dx( 1),1,dy( 1),1) ! BLAS ddot local
ddot2 = ddot(nit,dx(n+1),1,dy(n+1),1) ! BLAS ddot da interface
CALL MPI_ALLREDUCE( ddot1, drec, 1, MPI_DOUBLE_PRECISION, &
MPI_SUM, MPI_COMM_WORLD, ierr )
pddot = drec + ddot2
! global ddot
else
#endif
pddot = ddot(n,dx(1),1,dy(1),1)
#ifdef MPICODE
endif
#endif
end function
93

Produto Matriz-vetor (MPI)


Matri-Vetor global

Matri-Vetor (MPI)

94

Produto Matriz-Vetor EDS


Algoritmo (MPI)

do ie = 1, nedges
neq1 = lm(1,ie)
neq2 = lm(2,ie)
...
retrieve and multiply 4 coefs.
...
p(neq1) = p(neq1) + ap
p(neq2) = p(neq2) + ap
enddo
#ifdef MPICODE
! Adicionando influencia da interface
call MPI_AllReduce
#endif

95

Paralelismo hbrido: Tratamento dos dados

How do we work with data partitioning and memory dependency?

Particionamento de dados
(Metis)
Distributed memory (MPI)

Mesh coloring
Vectorization (ivdep) and/or
shared memory parallelism
(OpenMP)
Pipelines in Itanium-2 (ivdep)
Data partitioning + Mesh
coloring and vectorization

96

Produto matriz-vetor hbrido (OpenMP+MPI)


iside = 0
DO iblk = 1, nedblk
nvec

= ia_edblk(iblk)

!dir$ ivdep
!$OMP PARALLEL DO
DO ka = iside+1, iside+nvec, 1
...MATVEC computations...
ENDDO
!$OMP END PARALLEL DO
ENDDO
...over interface nodes...
#ifdef MPICODE
call MPI_AllReduce
#endif

97

Element-by-Element

Edge-by-Edge

Outras operaes importantes

Devemos tratar qualquer operao que envolva a aglutinao de


valores nodais (entidade mais primitiva e indivisvel de uma malha e
que compartilhada entre as parties)

Exemplo de outras operaes importantes:


Montagem de resduo;
Avaliao de pr-condicionadores bloco-diagonal nodal.

98

Pr-condicionamento Bloco Diagonal

Os blocos diagonais nodais so naturalmente obtidos em esquemas de


armazenamento EBE e EDS e podem ser utilizados como pr-condicionador (serial
ou paralelo).

A estrutura da matriz bloco diagonal nodal pode ser representada por:

Ax = b
W =

W -1 Ax = W -1 b

Na prtica os blocos diagonais (geralmente matrizes de dimenso ngl x ngl) so


invertidos, bloco-a-bloco e pr-multiplicados pelo vetor RHS antes da chamada do
mtodo iterativo;

No interior do mtodo iterativo a multiplicao do lado esquerdo realizada logo


aps o produto matriz-vetor.

99

Pr-condicionamento Bloco Diagonal (cont.)


subroutine LinearSolution (A, W, x, b)
! Resolve W-1 A x = W-1 b
#ifdef MPICODE
! Globalize blocos de interface
#endif
do i=1,nblocos
! inverta Wi
enddo
! Multiplique W-1 b
call GMRES(A, W, x, b)
! Produto matriz-vetor z A x
! Multiplique W-1 z
end solution

100

Você também pode gostar