Click here to load reader

Computações Síncronas. Computações síncronas Em aplicações síncronas, todos os processadores são sincronizados em pontos regulares Barreira –Um mecanismo

  • View
    225

  • Download
    4

Embed Size (px)

Text of Computações Síncronas. Computações síncronas Em...

  • Computaes Sncronas

  • Computaes sncronasEm aplicaes sncronas, todos os processadores so sincronizados em pontos regularesBarreiraUm mecanismo bsico para sincronizao de processos que deve ser inserido no ponto do programa onde os processos devem esperar para se sincronizaremTodos os processos param sua execuo, quando atingem o ponto onde existe uma barreira, e retornam a executar assim que todos ou um certo nmero de processos atinjam esse mesmo ponto

  • Rotinas que implementam barreirasMPIMPI_Barrier()tem como nico parmetro um identificador de communicatorcada processo pertencente a esse communicator chama essa rotina, e fica bloqueado at que todos os membros do grupo tenham atingido essa chamada de rotinaPVMpvm_barrier()tem como parmetro um identificador de um grupopode-se especificar o nmero de processos que devem chegar na barreira para liberar os processos que acionam a rotina de barreira

  • Implementao de barreiraBarreiras baseadas em contadores geralmente possuem duas fases:um processo entra na fase denominada fase de chegada e no sai dessa fase enquanto todos os processos cheguem nessa mesma fasedepois os processos vo para a fase denominada fase de sada e so liberadosAs implementaes da barreira devem tomar cuidado com o fato de que uma barreira pode ser utilizada mais de uma vez em um processopode ser que um processo entre em uma rotina de barreira pela segunda vez antes que outros processos tenham retornado da rotina acionada em uma primeira vez.

  • Exemplo de cdigoMestre:for (i = 0; i < n; i++) /* conta os escravos assim que eles chegarem na barreira */recv (Pany);for (i = 0; i < n; i++) /* libera os escravos */ send (Pi);Escravos:send (Pmaster);recv (Pmaster;

  • Implementao por rvoreSuponha que existem oito processos P0, P1, P2, P3, P4, P5, P6 e P7:1o. estgio: P1 envia mensagem para P0; (quando P1 chega na barreira) P3 envia mensagem para P2; (quando P3 chega na barreira) P5 envia mensagem para P4; (quando P5 chega na barreira) P7 envia mensagem para P6; (quando P7 chega na barreira)2o. estgio: P2 envia mensagem para P0; (P2 e P3 chegaram na barreira) P6 envia mensagem para P4; (P6 e P7 chegaram na barreira)3o. estgio: P4 envia mensagem para P0; (P4, P5, P6 e P7 chegaram na barreira) P0 finaliza fase de chegada; (quando P0 chega na barreira e recebeu mensagem de P4)

  • Sincronizao localSuponha que um processo Pi tenha que se sincronizar e trocar dados com o processo Pi-1 e Pi+1 antes de continuar a execuo do programa:

    Essa no uma barreira perfeita de trs processos porque Pi-1 e Pi+1 s so sincronizados com Pi

    Processo Pi-1

    recv (Pi);send (Pi);Processo Pi

    send (Pi-1);send (Pi+1);recv (Pi-1);recv (Pi+1);Processo Pi+1

    recv (Pi);send (Pi);

  • DeadlockQuando um par de processos precisa enviar e receber mensagens entre eles, pode ocorrer um bloqueio denominado deadlockOcorre deadlock quando ambos os processos executarem primeiro o envio de mensagem atravs de rotinas sncronas ou rotinas bloqueantes sem espao suficiente de buffer: elas ficaro indefinidamente esperando por uma rotina de recebimento que nunca ser executada

  • DeadlockSoluo:Faa com que um processo receba primeiro uma mensagem e depois envie, e o outro processo deve primeiro enviar a mensagem e depois tentar receberExemplo:Em um pipeline linear, os processos de nmeros pares devem executar seus envios primeiro e os processos de nmeros mpares devem executar os recebimentos primeiro

  • Rotinas combinadas livres de deadlockComo comunicaes bidirecionais so bastante comuns, o MPI definiu rotinas combinadas bloqueantes para envio e recebimento de mensagens que devem ser implementadas de forma a evitar deadlock: MPI_Sendrecv () e MPI_Sendrecv_replace()Processo Pi-1

    sendrecv (Pi);

    Processo Pi

    sendrecv (Pi-1);send recv(Pi+1);

    Processo Pi+1

    sendrecv (Pi);

  • Computaes sncronasParalelismo de dados:Mesma operao executada sobre elementos de dados diferentes simultaneamenteModelo conveniente porque:Fcil de programar (essencialmente necessita de um programa nico)Escala facilmente para problemas de tamanho maiorVrios problemas numricos e no-numricos podem ser modelados utilizando esse modeloExemplo:for (=i = 0; i < n; i++) a[i] = a[i] + k;

  • Construo forallConstruo especial paralela existente em algumas linguagens de programao para especificar operaes paralelas sobre dadosNo exemplo abaixo, n instncias das instrues contidas em blocoinst sero executadas simultaneamente: forall (i = 0; i < n; i++) { blocoinst () }Um valor da varivel do loop i vlido em cada instruo do bloco de instrues blocoinst, para a primeiro instncia temos i = 0, para a prxima i =1 e assim por diante.

  • Construo forallPara somar k a cada elemento de um array a, podemos escrever :forall (i = 0; i < n; i++) { a[i] = a[i] +k;

    Utilizando-se a rotina barreira:i = myrank; /* myrank o rank do processo que varia de 0 a n-1 */a[i] = a[i] +k;barrier (mygroup);

  • Soma de prefixosDada uma lista de nmeros, x0, , xn-1, calcule as somas parciais (x0 + x1; x0 + x1 + x2;x0 + x1 + x2 + x3; )Utilizada para compactao de dados, ordenao e avaliao de polinmiosCdigo seqencial:for (i = 0; i < n; i++) { sum[i] = 0; for (j = 0; j
  • Paralelismo de dados para adicionar todas as somas parciais de 16 nmerosCdigo seqencial:for (j = 0; j < log(n); j++) for (i = 2j; i < n; i++) x[i] = x[i] + x[i - 2j]; Cdigo paralelo:for (j = 0; j < log(n); j++) forall (i = 0; i < n; i++) if (i >= 2j ) x[i] = x[i] + x[i- 2j];

  • Iteraes sncronas ou paralelismo sncronoResolver um problema por iteraes onde cada iterao composta de vrios processos que comeam a executar juntos no incio da iterao e a prxima iterao s pode ser iniciada quando todos os processos tiverem finalizado a iterao prvia.Cdigo utilizando forall:for (j = 0; j < n; j++) forall (i = 0; i < N; i++) { blocoinst(i); }Cdigo utilizando barreira:for (j = 0; j < n; j++) { i = myrank; blocoinst(i); barrier(mygroup) }

  • Resolvendo um sistema de equaes lineares por iteraesResolver um sistema de equaes lineares de forma geral com n equaes e n entradas:

  • Resolvendo um sistema de equaes lineares por iteraesRearruma a i-sima equao:

    para

    ou

  • Resolvendo um sistema de equaes lineares por iteraesIterao de Jacobi:Inicie as variveis x com algum valor inicial, por exemplo, xi = bi Calcule os novos valores para as variveis x utilizando a equao de iterao: Com esses novos valores, recalcule as variveis xTodos os valores de x so atualizados simultaneamenteRepita esse processo at que valores suficientemente corretos para todas as variveis sejam obtidosEsse mtodo converge no caso em que a diagonalmente dominante, ou seja, para cada linha da matriz a, o valor do elemento da diagonal de a tem um valor absoluto maior que a soma dos valores absolutos dos outros elementos dessa linha:

  • Terminao de processamento das iteraesUmas maneira simples e comum de se terminar o processamento das iteraes comparar os valores calculados em uma iterao com os valores obtidos em uma iterao prvia, e terminar o processamento na t-sima iterao quando os valores estiverem dentro de uma certa tolerncia, isto , quando:

    para todo i, onde o valor de depois da t-sima iterao e o valor de depois da (t-1)-sima iterao

  • Cdigo seqencialDados os arrays a[][] e b[][] que armazenam as constantes das equaes, x[] que possui os valores das variveis e um nmero fixo de iteraes limit:for (i = 0; i < n; i++) x[i] = b[i];for (iteration = 0; iteration < limit; iteration ++) { for (i = 0; i < n; i++) { sum = 0; for (j = 0; j < n; j++) if (i != j) sum = sum + a[i][j] * x[j]; new_x[i] = (b[i] - sum)/ a[i][i] ; } for (i = 0; i < n; i++) x[i] = new_x[i];}

  • Cdigo seqencialUm pouco mais eficiente:for (i = 0; i < n; i++) x[i] = b[i];for (iteration = 0; iteration < limit; iteration ++) { for (i = 0; i < n; i++) { sum = -a[i][i]*x[i]; for (j = 0; j < n; j++) sum = sum + a[i][j] * x[j]; new_x[i] = (b[i] - sum)/ a[i][i] ; } for (i = 0; i < n; i++) x[i] = new_x[i];}

  • Cdigo paraleloCdigo para o processo Pi: x[i] = b[i];for (iteration = 0; iteration < limit; iteration ++) { sum = -a[i][i]*x[i]; for (j = 0; j < n; j++) sum = sum + a[i][j] * x[j]; new_x[i] = (b[i] - sum)/ a[i][i] ; broadcast_receive(&new_x[i]); global_barrier(); }A rotina broadcast_receive() envia o novo valor calculado x[i] do processo i para todos os outros processos e recebe os valores enviados pelos outros processos

  • Cdigo paraleloExecutando iteraes at atingir uma certa tolerncia ao erro: x[i] = b[i]; iteration = 0;do { iteration++; sum = -a[i][i]*x[i]; for (j = 0; j < n; j++) sum = sum + a[i][j] * x[j]; new_x[i] = (b[i] - sum)/ a[i][i] ; broadcast_receive(&new_x[i]); } while (tolerence ( ) && (iteration < limit ));onde a rotina tolerence( ) retorna FALSE se estiver pronto para acabar iteraes, ou TRUE, caso contrrio.

  • ParticionamentoGeralmente o nmero de processadores muito menor que o nmero de elementos de dados a serem processadosDeve-se particionar o problema, de modo que cada processador trabalhe com mais de um elemento de dadosNo problema anterior, por exemplo, cada processador pode ser responsvel pelo clculo de um grupo de variveis

  • ParticionamentoAlocao por bloco:as variveis so alocadas para cada processador em