Escolar Documentos
Profissional Documentos
Cultura Documentos
Contedo
infinito
incgnitas
analtico
tratamento
limitado aplicabilidade
geralmente no aproximao
finito
numrico
ampla
geralmente sim
Simples, rpido
Pouco flexvel
Flexvel
Flexvel
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
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
11
x 1000
100
Node i
80
Node j
Nodes
60
40
20
0
0
100
200
300
400
500
600
700
x 1000
Edges
12
Data reordering
schemes provided by
EdgePack
13
14
DNS: Dense
DIA: Diagonal;
COO: Coordinate;
Column;
EBE: Element-by-Element;
EDS: Edge-by-Edge
ELL: Ellpack-Itpack;
15
A 6.
0.
0.
0. 0. 2. 0.
4. 0. 5. 0.
0. 7. 8. 9.
0. 10. 11. 0.
0. 0. 0. 12.
Difcil de programar;
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
16
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
5
12
2.
6.
0.
0.
0.
0.
9. 10. 11.
0.
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
19
Dificulta o pr-condicionamento;
EBE: Element-by-Element
t(ngl*nnoel,ngl*nnoel,nel)
Sendo:
nel : nmero de elementos
nnoel: nmero de ns por elemento
ngl : nmero de graus de liberdade
20
21
EDS: Edges-by-Edges
22
23
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
EDS: Edge-by-Edge
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
(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:
26
end do
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
Botando a mo na massa
Por onde eu comeo?
Como me certifico que o programa est rodando corretamente?
27
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...
28
Hibrido: MPI+OpenMP
29
Depende:
Est documentado?
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...
30
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
32
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;
Uma boa forma de abordar o paralelismo pode ser obtida tratando-se diretamente de nossas
discretizaes;
33
Introduo ao OpenMP
O que OpenMP?
OpenMP uma API para o desenvolvimento de aplicaes multitarefa (multithread) em ambientes de memria compartilhada;
35
Uma tarefa mestre cria outras equipes de tarefas quando requisitado atravs de
diretivas;
Tarefa mestre
(serial)
Tarefa mestre
(serial)
Regies paralelas
36
Programando em OpenMP
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]);
}
}
Programando em OpenMP
38
Memria compartilhada
As tarefas se comunicam compartilhando os dados da memria (PERIGO!!!)
39
40
Tipos de dependncia
Dependncia de fluxo:
iteraes diferentes
iteraes diferentes
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:
diferentes
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;
executado em 2 threads:
!$OMP PARALLEL DO
do i=1,1000
tarefas);
a(i) = a(i+1)**2
enddo
!$OMP END PARALLEL DO
43
C e C++:
#pragma omp construct [clausula [clausula]...]
Fortran
c#omp construct [clausula [clausula]...]
!#omp construct [clausula [clausula]...]
*#omp construct [clausula [clausula]...]
44
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
Bloco estruturado
45
if (not_done) goto 30
20 print *, id
Bloco no-estruturado
Regies paralelas
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
47
schedule(type [,chunk])
default(shared|private|none)
if(expresso)
Cada tarefa mantm sua prpria cpia da varivel dentro da regio paralela
Garante que a operao de reduo (p. ex., soma global) seja executada de modo seguro
C$OMP& PRIVATE(MYID,X)
myid=omp_get_thread_num()
x = work(myid)
if (x<1.0) then
a(myid) = x
paralela
end if
C$OMP END PARALLEL
Equivale a:
paralela
48
Exemplo de firstprivate
T:2 c=98
c=98
T:0 c=98
T:3 c=98
50
schedule(static)
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)
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)
assume a prxima
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)
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])
comparao segura;
C$OMP& REDUCTION(+:SUM)
do i=1,n
C$OMP& REDUCTION(MIN:GMIN)
do i=1,n
55
gmin = min(gmin,x(i))
enddo
Operaes de reduction
Em C:
operator pode ser +, *, -, &, ^, |, &&, ||
ponteiros no so permitidos em operaes de reduo!
56
schedule(runtime)
57
58
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...).
59
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
61
Diretiva de vetorizao.
Afirma ao compilador que
no bloco a seguir no h
nenhuma dependncia de
dados
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
Aspectos Gerais
Idia bsica:
convertemos um problema grande em vrios problemas menores e atribumos
cada sub-problema a um processador (ou processo);
MPI_ALLREDUCE, ...)
64
Peculiaridades do MPI
66
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
Grafo dual
Malha
Grafo nodal
68
matriz
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
Malha
70
Grafo nodal
Particionamento de dados
(Aspectos Importantes)
71
Qualidade do Particionamento
MUITA comunicao
Carga BALANCEADA
POUCA comunicao
Carga (DES)BALANCEADA
Core I3
Core I7
POUCA comunicao
Carga BALANCEADA
Core I7
72
Core I7
73
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?)
80
Metis-4.0.tar.gz
(codigo fonte)
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
83
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
85
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
87
88
Raciocinando em Paralelo
89
Quem l os dados?
90
Garantindo portabilidade
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
irank=0; nprocs=1
#ifdef MPICODE
program foo
CALL MPI_INIT(ierr)
include 'mpif.h'
character*60 message
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
::
Cdigo paralelo
.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
Matri-Vetor (MPI)
94
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
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
= 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
98
Ax = b
W =
W -1 Ax = W -1 b
99
100