Buscar

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

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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.

Outros materiais