SlideShare ist ein Scribd-Unternehmen logo
1 von 96
Downloaden Sie, um offline zu lesen
Programação Paralela e
      Distribuída
     ERAD-SP 2010

     31 de julho de 2010
    Liria Matsumoto Sato
    liria.sato@poli.usp.br
Apresentação
• Introdução
• Arquiteturas Paralelas
• Programação Paralela para computadores com
  memória compartilhada
• Programação paralela para sistemas
  distribuídos
• Conclusão

Ferramentas: CPAR e MPI
Download CPAR e exemplos de programas:
http://regulus.pcs.usp.br/~lms/eradsp.html
Introdução
Visão do Mundo atual:

• Crescimento contínuo da demanda por
  processamento
• Necessidade de compartilhamento de
  Informação e de recursos
• Acesso a recursos computacionais de alto
  desempenho

Computação de alto desempenho: busca de
 soluções
Introdução
Aplicações envolvendo grande capacidade de
  processamento:
• meteorologia
• simulação de fenômenos físicos
• visualização científica
• modelagem das variações climáticas globais em
  longos períodos
• genoma humano
• dinâmica de fluídos
• Estrutura e Dinâmica molecular
Figura extraída de www.top500.org.br (acesso em maio de 2010)

Demanda crescente →computadores mais potentes
Como obter alto desempenho

• Aumento do desempenho do processador
  • aumento do clock ⇒ aumento de temperatura
  • melhorias na arquitetura


• Processamento Paralelo:
  • Múltiplas unidades de processamento
  • Paralelização da aplicação
Processamento Paralelo
Utilização de múltiplos processadores

             P                    P


           Cache              Cache




                 Memória global
Processamento Paralelo
Paralelização da aplicação em múltiplas
 tarefas




        Tarefa1   Tarefa2   Tarefa3
Processamento Paralelo
      Paralelismo de dados


dados 1   dados 2   dados 3   dados 4 dados 5




 P1        P2        P3        P4      P5
Processamento Paralelo
Multi-core: multiplos núcleos no chip.
 AMD, INTEL: quad-core, hexa-core processor
       NEHALEN : quad-core, hexa-core
  IBM: CELL
  NVIDIA, ATI: GPUs (Graphics Processing
 Unit)

Computadores com arquitetura paralela
Multi-core
• NEHALEM
Arquitetura CELL




Extraído de http://www.research.ibm.com/cell/heterogeneousCMP.html
GPU




Geforce 8800 GTX [figura extraída de ¨Programming Massively Parallel
Processors: a hands-on Aproach. David B. Kirk; Wen-mei Hwu. Elsevier
Inc.
Processadores GPU
nVIDIA Tesla S1070: 4 GPUs
4 TFlops (ponto flutuante precisão simples)
345 Gflops (ponto flutuante precisão dupla)
4 GB memória dedicada
Arquiteturas Paralelas
Arquiteturas Paralelas: caracterizadas pela
  presença de múltiplos processadores que
  cooperam entre si na execução de um
  programa.
Década 1960 : ILLIAC IV (SIMD)
SIMD: todos os processadores executam a
  mesma instrução sobre dados distintos
MIMD: os processadores podem executar
  instruções distintas sobre dados distintos
   – Multiprocessadores
   – Multicomputadores: clusters
Arquiteturas Paralelas
       Multiprocessadores


        memória compartilhada




P1        P2          P3        P4


M         M           M         M
Arquiteturas Paralelas
             Cluster


    Switch             LAN
    10GbE
Aplicação
• Como paralelizar
• Como programar
Linguagens e compiladores específicos:
- multi-core, multiprocessadores: OpenMP, CPAR
      memória compartilhada
- clusters:
      memória distribuída:
      MPI (Message Passage Interface):
         - diversas implementações disponíveis
              MPICH, OPENMPI
Desenvolvimento de aplicações
Definir solução com processamento paralelo:
• Paralelização de sequências de instruções
• Paralelização de laços
• Algumas aplicações exigem soluções mais
  complexas:
  – Partes da aplicação envolvem cálculos
    dependentes de cálculos anteriores
  – Partes da aplicação exigem uma ordenação na
    geração de resultados
Exemplo com paralelização de
              laços
#pragma pfor iterate (i=0;          forall i = 0 to MAXRET      {
MAXRET; 1)                           x = ((i-0.5) * largura);
for (i = 0; i < MAXRET; i++)                 /* calcula x */
   {
   x = ((i-0.5) * largura);         local_pi=local_pi+(4.0/(1.0+
        /* calcula x */             x* x));
   local_pi = local_pi + (4.0 / (     local_pi = local_pi *
1.0 + x * x));                      largura;
   }                                  lock (&semaforo);
 local_pi = local_pi * largura;       total_pi = total_pi +
#pragma critical                    local_pi;
 {                                    unlock (&semaforo);
 total_pi = total_pi + local_pi;      }
 }                                  }
Programação paralela para
       sistemas com memória
            compartilhada
Sistemas com memória compartilhada:
• computadores multiprocessadores
  (processadores multicore ou não)
• Computadores com processador multicore.


Ferramenta didática: linguagem CPAR
  – Extensão da linguagem C
Paralelização de seqüências de
            instruções

• Múltiplas tarefas simultâneas: macrotarefas
• Paralelização do programa em blocos
  paralelos
• Laços e blocos paralelos
• CPAR:
  – Múltiplas tarefas simultâneas
  – laços e blocos paralelos dentro de uma tarefa
  – Blocos paralelos na função main
Múltiplas tarefas simultâneas


            tarefa1      tarefa2      tarefa3




 Macrotarefas: são procedimentos especiais

Tempo execução seqüencial=ttarefa1 + ttarefa2 + ttarefa3
Tempo execução paralela=max(ttarefa1 , ttarefa2 , ttarefa3)
Macrotarefas
#include <stdio            task body tarefa2()
task spec tarefa1();       { int i;
task spec tarefa2();          for (i=0;i<199;i++)
task spec tarefa3();            { printf(“%c”,’b’);
task body tarefa1()                 fflush(stdout);}
{ int i;                   }
   for (i=0;i<199;i++)     task body tarefa3()
     { printf(“%c”,’a’);   { int i;
         fflush(stdout);      for (i=0;i<199;i++)
      }                          {printf(“%c”,’c’);
}                                    fflush(stdout);}
Macrotarefas
main()
{ printf(“INICIO TESTEn”);
   alloc_proc(4);
   create 1,tarefa1();
   create 1,tarefa2();
   create 1,tarefa3();
 }
Paralelização da função principal
blocos paralelos na função principal
  cada bloco:
  – Blocos
  – Tarefas
  – Elementos Seqüenciais
                                    bloco 1




  bloco 1   bloco 2   bloco 3   bloco 1a   bloco 1b   bloco 1c


                                           blocos paralelos
“seq1”



tar1    tar2         tar3   tar4


       “seq2”


tar5   tar6                 “seq3”
Blocos Paralelos (CPAR)
• comando cobegin ... also ... coend
• restrição: presente apenas na função
  main()
   main()
    { ...
       cobegin
          .....
          also
          ......
          also
          .......
       coend
        ......
     }
sincronização de tarefas
• espera pelo término de uma tarefa
     wait_task(nome_tarefa);
     exemplo: wait_proc(tarefa1);

• espera pelo término de todas tarefas em
  execução
     wait_all()
Laços Paralelos: Paralelismo
       homogêneo

   forall i=1 to max{
     a[i]=b[i]+1;
     c[i]=c[i]+a[i];
   }
CPAR: laços paralelos internos a uma macrotarefa
Exemplo
#include <stdio.h>         task body tarefa2()
task spec tarefa1();       {int i;
task spec tarefa2();        for(i=0;i<10;i++)
                            {printf("%c",'b');
task body tarefa1()          fflush(stdout);
{int i;                     }
 for(i=0;i<10;i++)         }
 {printf("%c",'a');        main()
  fflush(stdout);          {printf("INICIO TESTEn");
 }                          alloc_proc(2);
}                           create 1,tarefa1();
                            wait_task(tarefa1);
                            create 1,tarefa2();
                           }
Paralelismo heterogêneo
  parbegin
   a=a+sqr(b);
   x=x*2;
  also
  c=c+sqr(c);
  y=y+1;
  parend

CPAR: blocos paralelos dentro de uma
 macrotarefa
memória compartilhada
Cada processo pode ter uma porção de
 memória privada.
Algumas locações de memória podem ser:
  • acessadas por 2 ou mais processos,
    referenciadas no programa através de
    variáveis compartilhadas, promovendo a
    comunicação entre os processos.
memória compartilhada
O sistema CPAR permite o uso de:
· variáveis privadas (locais)
· variáveis compartilhadas:
        shared int A;

- Variáveis compartilhadas entre macrotarefas
    declaração na área de declarações de
   variáveis globais

- Variáveis compartilhadas pelas microtarefas de
   uma macrotarefa
   declaração na área de declarações de variáveis
   da macrotarefa
Laço Paralelo: exemplo
                iniciação de uma matriz
#include <stdio.h>            main()
shared float a[1000][1000];   { alloc_proc(4);
task spec inic_mat();            printf(“inicia matrizn”):
task body inic_mat()             create 4,inic_mat();
{int i,j;
                                 wait_proc(inic_mat);
  forall i=0 to 999
                                 printf(“iniciacao
   {
                                  efetuadan”);
     for(j=0;j<1000;j++)
                               }
          a[i][j]=i+2*j;
   }
 }
Laço Paralelo
• CPAR: iterações são particionadas
  uniformemente (pré-scheduling)
• pré-compilador: gera código para tratar o
  particionamento
• em outros sistemas: self-scheduling
  (distribuiçao dinâmica de blocos de tamanho
  definido), guided self-scheduling (similar ao
  self-scheduling, com calculo dinâmico do
  tamanho dos blocos)
Exclusão Mútua
Processamento exclusivo de processos é necessário
  para que recursos possam ser compartilhados sem
  interferências mútuas.

Exemplo: Em um programa um contador (COUNT) é
  compartilhado e incrementado por mais de um
  processo.

COUNT = COUNT + 1

LD COUNT
ADD 1
STO COUNT
Exclusão mútua
Se 2 processos executarem esta seqüência, pode
  ocorrer:

LD COUNT      {processo 1}
LD COUNT      {processo 2}
ADD 1         {processo 2}
STO COUNT     {processo 2}
ADD 1         {processo 1}
STO COUNT     {processo 1}

COUNT: incrementado apenas de 1.
Solução: encerrar a seqüência de instruções em uma
  seção crítica.
Exclusão mútua

Seção crítica: seqüência de códigos executada
  ininterruptamente, garantindo que estados
  inconsistentes de um dado processo não
  sejam visíveis aos restantes. Isto é realizado
  utilizando mecanismos de exclusão mútua.

exclusão mútua: implementação com
  semáforos binários
Semáforos
Em CPAR:
declaração de semáforo: global ou local a
  macrotarefa
shared Semaph nome_semaforo;
Ex: shared Semaph X;
criação : create_sem(&nome_semafor,valor_inicial);
 Ex: create_sem(&X,1);
remoção: rem_sem(&nome_semaforo);
 Ex: rem_sem(&X);
operação P: lock(&nome_semaforo);
 Ex: lock(&X);
operação V: unlock(&nome_semaforo);
 Ex: unlock(&X);
Semáforo Binário
shared Semaph X;

create_sem(&X,1);

lock(&X);

unlock(&X);

rem_sem(&X);
Exemplo: seção crítica
task body tarefa()
{shared Semaph A;
 int i;
 create_sem(&A,1);
 forall i=0 to 99
   { ....
      lock(&A);
      COUNT=COUNT+1;
      unlock(&A);
      .....
     }
   ......
   rem_sem(&A);
  }
Threads
• thread: é um fluxo de controle seqüencial
  em um programa.
• programação multi-threaded: uma forma
  de programação paralela onde vários
  threads são executados concorrentemente
  em um programa. Todos threads
  executam em um mesmo espaço de
  memória, podendo trabalhar
  concorrentemente sobre dados
  compartilhados.
multi-threaded X multi-processing
• multi-threaded programming: todos os
  threads compartilham o mesmo espaço de
  memória e alguns outros recursos, como
  os descritores de arquivos.
• multi-processing: processos executam
  sobre seu próprio espaço de memória. O
  compartilhamento de dados se obtém
  através de funções que fazem com que
  endereços lógicos apontem para o mesmo
  endereço físico.
Pthreads
• POSIX : Pthreads
• Exemplo: pi-pthreads.c
• Compilação:
gcc –o pi-pthreads pi-pthreads.c -lpthread
OpenMP
• spec25.pdf : www.openmp.org/mp-
  documents/spec25.pdf
• Diretivas
#pragma omp directive-name [clause[ [,] clause]...]
  new-line
Região paralela:
#pragma omp parallel

Compilação:
gcc –o pi-openmp pi-openmp.c -fopenmp
icc –o pi-openmp pi-openmp.c -openmp
Exemplos: pi-openmp.c
Seções: omp-section.c
Redução: pi-openmp-reduction.c
pi - openmp
int main()
{
.....
omp_set_num_threads(4);
#pragma omp parallel shared (total_pi,largura) private(i,x,local_pi)
{
#pragma omp for
 for (i = 0; i < MAXRET; i++)
   { x = ((i-0.5) * largura);        /* calcula x */
    local_pi = local_pi + (4.0 / ( 1.0 + x * x));
    }
  local_pi = local_pi * largura;
printf("LOCAL-PI %lfn",local_pi);
#pragma omp critical
  {
  total_pi = total_pi + local_pi;
.....
}
pi-openmp-reduction
omp_set_num_threads(4);
#pragma omp parallel shared (largura) private(i,x) reduction(+:y)
{
#pragma omp for
 for (i = 0; i < MAXRET; i++)
  { x = ((i-0.5) * largura);       /* calcula x */
   y = y + (4.0 / ( 1.0 + x * x));
   }

}
total_pi = y * largura;
  printf("TOTAL-PI %lfn",total_pi);
}
omp-section
 omp_set_num_threads(2);
#pragma omp parallel sections
  {
#pragma omp section
  { printf("secao 1n");
    for (i=0;i<20000;i++)
     {printf("a");
      fflush(stdout);
     }
  }
#pragma omp section
  { printf("secao 2n");
      for (i=0;i<20000;i++)
     {printf("b");
      fflush(stdout);
     }
  }
}
Sistemas Distribuídos
• Não possui memória compartilhada
• Bibliotecas: PVM, MPI
• Sistemas DSM (distributed shared
  memory): simula memória compartilhada,
  permitindo a programação no paradigma
  de variáveis compartilhadas
Sistemas Distribuídos:
  Programação com bibliotecas
• PVM (parallel virtual machine)
• MPI (message passage interface)
• programação utilizando passagem de
  mensagem
Modelo de computação: spmd
   (single program multiple data)

• todos os nós executam o mesmo
  programa sobre dados múltiplos
0 .....9   10...19   20....29


    nó 1    nó 2      nó 3
modelo de computação:
  esquema mestre escravo com
            spmd
• esquema mestre-escravo utilizando spmd:
  todos executam o mesmo programa,
  sendo que através de um controle interno
  ao programa um nó executa a função
  mestre eos demais são escravos.
Modelo de computação

                  Mestre




escravo 1   escravo 2       escravo N




                   Mestre
Grupos de tarefas
                                        Mestre




                                      escravo 2             Mestre
                Mestre




                                                  escravo            escravo
escravo 1   escravo 2      escravoN




                                                            Mestre
                 Mestre




            Tarefa                    Mestre

            Grupo de Tarefas
Exemplo : Soma dos elementos
         de um vetor

                   Processo Mestre




    escravo 1   escravo 2            escravo N
Para obter um bom desempenho

• Use granularidade grossa

• minimize o # de mensagens

• maximize o tamanho de cada mensagem

• use alguma forma de Balanceamento de
 carga
MPI



OPEN MPI
http://www.open-mpi.org/
MPI
• Processos: são representados por um único
  “rank”(inteiro) e ranks são numerados 0, 1, 2
  ..., N-1. (N = total de processos)
• Enter e Exit
MPI_Init(int *argc,char *argv);
MPI_Finalize(void);
• Quem eu sou?
MPI_Comm_rank(MPI_Comm comm,int *rank);
• informa total de processos
MPI_Comm_size(MPI_Comm comm,int *size);
Programa MPI - SPMD
#include <mpi.h>
........

main(argc, argv)
int            argc;
char                   *argv[];
{
    int        size, rank;
    MPI_Status status;
     .......

// Initialize MPI.
    MPI_Init(&argc, &argv);
    .........
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    ......
Programa MPI - SPMD
if (0 == rank)           // rank = 0
     {
        ..........

     }
    else                 // rank > 0
    {
           ...........

    }

    MPI_Finalize();
    return(0);
}
MPI

• Enviando Mensagens
MPI_Send(void *buf,int count,MPI_Datatype
  dtype,int dest,int tag,MPI_Comm comm);
• Recebendo Mensagens
MPI_Recv(void *buf,int count,MPI_Datatype
  dtype,int source,int tag,MPI_Comm
  comm,MPI_Status *status);
status: status.MPI_TAG
        status.MPI_SOURCE
Exemplo: enviando mensagens
// rank 0, send a message to rank 1.
    if (0 == rank) {
          for (i=0;i<64;i++)
           buf[i]=i;
        MPI_Send(buf, BUFSIZE, MPI_INT, 1, 11, MPI_COMM_WORLD);
    }

 // rank 1, receive a message from rank 0.
   else {
        MPI_Recv(buf, BUFSIZE, MPI_INT, 0, 11, MPI_COMM_WORLD,
                          &status);
           for(i=0;i<64;i++)
          { printf("%d",buf[i]);
          fflush(stdout);}
           printf("n");
   }
MPI – compilação e execução
• Compilação (openmpi)
mpicc -o trivial trivial.c
mpiCC –o trivial trivial.cpp

execução: mpirun -np 2 –hosts trivial

hosts: arquivo contendo os IPs ou nomes dos
  nós
Comunicação
• Comunicação ponto a ponto: uma
  origem e um destino
  – Envio bloqueante
  – Recepção bloqueante
  – Envio não bloqueante
  – Recepção não bloqueante


• Comunicação Coletiva
Envio Padrão Bloqueante
• O comportamento do sistema depende do
  tamanho da mensagem, se é menor ou igual
  ou maior do que um limite. Este limite é
  definido pela implementação do sistema e do
  número de tarefas na aplicação.
• mensagem<= limite
    MPI_Send


S
R

           buffer interno do
           receptor            MPI_Recv
Envio Padrão Bloqueante
• mensagem>limite

  MPI_Send
             espera



                           espera
                      MPI_Revc
Programação: modelo mestre-escravo em SPMD

void main()
int     argc;
char *argv[];
{ int myrank;
   MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
if (myrank==0) {master();}
 else { slave();}
 MPI_Finalize();
 return(0);
}
Exemplo: soma de elementos de
    um vetor (MPI_Send)
k=n/n_nos;
    inicio=rank*k;
    fim=inicio+k;
    if (rank==0) {
      for(i=inicio;i<n;i++)
        vetor[i]=1;
      for (i=1;i<n_nos;i++)
        MPI_Send(vetor+k*i,k,MPI_INT,i,10,MPI_COMM_WORLD);
    }
    else {

  MPI_Recv(vetor,k,MPI_INT,0,10,MPI_COMM_WORLD,&status);
   }
   soma_parcial=0;
   for(i=0;(i<k);i++)
     soma_parcial+=vetor[i];
Exemplo: soma de elementos de
       um vetor (MPI_Send)
if (rank==0) {
        soma_total=soma_parcial;
        for(i=1;i<n_nos;i++){
          MPI_Recv(&soma,1,MPI_INT,MPI_ANY_SOURCE,11,
                     MPI_COMM_WORLD,&status);
          soma_total+=soma;}
        }
      else {
        MPI_Send(&soma_parcial,1,MPI_INT,0,11,MPI_COMM_WORLD);
          }
    MPI_Finalize();
    return(0);
Envio Bloqueante
• Padrão:
MPI_Send(&buf,n_elementos,MPI_INT,dest, tag,
 MPI_COMM_WORLD)
• Blocking Syncronous Send :
MPI_Ssend (&buf,n_elementos,MPI_INT,
  dest, tag, MPI_COMM_WORLD)
• tarefa transmissora: envia para a tarefa
  receptora uma mensagem “ready to send”.
• tarefa receptora: ao executar uma chamada
  receive, envia para a tarefa transmissora uma
  mensagem de “ready to receive”.
• Os dados são transferidos.
Envio Bloqueante
• Blocking Ready Send
MPI_Rsend (&buf,n_elementos,MPI_INT,
dest, tag, MPI_COMM_WORLD)
• envia a mensagem na rede.
• Requer que uma notificação de “ready to
  receive” tenha chegado.
• Notificação não recebida: erro.
Envio Bloqueante
• Blocking Buffered Send
MPI_Bsend(&buf,n_elementos,MPI_INT,
dest, tag, MPI_COMM_WORLD )
• Aplicação deve prover o buffer: array alocado
  estaticamente ou dinamicamente com malloc.
  Deve ser incluido bytes do header.
• MPI_Buffer_attach( ... )
• Dados do buffer de mensagem copiados para
  buffer do usuário. Execução retorna.
• O dado será copiado do buffer do usuário sobre
  a rede quando uma notificação de “ready to
  receive”tiver chegado
• MPI_Buffer_detach( ... )
Recepção Bloqueante
• MPI_Recv(&a,10,MPI_INT,origem,tag,MPI
  _COMM_WORLD,&status)
  bloqueante: receptor fica bloqueado até
  receber a mensagem.
  tag: pode ser MPI_ANY_TAG (qualquer tag)
  origem: pode ser MPI_ANY_SOURCE
  (qualquer origem)
  status: 2 campos
     status.source: origem da mensagem
     status.tag: tag da mensagem
Recepção: outras funções
• MPI_Probe(in source,int tag,MPI_Comm
  comm,MPI_Status *status)
  Sincroniza uma mensagem e retorna
  informações. Não retorna até que uma
  mensagem seja sincronizada.
• MPI_Get_count(MPI_Status *status,MPI_Data
  type dtype,int *count)
  Retorna o número de elementos da mensagem
  recebida.
  uso: quando não se conhece o tamanho da
  mensagem a ser recebida. Mensagem
  sincronizada com MPI_Probe.
Funções de comunicação não
       bloqueantes

• chamadas não bloqueantes retornam
  imediatamente após o início da
  comunicação. O programador não sabe
  se o dado enviado já saiu do buffer de
  envio ou se o dado a ser recebido já
  chegou. Então, o programador deve
  verificar o seu estado antes de usar o
  buffer.
Comunicação não bloqueante
• envio: retorna após colocar o dado no
  buffer de envio.
MPI_Isend(void *buf,int count,MPI_Datatype
  dtype,int dest,int tag,MPI_Comm
  comm,MPI_Request *req)
req: objeto que contém informações sobre a
  mensagem, por exemplo o estado da
  mensagem.
Comunicação não bloqueante
• Recepção: é dado o início à operação de
  recepção e retorna.
MPI_Irecv(void *buf, count,MPI_INT, origem,
 tag, MPI_Comm comm, MPI_Request
 *req)
• Dados: não devem ser lidos enquanto não
  estiverem disponíveis
  Verificação: MPI_Wait ou MPI_Test.
Comunicação não bloqueante
MPI_Wait(MPI_Request *req,MPI_Status *status)
Espera completar a transmissão ou a recepção.
MPI_Test(MPI_Request *req,int *flag,MPI_Status
  *status)
Retorna em flag a indicação se a transmissão ou
  recepção foi completada. Se true, o argumento
  status está preenchido com informação
MPI_Iprobe(int source,int tag,MPI_Comm
  comm,int *flag,MPI_Status *status)
Seta flag, indicando a presença do casamento da
  mensagem.
Comunicação não bloqueante
if (rank==0) {
 ............

MPI_Isend(&a[0][0]+(k*n*i),k*n,MPI_DOUBLE,i,10,MPI_COMM_WO
RLD,&req);
printf("rank 0 apos Sendn");
fflush(stdout);
.......

}
else {

MPI_Recv(a,k*n,MPI_DOUBLE,0,10,MPI_COMM_WORLD,&status);

...........

}
Comunicação coletiva

MPI_Bcast(void *buf,int count,MPI_Datatype
  dtype,int root,MPI_Comm comm);
• todos processos executam a mesma
  chamada de função.
• Após a execução da chamada todos os
  buffers contêm os dados do buffer do
  processo root.
Comunicação coletiva
MPI_Scatter(void *sendbuf,int sendcount,
MPI_Datatype sendtype,void *recvbuf,
int recvcount,MPI_Datatype recvtype,int root,
MPI_Comm comm);
• todos os N processos do comunicador
  especificam o mesmo count (número de
  elementos a serem recebidos).
• O buffer de root: contém sendcount*N
  elementos do datatype tipo especificado.
• processo root: distribuirá os dados para os
  processos, incluindo ele próprio.
Comunicação coletiva
MPI_Gather(void *sendbuf,int
 sendcount,MPI_Datatype sendtype,void
 *recvbuf,int recvcount,MPI_Datatype recvtype,int
 root,MPI_Comm comm);

• operação gather: reverso da operação scatter ( dados
  de buffers de todos processos para processo root)
Exemplo: MPI_Scatter
if (rank==0) {
        for(i=0;i<n;i++)
         for(j=0;j<n;j++)
           a[i][j]=1;
      }
   MPI_Scatter(a,k*n,MPI_DOUBLE,a,k*n,MPI_DOUBLE,0
   ,MPI_COMM_WORLD);         // rank 0: root
      parcial=0;
      for(i=0;(i<k);i++)
       for(j=0;j<n;j++)
        parcial+=a[i][j];
Comunicação coletiva
• MPI_Reduce(void *sendbuf,void *recvbuf,int
  count,MPI_Datatype dtype,MPI_Op op,int
  root,MPI_Comm comm);
• Elementos dos buffers de envio: combinados par a
  par para um único elemento correspondente no
  buffer de recepção do root.
• Operaçoes de redução:
• MPI_MAX (maximum), MPI_MIN (minimum),
  MPI_SUM (sum), MPI_PROD (product), MPI_LAND
  (logical and), MPI_BAND (bitwise and) MPI_LOR
  (logical or) MPI_BOR (bitwise or) MPI_LXOR (logical
  exclusive or) MPI_BXOR (bitwise exclusive or)
Exemplo: MPI_Reduce

k=n/n_nos;
MPI_Scatter(a,k*n,MPI_DOUBLE,a,k*n,MPI_DOUBLE,0,M
   PI_COMM_WORLD); // rank 0: root
parcial=0;
fim=k;
for (i=0;i<fim;i++)
       for (j=0;j<n;j++)
          parcial=parcial+a[i][j];
MPI_Reduce(&parcial,&soma,1,MPI_DOUBLE,MPI_SUM
   ,0,MPI_COMM_WORLD); // rank 0: root
Aplicação
Projeto OpenModeller
Objetivo: construir uma versão eficiente da
 ferramenta OpenModeller para predizer a
 distribuição de espécies em uma área
 geográfica a partir de informações de presença
 em um conjunto de locais e as condições
 topográficas e climáticas.
Instituções: CRIA, EPUSP, INPE
Participação do LAHPC: paralelização da
  aplicação
Biodiversidade

• Mapa de distribuição da espécie
OpenModeller
Duas etapas:
• Modelagem: modelagem da presença da
  espécie considerando condições
  climáticas e geográficas (layers)
   - dados de presença coletados em campo
• Projeção: prediz a presença da espécie
  em pontos de uma área
Biodiversidade
• Experimento:
  – Predição da distribuição de uma espécie para
    um conjunto de camadas ambientais cortados
    para a região sudeste com alta resolução
    (250m).
  – Paralelização do passo de projeção.
• Plataforma de execução:cluster
  Programação utilizando MPI
experimento
Estratégia de paralelização

               Nó 1 result..
 Solicita                           Nó 0
 bloco
            Info bloco                     CPU
               Nó 2
Nó 5


               Nó 3


                               Buffer de
               Nó 4            mensagens
Biodiversidade
                    •Tempo de execução sequencial: 66 min.
                    •Tempo de execução da projeção na
                    aplicação openModeller versão paralelizada:
                                     Desempenho da execução do experimento de predição de distribuição de espécie usando M PI
                    80


                    70


                    60


                    50
Tempo em Minuto s




                    40


                    30


                    20


                    10


                    0
                         3   4   5   6    7      8     9     10      11       12          13   14   15   16   17   18   19   20
                                                            Número de pro ces s ado res
Conclusão
Impacto da computação de alto desempenho
  nas áreas da computação
• Novas ferramentas de programação
• Metodologias e Ferramentas de
  desenvolvimento
• Novos algoritmos
Desafios
• Facilitar a programação
• Facilitar o uso das plataformas (multi-core,
  clusters, grids)
• Disseminar como utilizar e explorar o uso dos
  recursos destas plataformas
Conclusão
Pesquisas
• construção de grids para processamento
  paralelo
   – MPI utilizando múltiplos clusters e
     servidores
• ambientes de programação paralela
   – ideal: mesma linguagens atendendo estas
     plataformas
• clusters heterogêneos
• uso de outras arquiteturas ( GPUs)
• paralelização de aplicações
Bibliografia
1. Ben-Ari, M. "Principles of Concurrent and Distributed
   Programming", Addison-Wesley, Second Edition, 2006.
2.    Akthter, S.; Roberts, J. " Multi-Core Programming";
   Intel Press, 2006.
3. Grama, A.; Gupta,A.; Karypis, G.; Kumar, V.
   "Introduction to Parallel Computing"; Addison-Wesley,
   Second Edition, 2003.
4. Culler, D.E.;Singh, J.P.;Gupta, A. "Parallel Computer
   Architecture: a hardware/software approach"; Morgan
   Kaufmann Publishers, Inc. , 1999.
5. Quinn, M.J. “Parallel Programming in C with MPI and
   OpenMP”; McGraw-Hill – Higher Education, 2004.

Weitere ähnliche Inhalte

Was ist angesagt?

Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Intel Software Brasil
 
Coletânea de exercícios informatica
Coletânea de exercícios informaticaColetânea de exercícios informatica
Coletânea de exercícios informaticaProf J.Trajano
 
Processadores core i3 e amd
Processadores core i3 e amdProcessadores core i3 e amd
Processadores core i3 e amdMario Kleber
 
Curso MMM - Aula 02 - Processadores
Curso MMM - Aula 02 - ProcessadoresCurso MMM - Aula 02 - Processadores
Curso MMM - Aula 02 - ProcessadoresSpartan Digital
 
Instalação e Manutenção de Computadores
Instalação e Manutenção de ComputadoresInstalação e Manutenção de Computadores
Instalação e Manutenção de ComputadoresCarlos Eduardo Pantoja
 
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos""AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"Fabrício Pinheiro
 
Arquitetura de Computadores: Unidade central de processamento
Arquitetura de Computadores: Unidade central de processamentoArquitetura de Computadores: Unidade central de processamento
Arquitetura de Computadores: Unidade central de processamentoAlex Camargo
 
A trabalho de processadores 22222
A trabalho de processadores 22222A trabalho de processadores 22222
A trabalho de processadores 22222BLACKDUCK Company
 
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informaticaPedro Felipe Teixeira
 
Arquitetura de Computadores: Memórias
Arquitetura de Computadores: MemóriasArquitetura de Computadores: Memórias
Arquitetura de Computadores: MemóriasAlex Camargo
 
Processadores Multicore
Processadores MulticoreProcessadores Multicore
Processadores Multicoreglauco
 

Was ist angesagt? (20)

Mini Curso IoT - Sieng 2016 - Dia 1
Mini Curso IoT - Sieng 2016 - Dia 1Mini Curso IoT - Sieng 2016 - Dia 1
Mini Curso IoT - Sieng 2016 - Dia 1
 
Htm trabalho
Htm trabalhoHtm trabalho
Htm trabalho
 
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
 
Coletânea de exercícios informatica
Coletânea de exercícios informaticaColetânea de exercícios informatica
Coletânea de exercícios informatica
 
Processadores core i3 e amd
Processadores core i3 e amdProcessadores core i3 e amd
Processadores core i3 e amd
 
Ac16 conjunto de instruções v2
Ac16   conjunto de instruções v2Ac16   conjunto de instruções v2
Ac16 conjunto de instruções v2
 
Processadores
ProcessadoresProcessadores
Processadores
 
Curso MMM - Aula 02 - Processadores
Curso MMM - Aula 02 - ProcessadoresCurso MMM - Aula 02 - Processadores
Curso MMM - Aula 02 - Processadores
 
Hardware de sistemas
Hardware de sistemasHardware de sistemas
Hardware de sistemas
 
070498 t2
070498 t2070498 t2
070498 t2
 
Instalação e Manutenção de Computadores
Instalação e Manutenção de ComputadoresInstalação e Manutenção de Computadores
Instalação e Manutenção de Computadores
 
Processadores
ProcessadoresProcessadores
Processadores
 
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos""AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"
"AMD - Phenom - O Verdadeiro Processamento Com 4 Núcleos"
 
Arquitetura de Computadores: Unidade central de processamento
Arquitetura de Computadores: Unidade central de processamentoArquitetura de Computadores: Unidade central de processamento
Arquitetura de Computadores: Unidade central de processamento
 
A trabalho de processadores 22222
A trabalho de processadores 22222A trabalho de processadores 22222
A trabalho de processadores 22222
 
Processamento paralelo
Processamento paraleloProcessamento paralelo
Processamento paralelo
 
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica
21476983 50-questoes-de-informatica-basica-50-questoes-basicas-de-informatica
 
Arquitetura de Computadores: Memórias
Arquitetura de Computadores: MemóriasArquitetura de Computadores: Memórias
Arquitetura de Computadores: Memórias
 
Processadores Multicore
Processadores MulticoreProcessadores Multicore
Processadores Multicore
 
Por que PostgreSQL?
Por que PostgreSQL?Por que PostgreSQL?
Por que PostgreSQL?
 

Ähnlich wie Mini-curso Programação Paralela e Distribuída

Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Intel Software Brasil
 
Introdução ao processamento paralelo com o Grand Central Dispatch
Introdução ao processamento paralelo com o Grand Central DispatchIntrodução ao processamento paralelo com o Grand Central Dispatch
Introdução ao processamento paralelo com o Grand Central Dispatchflisolmaringa
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaIntel Software Brasil
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Python ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowPython ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowFabrício Vargas Matos
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Intel Software Brasil
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Luciano Palma
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em CElaine Cecília Gatto
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Hands On TensorFlow and Keras
Hands On TensorFlow and KerasHands On TensorFlow and Keras
Hands On TensorFlow and KerasSandro Moreira
 

Ähnlich wie Mini-curso Programação Paralela e Distribuída (20)

Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!
 
Introdução ao processamento paralelo com o Grand Central Dispatch
Introdução ao processamento paralelo com o Grand Central DispatchIntrodução ao processamento paralelo com o Grand Central Dispatch
Introdução ao processamento paralelo com o Grand Central Dispatch
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralela
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Python ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowPython ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao Tensorflow
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Aula python
Aula pythonAula python
Aula python
 
Curso openmp
Curso openmpCurso openmp
Curso openmp
 
Kernel cooperativo
Kernel cooperativoKernel cooperativo
Kernel cooperativo
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em C
 
Ud2
Ud2Ud2
Ud2
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Hands On TensorFlow and Keras
Hands On TensorFlow and KerasHands On TensorFlow and Keras
Hands On TensorFlow and Keras
 

Kürzlich hochgeladen

Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Ilda Bicacro
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdfLeloIurk1
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresAnaCarinaKucharski1
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfEmanuel Pio
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfMarianaMoraesMathias
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....LuizHenriquedeAlmeid6
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãIlda Bicacro
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMHELENO FAVACHO
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxLuizHenriquedeAlmeid6
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfCamillaBrito19
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...azulassessoria9
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxJOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxTainTorres4
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfLeloIurk1
 

Kürzlich hochgeladen (20)

Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! Sertã
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdf
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxJOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 

Mini-curso Programação Paralela e Distribuída

  • 1. Programação Paralela e Distribuída ERAD-SP 2010 31 de julho de 2010 Liria Matsumoto Sato liria.sato@poli.usp.br
  • 2. Apresentação • Introdução • Arquiteturas Paralelas • Programação Paralela para computadores com memória compartilhada • Programação paralela para sistemas distribuídos • Conclusão Ferramentas: CPAR e MPI Download CPAR e exemplos de programas: http://regulus.pcs.usp.br/~lms/eradsp.html
  • 3. Introdução Visão do Mundo atual: • Crescimento contínuo da demanda por processamento • Necessidade de compartilhamento de Informação e de recursos • Acesso a recursos computacionais de alto desempenho Computação de alto desempenho: busca de soluções
  • 4. Introdução Aplicações envolvendo grande capacidade de processamento: • meteorologia • simulação de fenômenos físicos • visualização científica • modelagem das variações climáticas globais em longos períodos • genoma humano • dinâmica de fluídos • Estrutura e Dinâmica molecular
  • 5. Figura extraída de www.top500.org.br (acesso em maio de 2010) Demanda crescente →computadores mais potentes
  • 6. Como obter alto desempenho • Aumento do desempenho do processador • aumento do clock ⇒ aumento de temperatura • melhorias na arquitetura • Processamento Paralelo: • Múltiplas unidades de processamento • Paralelização da aplicação
  • 7. Processamento Paralelo Utilização de múltiplos processadores P P Cache Cache Memória global
  • 8. Processamento Paralelo Paralelização da aplicação em múltiplas tarefas Tarefa1 Tarefa2 Tarefa3
  • 9. Processamento Paralelo Paralelismo de dados dados 1 dados 2 dados 3 dados 4 dados 5 P1 P2 P3 P4 P5
  • 10. Processamento Paralelo Multi-core: multiplos núcleos no chip. AMD, INTEL: quad-core, hexa-core processor NEHALEN : quad-core, hexa-core IBM: CELL NVIDIA, ATI: GPUs (Graphics Processing Unit) Computadores com arquitetura paralela
  • 12. Arquitetura CELL Extraído de http://www.research.ibm.com/cell/heterogeneousCMP.html
  • 13. GPU Geforce 8800 GTX [figura extraída de ¨Programming Massively Parallel Processors: a hands-on Aproach. David B. Kirk; Wen-mei Hwu. Elsevier Inc.
  • 14. Processadores GPU nVIDIA Tesla S1070: 4 GPUs 4 TFlops (ponto flutuante precisão simples) 345 Gflops (ponto flutuante precisão dupla) 4 GB memória dedicada
  • 15. Arquiteturas Paralelas Arquiteturas Paralelas: caracterizadas pela presença de múltiplos processadores que cooperam entre si na execução de um programa. Década 1960 : ILLIAC IV (SIMD) SIMD: todos os processadores executam a mesma instrução sobre dados distintos MIMD: os processadores podem executar instruções distintas sobre dados distintos – Multiprocessadores – Multicomputadores: clusters
  • 16. Arquiteturas Paralelas Multiprocessadores memória compartilhada P1 P2 P3 P4 M M M M
  • 17. Arquiteturas Paralelas Cluster Switch LAN 10GbE
  • 18. Aplicação • Como paralelizar • Como programar Linguagens e compiladores específicos: - multi-core, multiprocessadores: OpenMP, CPAR memória compartilhada - clusters: memória distribuída: MPI (Message Passage Interface): - diversas implementações disponíveis MPICH, OPENMPI
  • 19. Desenvolvimento de aplicações Definir solução com processamento paralelo: • Paralelização de sequências de instruções • Paralelização de laços • Algumas aplicações exigem soluções mais complexas: – Partes da aplicação envolvem cálculos dependentes de cálculos anteriores – Partes da aplicação exigem uma ordenação na geração de resultados
  • 20. Exemplo com paralelização de laços #pragma pfor iterate (i=0; forall i = 0 to MAXRET { MAXRET; 1) x = ((i-0.5) * largura); for (i = 0; i < MAXRET; i++) /* calcula x */ { x = ((i-0.5) * largura); local_pi=local_pi+(4.0/(1.0+ /* calcula x */ x* x)); local_pi = local_pi + (4.0 / ( local_pi = local_pi * 1.0 + x * x)); largura; } lock (&semaforo); local_pi = local_pi * largura; total_pi = total_pi + #pragma critical local_pi; { unlock (&semaforo); total_pi = total_pi + local_pi; } } }
  • 21. Programação paralela para sistemas com memória compartilhada Sistemas com memória compartilhada: • computadores multiprocessadores (processadores multicore ou não) • Computadores com processador multicore. Ferramenta didática: linguagem CPAR – Extensão da linguagem C
  • 22. Paralelização de seqüências de instruções • Múltiplas tarefas simultâneas: macrotarefas • Paralelização do programa em blocos paralelos • Laços e blocos paralelos • CPAR: – Múltiplas tarefas simultâneas – laços e blocos paralelos dentro de uma tarefa – Blocos paralelos na função main
  • 23. Múltiplas tarefas simultâneas tarefa1 tarefa2 tarefa3 Macrotarefas: são procedimentos especiais Tempo execução seqüencial=ttarefa1 + ttarefa2 + ttarefa3 Tempo execução paralela=max(ttarefa1 , ttarefa2 , ttarefa3)
  • 24. Macrotarefas #include <stdio task body tarefa2() task spec tarefa1(); { int i; task spec tarefa2(); for (i=0;i<199;i++) task spec tarefa3(); { printf(“%c”,’b’); task body tarefa1() fflush(stdout);} { int i; } for (i=0;i<199;i++) task body tarefa3() { printf(“%c”,’a’); { int i; fflush(stdout); for (i=0;i<199;i++) } {printf(“%c”,’c’); } fflush(stdout);}
  • 25. Macrotarefas main() { printf(“INICIO TESTEn”); alloc_proc(4); create 1,tarefa1(); create 1,tarefa2(); create 1,tarefa3(); }
  • 26. Paralelização da função principal blocos paralelos na função principal cada bloco: – Blocos – Tarefas – Elementos Seqüenciais bloco 1 bloco 1 bloco 2 bloco 3 bloco 1a bloco 1b bloco 1c blocos paralelos
  • 27. “seq1” tar1 tar2 tar3 tar4 “seq2” tar5 tar6 “seq3”
  • 28. Blocos Paralelos (CPAR) • comando cobegin ... also ... coend • restrição: presente apenas na função main() main() { ... cobegin ..... also ...... also ....... coend ...... }
  • 29. sincronização de tarefas • espera pelo término de uma tarefa wait_task(nome_tarefa); exemplo: wait_proc(tarefa1); • espera pelo término de todas tarefas em execução wait_all()
  • 30. Laços Paralelos: Paralelismo homogêneo forall i=1 to max{ a[i]=b[i]+1; c[i]=c[i]+a[i]; } CPAR: laços paralelos internos a uma macrotarefa
  • 31. Exemplo #include <stdio.h> task body tarefa2() task spec tarefa1(); {int i; task spec tarefa2(); for(i=0;i<10;i++) {printf("%c",'b'); task body tarefa1() fflush(stdout); {int i; } for(i=0;i<10;i++) } {printf("%c",'a'); main() fflush(stdout); {printf("INICIO TESTEn"); } alloc_proc(2); } create 1,tarefa1(); wait_task(tarefa1); create 1,tarefa2(); }
  • 32. Paralelismo heterogêneo parbegin a=a+sqr(b); x=x*2; also c=c+sqr(c); y=y+1; parend CPAR: blocos paralelos dentro de uma macrotarefa
  • 33. memória compartilhada Cada processo pode ter uma porção de memória privada. Algumas locações de memória podem ser: • acessadas por 2 ou mais processos, referenciadas no programa através de variáveis compartilhadas, promovendo a comunicação entre os processos.
  • 34. memória compartilhada O sistema CPAR permite o uso de: · variáveis privadas (locais) · variáveis compartilhadas: shared int A; - Variáveis compartilhadas entre macrotarefas declaração na área de declarações de variáveis globais - Variáveis compartilhadas pelas microtarefas de uma macrotarefa declaração na área de declarações de variáveis da macrotarefa
  • 35. Laço Paralelo: exemplo iniciação de uma matriz #include <stdio.h> main() shared float a[1000][1000]; { alloc_proc(4); task spec inic_mat(); printf(“inicia matrizn”): task body inic_mat() create 4,inic_mat(); {int i,j; wait_proc(inic_mat); forall i=0 to 999 printf(“iniciacao { efetuadan”); for(j=0;j<1000;j++) } a[i][j]=i+2*j; } }
  • 36. Laço Paralelo • CPAR: iterações são particionadas uniformemente (pré-scheduling) • pré-compilador: gera código para tratar o particionamento • em outros sistemas: self-scheduling (distribuiçao dinâmica de blocos de tamanho definido), guided self-scheduling (similar ao self-scheduling, com calculo dinâmico do tamanho dos blocos)
  • 37. Exclusão Mútua Processamento exclusivo de processos é necessário para que recursos possam ser compartilhados sem interferências mútuas. Exemplo: Em um programa um contador (COUNT) é compartilhado e incrementado por mais de um processo. COUNT = COUNT + 1 LD COUNT ADD 1 STO COUNT
  • 38. Exclusão mútua Se 2 processos executarem esta seqüência, pode ocorrer: LD COUNT {processo 1} LD COUNT {processo 2} ADD 1 {processo 2} STO COUNT {processo 2} ADD 1 {processo 1} STO COUNT {processo 1} COUNT: incrementado apenas de 1. Solução: encerrar a seqüência de instruções em uma seção crítica.
  • 39. Exclusão mútua Seção crítica: seqüência de códigos executada ininterruptamente, garantindo que estados inconsistentes de um dado processo não sejam visíveis aos restantes. Isto é realizado utilizando mecanismos de exclusão mútua. exclusão mútua: implementação com semáforos binários
  • 40. Semáforos Em CPAR: declaração de semáforo: global ou local a macrotarefa shared Semaph nome_semaforo; Ex: shared Semaph X; criação : create_sem(&nome_semafor,valor_inicial); Ex: create_sem(&X,1); remoção: rem_sem(&nome_semaforo); Ex: rem_sem(&X); operação P: lock(&nome_semaforo); Ex: lock(&X); operação V: unlock(&nome_semaforo); Ex: unlock(&X);
  • 41. Semáforo Binário shared Semaph X; create_sem(&X,1); lock(&X); unlock(&X); rem_sem(&X);
  • 42. Exemplo: seção crítica task body tarefa() {shared Semaph A; int i; create_sem(&A,1); forall i=0 to 99 { .... lock(&A); COUNT=COUNT+1; unlock(&A); ..... } ...... rem_sem(&A); }
  • 43. Threads • thread: é um fluxo de controle seqüencial em um programa. • programação multi-threaded: uma forma de programação paralela onde vários threads são executados concorrentemente em um programa. Todos threads executam em um mesmo espaço de memória, podendo trabalhar concorrentemente sobre dados compartilhados.
  • 44. multi-threaded X multi-processing • multi-threaded programming: todos os threads compartilham o mesmo espaço de memória e alguns outros recursos, como os descritores de arquivos. • multi-processing: processos executam sobre seu próprio espaço de memória. O compartilhamento de dados se obtém através de funções que fazem com que endereços lógicos apontem para o mesmo endereço físico.
  • 45. Pthreads • POSIX : Pthreads • Exemplo: pi-pthreads.c • Compilação: gcc –o pi-pthreads pi-pthreads.c -lpthread
  • 46. OpenMP • spec25.pdf : www.openmp.org/mp- documents/spec25.pdf • Diretivas #pragma omp directive-name [clause[ [,] clause]...] new-line Região paralela: #pragma omp parallel Compilação: gcc –o pi-openmp pi-openmp.c -fopenmp icc –o pi-openmp pi-openmp.c -openmp Exemplos: pi-openmp.c Seções: omp-section.c Redução: pi-openmp-reduction.c
  • 47. pi - openmp int main() { ..... omp_set_num_threads(4); #pragma omp parallel shared (total_pi,largura) private(i,x,local_pi) { #pragma omp for for (i = 0; i < MAXRET; i++) { x = ((i-0.5) * largura); /* calcula x */ local_pi = local_pi + (4.0 / ( 1.0 + x * x)); } local_pi = local_pi * largura; printf("LOCAL-PI %lfn",local_pi); #pragma omp critical { total_pi = total_pi + local_pi; ..... }
  • 48. pi-openmp-reduction omp_set_num_threads(4); #pragma omp parallel shared (largura) private(i,x) reduction(+:y) { #pragma omp for for (i = 0; i < MAXRET; i++) { x = ((i-0.5) * largura); /* calcula x */ y = y + (4.0 / ( 1.0 + x * x)); } } total_pi = y * largura; printf("TOTAL-PI %lfn",total_pi); }
  • 49. omp-section omp_set_num_threads(2); #pragma omp parallel sections { #pragma omp section { printf("secao 1n"); for (i=0;i<20000;i++) {printf("a"); fflush(stdout); } } #pragma omp section { printf("secao 2n"); for (i=0;i<20000;i++) {printf("b"); fflush(stdout); } } }
  • 50. Sistemas Distribuídos • Não possui memória compartilhada • Bibliotecas: PVM, MPI • Sistemas DSM (distributed shared memory): simula memória compartilhada, permitindo a programação no paradigma de variáveis compartilhadas
  • 51. Sistemas Distribuídos: Programação com bibliotecas • PVM (parallel virtual machine) • MPI (message passage interface) • programação utilizando passagem de mensagem
  • 52. Modelo de computação: spmd (single program multiple data) • todos os nós executam o mesmo programa sobre dados múltiplos 0 .....9 10...19 20....29 nó 1 nó 2 nó 3
  • 53. modelo de computação: esquema mestre escravo com spmd • esquema mestre-escravo utilizando spmd: todos executam o mesmo programa, sendo que através de um controle interno ao programa um nó executa a função mestre eos demais são escravos.
  • 54. Modelo de computação Mestre escravo 1 escravo 2 escravo N Mestre
  • 55. Grupos de tarefas Mestre escravo 2 Mestre Mestre escravo escravo escravo 1 escravo 2 escravoN Mestre Mestre Tarefa Mestre Grupo de Tarefas
  • 56. Exemplo : Soma dos elementos de um vetor Processo Mestre escravo 1 escravo 2 escravo N
  • 57. Para obter um bom desempenho • Use granularidade grossa • minimize o # de mensagens • maximize o tamanho de cada mensagem • use alguma forma de Balanceamento de carga
  • 59. MPI • Processos: são representados por um único “rank”(inteiro) e ranks são numerados 0, 1, 2 ..., N-1. (N = total de processos) • Enter e Exit MPI_Init(int *argc,char *argv); MPI_Finalize(void); • Quem eu sou? MPI_Comm_rank(MPI_Comm comm,int *rank); • informa total de processos MPI_Comm_size(MPI_Comm comm,int *size);
  • 60. Programa MPI - SPMD #include <mpi.h> ........ main(argc, argv) int argc; char *argv[]; { int size, rank; MPI_Status status; ....... // Initialize MPI. MPI_Init(&argc, &argv); ......... MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); ......
  • 61. Programa MPI - SPMD if (0 == rank) // rank = 0 { .......... } else // rank > 0 { ........... } MPI_Finalize(); return(0); }
  • 62. MPI • Enviando Mensagens MPI_Send(void *buf,int count,MPI_Datatype dtype,int dest,int tag,MPI_Comm comm); • Recebendo Mensagens MPI_Recv(void *buf,int count,MPI_Datatype dtype,int source,int tag,MPI_Comm comm,MPI_Status *status); status: status.MPI_TAG status.MPI_SOURCE
  • 63. Exemplo: enviando mensagens // rank 0, send a message to rank 1. if (0 == rank) { for (i=0;i<64;i++) buf[i]=i; MPI_Send(buf, BUFSIZE, MPI_INT, 1, 11, MPI_COMM_WORLD); } // rank 1, receive a message from rank 0. else { MPI_Recv(buf, BUFSIZE, MPI_INT, 0, 11, MPI_COMM_WORLD, &status); for(i=0;i<64;i++) { printf("%d",buf[i]); fflush(stdout);} printf("n"); }
  • 64. MPI – compilação e execução • Compilação (openmpi) mpicc -o trivial trivial.c mpiCC –o trivial trivial.cpp execução: mpirun -np 2 –hosts trivial hosts: arquivo contendo os IPs ou nomes dos nós
  • 65. Comunicação • Comunicação ponto a ponto: uma origem e um destino – Envio bloqueante – Recepção bloqueante – Envio não bloqueante – Recepção não bloqueante • Comunicação Coletiva
  • 66. Envio Padrão Bloqueante • O comportamento do sistema depende do tamanho da mensagem, se é menor ou igual ou maior do que um limite. Este limite é definido pela implementação do sistema e do número de tarefas na aplicação. • mensagem<= limite MPI_Send S R buffer interno do receptor MPI_Recv
  • 67. Envio Padrão Bloqueante • mensagem>limite MPI_Send espera espera MPI_Revc
  • 68. Programação: modelo mestre-escravo em SPMD void main() int argc; char *argv[]; { int myrank; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myrank); if (myrank==0) {master();} else { slave();} MPI_Finalize(); return(0); }
  • 69. Exemplo: soma de elementos de um vetor (MPI_Send) k=n/n_nos; inicio=rank*k; fim=inicio+k; if (rank==0) { for(i=inicio;i<n;i++) vetor[i]=1; for (i=1;i<n_nos;i++) MPI_Send(vetor+k*i,k,MPI_INT,i,10,MPI_COMM_WORLD); } else { MPI_Recv(vetor,k,MPI_INT,0,10,MPI_COMM_WORLD,&status); } soma_parcial=0; for(i=0;(i<k);i++) soma_parcial+=vetor[i];
  • 70. Exemplo: soma de elementos de um vetor (MPI_Send) if (rank==0) { soma_total=soma_parcial; for(i=1;i<n_nos;i++){ MPI_Recv(&soma,1,MPI_INT,MPI_ANY_SOURCE,11, MPI_COMM_WORLD,&status); soma_total+=soma;} } else { MPI_Send(&soma_parcial,1,MPI_INT,0,11,MPI_COMM_WORLD); } MPI_Finalize(); return(0);
  • 71. Envio Bloqueante • Padrão: MPI_Send(&buf,n_elementos,MPI_INT,dest, tag, MPI_COMM_WORLD) • Blocking Syncronous Send : MPI_Ssend (&buf,n_elementos,MPI_INT, dest, tag, MPI_COMM_WORLD) • tarefa transmissora: envia para a tarefa receptora uma mensagem “ready to send”. • tarefa receptora: ao executar uma chamada receive, envia para a tarefa transmissora uma mensagem de “ready to receive”. • Os dados são transferidos.
  • 72. Envio Bloqueante • Blocking Ready Send MPI_Rsend (&buf,n_elementos,MPI_INT, dest, tag, MPI_COMM_WORLD) • envia a mensagem na rede. • Requer que uma notificação de “ready to receive” tenha chegado. • Notificação não recebida: erro.
  • 73. Envio Bloqueante • Blocking Buffered Send MPI_Bsend(&buf,n_elementos,MPI_INT, dest, tag, MPI_COMM_WORLD ) • Aplicação deve prover o buffer: array alocado estaticamente ou dinamicamente com malloc. Deve ser incluido bytes do header. • MPI_Buffer_attach( ... ) • Dados do buffer de mensagem copiados para buffer do usuário. Execução retorna. • O dado será copiado do buffer do usuário sobre a rede quando uma notificação de “ready to receive”tiver chegado • MPI_Buffer_detach( ... )
  • 74. Recepção Bloqueante • MPI_Recv(&a,10,MPI_INT,origem,tag,MPI _COMM_WORLD,&status) bloqueante: receptor fica bloqueado até receber a mensagem. tag: pode ser MPI_ANY_TAG (qualquer tag) origem: pode ser MPI_ANY_SOURCE (qualquer origem) status: 2 campos status.source: origem da mensagem status.tag: tag da mensagem
  • 75. Recepção: outras funções • MPI_Probe(in source,int tag,MPI_Comm comm,MPI_Status *status) Sincroniza uma mensagem e retorna informações. Não retorna até que uma mensagem seja sincronizada. • MPI_Get_count(MPI_Status *status,MPI_Data type dtype,int *count) Retorna o número de elementos da mensagem recebida. uso: quando não se conhece o tamanho da mensagem a ser recebida. Mensagem sincronizada com MPI_Probe.
  • 76. Funções de comunicação não bloqueantes • chamadas não bloqueantes retornam imediatamente após o início da comunicação. O programador não sabe se o dado enviado já saiu do buffer de envio ou se o dado a ser recebido já chegou. Então, o programador deve verificar o seu estado antes de usar o buffer.
  • 77. Comunicação não bloqueante • envio: retorna após colocar o dado no buffer de envio. MPI_Isend(void *buf,int count,MPI_Datatype dtype,int dest,int tag,MPI_Comm comm,MPI_Request *req) req: objeto que contém informações sobre a mensagem, por exemplo o estado da mensagem.
  • 78. Comunicação não bloqueante • Recepção: é dado o início à operação de recepção e retorna. MPI_Irecv(void *buf, count,MPI_INT, origem, tag, MPI_Comm comm, MPI_Request *req) • Dados: não devem ser lidos enquanto não estiverem disponíveis Verificação: MPI_Wait ou MPI_Test.
  • 79. Comunicação não bloqueante MPI_Wait(MPI_Request *req,MPI_Status *status) Espera completar a transmissão ou a recepção. MPI_Test(MPI_Request *req,int *flag,MPI_Status *status) Retorna em flag a indicação se a transmissão ou recepção foi completada. Se true, o argumento status está preenchido com informação MPI_Iprobe(int source,int tag,MPI_Comm comm,int *flag,MPI_Status *status) Seta flag, indicando a presença do casamento da mensagem.
  • 80. Comunicação não bloqueante if (rank==0) { ............ MPI_Isend(&a[0][0]+(k*n*i),k*n,MPI_DOUBLE,i,10,MPI_COMM_WO RLD,&req); printf("rank 0 apos Sendn"); fflush(stdout); ....... } else { MPI_Recv(a,k*n,MPI_DOUBLE,0,10,MPI_COMM_WORLD,&status); ........... }
  • 81. Comunicação coletiva MPI_Bcast(void *buf,int count,MPI_Datatype dtype,int root,MPI_Comm comm); • todos processos executam a mesma chamada de função. • Após a execução da chamada todos os buffers contêm os dados do buffer do processo root.
  • 82. Comunicação coletiva MPI_Scatter(void *sendbuf,int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount,MPI_Datatype recvtype,int root, MPI_Comm comm); • todos os N processos do comunicador especificam o mesmo count (número de elementos a serem recebidos). • O buffer de root: contém sendcount*N elementos do datatype tipo especificado. • processo root: distribuirá os dados para os processos, incluindo ele próprio.
  • 83. Comunicação coletiva MPI_Gather(void *sendbuf,int sendcount,MPI_Datatype sendtype,void *recvbuf,int recvcount,MPI_Datatype recvtype,int root,MPI_Comm comm); • operação gather: reverso da operação scatter ( dados de buffers de todos processos para processo root)
  • 84. Exemplo: MPI_Scatter if (rank==0) { for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=1; } MPI_Scatter(a,k*n,MPI_DOUBLE,a,k*n,MPI_DOUBLE,0 ,MPI_COMM_WORLD); // rank 0: root parcial=0; for(i=0;(i<k);i++) for(j=0;j<n;j++) parcial+=a[i][j];
  • 85. Comunicação coletiva • MPI_Reduce(void *sendbuf,void *recvbuf,int count,MPI_Datatype dtype,MPI_Op op,int root,MPI_Comm comm); • Elementos dos buffers de envio: combinados par a par para um único elemento correspondente no buffer de recepção do root. • Operaçoes de redução: • MPI_MAX (maximum), MPI_MIN (minimum), MPI_SUM (sum), MPI_PROD (product), MPI_LAND (logical and), MPI_BAND (bitwise and) MPI_LOR (logical or) MPI_BOR (bitwise or) MPI_LXOR (logical exclusive or) MPI_BXOR (bitwise exclusive or)
  • 86. Exemplo: MPI_Reduce k=n/n_nos; MPI_Scatter(a,k*n,MPI_DOUBLE,a,k*n,MPI_DOUBLE,0,M PI_COMM_WORLD); // rank 0: root parcial=0; fim=k; for (i=0;i<fim;i++) for (j=0;j<n;j++) parcial=parcial+a[i][j]; MPI_Reduce(&parcial,&soma,1,MPI_DOUBLE,MPI_SUM ,0,MPI_COMM_WORLD); // rank 0: root
  • 87. Aplicação Projeto OpenModeller Objetivo: construir uma versão eficiente da ferramenta OpenModeller para predizer a distribuição de espécies em uma área geográfica a partir de informações de presença em um conjunto de locais e as condições topográficas e climáticas. Instituções: CRIA, EPUSP, INPE Participação do LAHPC: paralelização da aplicação
  • 88. Biodiversidade • Mapa de distribuição da espécie
  • 89. OpenModeller Duas etapas: • Modelagem: modelagem da presença da espécie considerando condições climáticas e geográficas (layers) - dados de presença coletados em campo • Projeção: prediz a presença da espécie em pontos de uma área
  • 90. Biodiversidade • Experimento: – Predição da distribuição de uma espécie para um conjunto de camadas ambientais cortados para a região sudeste com alta resolução (250m). – Paralelização do passo de projeção. • Plataforma de execução:cluster Programação utilizando MPI
  • 92. Estratégia de paralelização Nó 1 result.. Solicita Nó 0 bloco Info bloco CPU Nó 2 Nó 5 Nó 3 Buffer de Nó 4 mensagens
  • 93. Biodiversidade •Tempo de execução sequencial: 66 min. •Tempo de execução da projeção na aplicação openModeller versão paralelizada: Desempenho da execução do experimento de predição de distribuição de espécie usando M PI 80 70 60 50 Tempo em Minuto s 40 30 20 10 0 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Número de pro ces s ado res
  • 94. Conclusão Impacto da computação de alto desempenho nas áreas da computação • Novas ferramentas de programação • Metodologias e Ferramentas de desenvolvimento • Novos algoritmos Desafios • Facilitar a programação • Facilitar o uso das plataformas (multi-core, clusters, grids) • Disseminar como utilizar e explorar o uso dos recursos destas plataformas
  • 95. Conclusão Pesquisas • construção de grids para processamento paralelo – MPI utilizando múltiplos clusters e servidores • ambientes de programação paralela – ideal: mesma linguagens atendendo estas plataformas • clusters heterogêneos • uso de outras arquiteturas ( GPUs) • paralelização de aplicações
  • 96. Bibliografia 1. Ben-Ari, M. "Principles of Concurrent and Distributed Programming", Addison-Wesley, Second Edition, 2006. 2. Akthter, S.; Roberts, J. " Multi-Core Programming"; Intel Press, 2006. 3. Grama, A.; Gupta,A.; Karypis, G.; Kumar, V. "Introduction to Parallel Computing"; Addison-Wesley, Second Edition, 2003. 4. Culler, D.E.;Singh, J.P.;Gupta, A. "Parallel Computer Architecture: a hardware/software approach"; Morgan Kaufmann Publishers, Inc. , 1999. 5. Quinn, M.J. “Parallel Programming in C with MPI and OpenMP”; McGraw-Hill – Higher Education, 2004.