Buscar

Computação Paralela - Memória distribuída com MPI

Prévia do material em texto

Resumo dos Slides (sem código)
Identificando processos em MPI
Todo processo tem um identificador positivo de 0 até p.
Componentes MPI
­ MPI_Init inicializa o MPI
­ MPI_Finalize encerra e limpa o MPI
Comunicadores
­ É um conjunto de processos que pode mandar mensagens entre si
­ A chamada para MPI_Init define um comunicador entre os processos criados pelo programa
MPI
­ O comunicador é chamado MPI_COMM_WORLD
SPMD
­ Single Program Multiple Data
­ Apenas um programa é compilado
­ O processo 0 é o único que mexe com a entrada de dados
­ Existe um if­else que torna o programa SPMD
if(rank == 0){
....
} else {
….
}
Casamento de mensagens
O casamento de mensagens é feito através do casamento de parâmetros:
Send <destino, send_tag, send_comm>
Recv <source, recv_tag, recv_comm>
Recebendo mensagens
Um receptor pode receber uma mensagem sem saber
­ quantidade de dados
­ remetente
­ tag
Problemas com send e receive
­ O comportamento exato é determinado pela implementação do MPI
­ MPI_Send pode se comportar de forma diferente devido ao tamanho do buffer, bloqueios e
‘atalhos’
­ MPI_Recv sempre bloqueia até que uma mensagem esperada seja recebida
Gerenciando I/O: Entrada
­ A maioria das implementações MPI só permitem que o processo 0 acessem a entrada (stdin)
então é ele quem deve ler a entrada de dados e passar para os demais processos
Comunicação Coletiva
Usa operações coletivas em vez de send/receive individuais
MPI_Reduce
Serve para totalizar dados que foram divididos entre os processos.
Operadores pré­definidos de redução
Existem alguns operadores que indicam operações prontas para redução: MPI_MAX, MPI_MIN,
MPI_SUM, etc…
Comunicação coletiva vs. ponto­a­ponto
­ Todos os processos devem chamar a mesma função coletiva
Ex: não existe mais um par send/receive. Agora, existe um par scatter/scatter, gather/gather
­ Os argumentos passados entre os processos devem ser ‘compatíveis’
Ex: se um processo passa o valor 0 como dest_process e outro passa o valor 1, o resultado de
MPI_Reduce ficará errado
­ O argumento output_data_p só é usado no dest_process, mas todos os processos precisam
passar este argumento, mesmo que NULL
­ Comunicações ponto­a­ponto são baseadas no casamento de tags e comunicadores
­ Comunicações coletivas não usam tags: apenas comunicadores e a ordem de envio das
mensagens são suficientes
MPI_Allreduce
­ É útil em uma situação onde todos os processos precisam do resultado de uma soma global
para computar algo maior
Broadcast
­ Os dados que pertencem a um único processo são enviados para todos os processos do
comunicador
Opções de particionamento
V = {
{1,2,3},
{4,5,6},
{7,8,9}}
­ Particionamento em blocos:  atribui blocos consecutivos de dados para cada processo.
Ex: p1 ­> 1,2,3; p2 ­> 4,5,6; p3 ­> 7,8,9
­ Particionamento cíclico: atribui partes dadas pelo resto de uma divisão. (??????)
Ex: p1 ­> 1,4,7; p2 ­> 2,5,8; p3 ­> 3,6,9
­ Particionamento block­cycle: usa as duas formas.
Ex: bloco de tamanho 2
p1 ­> 1,2,5,6; p2 ­> 3,4,7,8; p3 ­> 9
Scatter (distribuir)
­ Pode ser usada como uma função que lê um vetor inteiro no processo 0 e distribui os
componentes necessários para cada um dos demais processos
Gather (reunir)
­ Coleta todos os componentes de um vetor (distribuído por Scatter) no processo 0
Allgather
­ Concatena o conteúdo do send_buf_p de cada processo e armazena em recv_buf_p
Avaliação de performance
­ Uso da função MPI_Wtime
MPI_Barrier
­ Garante que nenhum processo vai retornar da chamada até que todos os outros processos
estejam no mesmo ponto
Speedup
Tparalelo = Tserial / p + Toverhead
Eficiência
Eficiência = Speedup / p
Escalabilidade
Um programa é escalável se o tamanho do problema pode ser aumentado, de forma que a
eficiência não diminua conforme o número de processos aumenta.
Em outras palavras: se a eficiência não piorar conforme aumentamos o número de processos,
o programa é escalável.
­ Programas que mantém eficiência constante quando não aumentamos o tamanho do
problema são chamados de fortemente escaláveis. Ex: se ao aumentarmos o número de
processos a eficiência permanecer a mesma, o programa é fortemente escalável.
­ Programas que mantém eficiência constante se o tamanho do problema aumenta na mesma
proporção que o número de processos são chamados de fracamente escaláveis. Ex: se
dobrarmos o tamanho do problema e o também o número de processos e  ainda assim a
eficiência se mantiver, o programa é fracamente escalável.

Continue navegando