Baixe o app para aproveitar ainda mais
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 ifelse 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. pontoaponto 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 pontoaponto 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 blockcycle: 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.
Compartilhar