Técnicas para paralelizaçãoTécnicas para ... Microsoft PowerPoint - Presentation1.ppt [Modo de...
Transcript of Técnicas para paralelizaçãoTécnicas para ... Microsoft PowerPoint - Presentation1.ppt [Modo de...
Técnicas para paralelizaçãoTécnicas para paralelização de aplicaçõesde aplicações
Jorge Barbosa, FEUP-DEI 2008
Í diÍndiceIntroduçãoIntroduçãoTécnicas de paralelização de aplicações
Nível 1: Usando código sequencial
Nível 2: Alteração mínima de código sequencial Nível 2: Alteração mínima de código sequencial
(multithreading)
Nível 3: Alteração significativa de código
sequencial (passagem de mensagens)sequencial (passagem de mensagens)
I t d ãIntroduçãoFormas de obter paralelismo na resolução Formas de obter paralelismo na resolução de problemas (problema)
P l li F i lParalelismo Funcional
Paralelismo de Dados
Pipelining
Modelos de programação (máquina)
P tilh d ó i Partilha de memória
Passagem de Mensagens g g
P l li F i lParalelismo Funcional
Pode executar alpha,b d lbeta e delta emparalelo
v = alpha();w = beta();w = beta();x = gamma(v, w);y = delta();y ()printf ("%6.2f\n", epsilon(x,y));
P l li d d dParalelismo de dadosAplicação da mesma operação sobre Aplicação da mesma operação sobre dados independentes.
For (i = 0; i< 99; i++) For (i 0; i< 99; i++) c[i] = a[i] + b[i]
Pi liPipelineEstratégia:Estratégia:
Dividir o processo em etapas Produzir vários items em simultâneo igual ao Produzir vários items em simultâneo, igual ao número de etapas.
T1
T2
T33
T4T4
Í diÍndiceIntroduçãoIntroduçãoTécnicas de paralelização de aplicações
Nível 1: Usando código sequencial
Nível 2: Alteração mínima de código sequencial Nível 2: Alteração mínima de código sequencial
(multithreading)
Nível 3: Alteração significativa de código
sequencial (passagem de mensagens)sequencial (passagem de mensagens)
Nível 1: Usando código sequencial) P l li d d da) Paralelismo de dadosMesmo ProgramaMesmo ProgramaDados independentes
D d i d d tD1 D2 D3 Dn Dados independentes
Processos iguais
R1 R2 R3 Rn ResultadosR1 R2 R3 Rn Resultados
Nível 1: Usando código sequencial) P l li d d da) Paralelismo de dadosUtilização:Utilização:
~> msub script1~> …~> msub scriptn
Conteúdo dos scripts:Conteúdo dos scripts:<programa> [<parametros>]
Dificuldade:Necessário escrever n scripts- Necessário escrever n scripts
- Necessário efectuar em linha de comando n vezes msubPode ser ultrapassada por programação …p p p g ç
Nível 1: Usando código sequencialb) P tb) Parameter sweep
Mesmo ProgramaMesmo ProgramaParâmetros diferentesD d i iDados iguais
Dados
Processos iguaisParâmetros diferentes
R1 R2 R3 Rn ResultadosR1 R2 R3 Rn Resultados
Nível 1: Usando código sequencialb) P tb) Parameter sweep
Exemplo:Exemplo:Volume de dados 3D (TAC)Cálculo de projecção com varrimento de 360º Cálculo de projecção com varrimento de 360º em intervalos de 5º
Dados de Entrada:
Nível 1: Usando código sequencialb) P tb) Parameter sweep
ResultadoResultado
ScriptScripti=0while [ $i -l 360 ]do
echo "DigitallyReconstructedRadiograph1 $i -o drr_anim$i.png ct_in_vivo.vtk" | msub -o st$i.txti=`expr $i + 5`i= expr $i + 5
done Programa
Entrada (graus)
Saída
Entrada (imagem)
Submissão dos trabalhos
Í diÍndiceIntroduçãoIntroduçãoTécnicas de paralelização de aplicações
Nível 1: Usando código sequencial
Nível 2: Alteração mínima de código sequencial Nível 2: Alteração mínima de código sequencial
(multithreading)
Nível 3: Alteração significativa de código
sequencial (passagem de mensagens)sequencial (passagem de mensagens)
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Processadores MulticoreProcessadores MulticoreMemória partilhada
Memória Global PartilhadaMemória Global PartilhadaMemória Global PartilhadaMemória Global Partilhada
cachecacheNó deComputaçãocachecache cachecache cachecache
corecore11
corecore22
corecore33
corecore44
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Paralelismo fork/joinParalelismo fork/joinMaster Thread Implementação:
Pthreads APIfork
Other threadsPthreads API
Tim j iBoas Notíciasm
e join
fork
OpenMP para C e Fortran
join Ver:openmp.org
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Exemplo 1Exemplo 1for (i = 0; i < N; i++)
a[i] = b[i] + c[i];a[i] = b[i] + c[i];
#pragma omp parallel forfor (i = 0; i < N; i++)
a[i] = b[i] + c[i];
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Exemplo 2
f (i 0 i i )
Exemplo 2
for (i = 0; i < n; i++)for (j = 0; j < n; j++)
a[i][j] MIN(a[i][j] a[i][k]+tmp)a[i][j] = MIN(a[i][j],a[i][k]+tmp);
#pragma omp parallel for private(j)for (i = 0; i < n; i++)
for (j = 0; j < n; j++)a[i][j] = MIN(a[i][j],a[i][k]+tmp);
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Exemplo 2
f (i 0 i i )
Exemplo 2
for (i = 0; i < n; i++)for (j = 0; j < n; j++)
a[i][j] MIN(a[i][j] a[i][k]+tmp)a[i][j] = MIN(a[i][j],a[i][k]+tmp);
#pragma omp parallel for private(j)for (i = 0; i < n; i++)
for (j = 0; j < n; j++)a[i][j] = MIN(a[i][j],a[i][k]+tmp);
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Funções específicas Funções específicas
Especificar número de threads:void omp_set_num_threads (int t)
Obter número de cores:Obter número de cores:int omp_get_num_procs (void)
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Calculo de π por integração Calculo de π por integração
double area, pi, x;int i, n;,...area = 0.0;for (i = 0; i < n; i++) {
x = (i+0.5)/n;area += 4 0/(1 0 + x*x);area += 4.0/(1.0 + x*x);
}pi = area / n;p
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Calculo de π por integração com OpenMP -Calculo de π por integração com OpenMP -Solução 1
double area, pi, x;int i, n;...area = 0.0;#pragma omp parallel for private(x)#pragma omp parallel for private(x)for (i = 0; i < n; i++) {
x = (i+0.5)/n;( )/ ;area += 4.0/(1.0 + x*x);
}pi = area / n;
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Calculo de π por integração com OpenMP -Calculo de π por integração com OpenMP -Solução 2
double area, pi, x;int i, n;...area = 0.0;#pragma omp parallel for private(x)#pragma omp parallel for private(x)for (i = 0; i < n; i++) {
x = (i+0.5)/n;#pragma omp critical
area += 4.0/(1.0 + x*x);}}pi = area / n;
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Calculo de π por integração com OpenMP -Calculo de π por integração com OpenMP -Solução 3
d bl idouble area, pi, x;int i, n;...area = 0.0;#pragma omp parallel for
private(x) reduction(+:area)for (i = 0; i < n; i++) {
(i + 0 5)/x = (i + 0.5)/n;area += 4.0/(1.0 + x*x);
}}pi = area / n;
Nível 2: Alteração mínima de código i l ( ltith di )sequencial (multithreading)
Compiladores com suporte OpenMPCompiladores com suporte OpenMPVendor/Source Compiler
(4 2)GNU gcc (4.2)
IBM XL C/C++ / Fortran
Sun Microsystems C/C++ / Fortran
INTEL C/C++ / Fortran
Portland Group Compilers and Tools C/C++ / Fortran
Absoft Pro FortranMP Fortran
Lahey/Fujitsu Fortran 95 C/C++ / Fortran
PathScaleC/C++ / Fortran
Microsoft Visual Studio 2005 e 2008
Í diÍndiceIntroduçãoIntroduçãoTécnicas de paralelização de aplicações
Nível 1: Usando código sequencial
Nível 2: Alteração mínima de código sequencial Nível 2: Alteração mínima de código sequencial
(multithreading)
Nível 3: Alteração significativa de código
sequencial (passagem de mensagens)sequencial (passagem de mensagens)
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Arquitectura de um clusterArquitectura de um clusterMemória Global PartilhadaMemória Global Partilhada Memória Global PartilhadaMemória Global Partilhada
Memória Global PartilhadaMemória Global Partilhada Memória Global PartilhadaMemória Global Partilhada
dere
d
Memória Global PartilhadaMemória Global Partilhada Memória Global PartilhadaMemória Global Partilhada
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Programação por Passagem de MensagensProgramação por Passagem de MensagensMPI – Message Passing Interface
Processo 2Processo 2Processo 1Processo 1
rankrank rankrank(0)(0) (1)(1)mensagens
MPI_SendMPI_Send MPI_RecvMPI_Recv
mensagens
MPI_SendMPI_SendMPI_RecvMPI_Recv
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Principais características do MPI para suportar paralelismo p p p pnuma arquitectura de memória distribuída:
Rotinas para troca de mensagens:Rotinas para troca de mensagens:Identifica processos emissor/receptorComunicações ponto-a-pontoComunicações colectivasComunicações colectivas
Rotinas para sincronização
Tipos de dados derivados para facilitar o envio na mesma mensagens de dados não contíguos na memória
Facilidade de definir subconjuntos de processosFacilidade de definir subconjuntos de processos
Possibilidade de criar topologias de processos
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Estrutura básica de um programa
#include “mpi.h”
Estrutura básica de um programa
int main (){
MPI Init ()MPI_Init ()………processamento………
MPI_Finalize ()
processamento adicional e localnão pode invocar mais rotinas MPI…………………
}
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Exemplo: comunicação em Anel#include <stdio.h>#include "mpi.h"
i t i ( i t h ** )
Exemplo: comunicação em Anel
int main( int argc,char **argv ){ int rank, value, size;
MPI_Status status;
MPI_Init( &argc, &argv );_ ( g , g );MPI_Comm_rank( MPI_COMM_WORLD, &rank );MPI_Comm_size( MPI_COMM_WORLD, &size );do {
if (rank == 0) {f( "%d" & l )scanf( "%d", &value );
MPI_Send( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD );}else {
MPI Recv( &value, 1, MPI INT, rank - 1, 0, MPI COMM WORLD, &status );MPI_Recv( &value, 1, MPI_INT, rank 1, 0, MPI_COMM_WORLD, &status );if (rank < size - 1)
MPI_Send( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD );}printf( "Process %d got %d\n", rank, value );
} while (value >= 0);
MPI_Finalize( );return 0;
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Principais instruçõesMPI_Init: Inicializa o MPI
MPI Finalize: Finaliza o MPI
Principais instruções
_ a e a a o
MPI_Comm_size: número de processos criados
MPI Comm rank: qual o número de processo (0 a N-1)_ _ q p ( )
MPI_Send: Envio de mensagem
MPI Recv: Recepção de mensagem_ pç g
MPI_Bcast: Broadcast de mensagem
MPI Scatter: Distribuição de vectores e matrizes _ ç
MPI_Gather: Recolha de vectores e matrizes
MPI_Reduce: Operação de redução_ p ç ç
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Alternativa à programação directa com Alternativa à programação directa com MPI
Usar bibliotecas que usam MPIq
Exemplos:Exemplos:PBLASParallel Basic Linear Algebra SubprogramsParallel Basic Linear Algebra SubprogramsNível 1: Operações com vectoresNível 2: Operações Matriz VectorNível 2: Operações Matriz-VectorNível 3: Operações Matriz-Matriz
Nível 3: Alteração significativa de código i l ( d )sequencial (passagem de mensagens)
Exemplos:Exemplos:ScaLAPACKDense and band matrix software
PARPACK and ARPACK Large sparse eigenvalue software
CAPSS and MFACTCAPSS and MFACTSparse direct systems software
ParPre ParPre Preconditioners for large sparse iterative solvers
The NAG Parallel LibrarySolution of dense, banded and sparse linear equations Solution of eigenvalue problems Minimization of unconstrained nonlinear least squares and general nonlinear problems Fast Fourier transforms Fast Fourier transforms Numerical integration Random number generation Matrix operations and data distribution utilities