Baixe o app para aproveitar ainda mais
Prévia do material em texto
FAQ 1) MPI é para sistema em memória compartilhada ou distribuída? O padrão MPI foi desenvolvido para sistemas de memória distribuída, porém o padrão MPI-2 também especifica rotinas de envio/recebimento que utilizam a memória compartilhada para as operações de troca de mensagem. Desta forma, o MPI também tem sido utilizado de forma eficiente em sistemas de memória compartilhada. 2)Qual a diferença entre OpenMP e MPI? O padrão OpenMP foi desenvolvido para sistemas computacionais de memória compartilhada. Desta forma o OpenMP cria threads, enquanto o MPI, que foi desenvolvido para sistemas computacionais de memória distribuída, cria processos. Em um sistema de memória compartilhada é mais vantajoso ter um processo transformado em threads porque um processo pode ser dividido em diversos threads. Desta forma, quando um thread em execução ficar bloqueado na espera por um recurso, outro thread pode ser escalonado para executar na cpu. A vantagem dos threads está no aumento da concorrência, o que possibilita, teoricamente um maior desempenho, porém, existem outros fatores que irão influenciar no desempenho da aplicação no sistema computacional. Além disso, os threads se comunicam através de uma memória global, enquanto que processos se comunicam através de troca de mensagens. Desta forma, uma comunicação realizada através de um acesso à memória compartilhada é teoricamente mais eficiente do que uma comunicação realizada através de troca de mensagens. Uma vantagem do OpenMP em relação ao MPI é a economia de memória, já que os threads compartilham a memória global. Esta característica é muito importante para aplicações que acessam uma grande massa de dados em um ambiente multicore. Em termos de ambiente de programação, no ambiente MPI, é o programador quem especifica as trocas de mensagens, ou seja, cabe ao programador especificar qual será o processo que deverá enviar uma mensagem e qual deverá ser processo que deverá receber a mensagem. No ambiente OpenMP o programador adiciona diretivas de compilação no código e é o compilador quem executa o gerenciamento do acesso ao dado entre os processos Desta forma, podemos dizer que o ambiente OpenMP é mais amigável para o programador, e que por outro lado, o programador não tem poder te "otimização" do código. Podemos visualizar o MPI como se fosse um "nível mais abaixo" de programação, onde o programador controla a troca de dados e tem maior possibilidade de otimizar o código. 3)É possível usar os dois juntos? Qual o ganho nisso ? É possível utilizar MPI e o OpenMP em uma mesma aplicação. Isto é muito utilizado em situações na qual a aplicação já possui uma versão para MPI e se deseja realizar uma otimização para que ela seja executada em clusters máquinas multicore. É importante lembrar que a versão MPI-2 também possui rotinas que utilizam a memória compartilhada do sistema multicore para executar as trocas de mensagens. 4)É possível utilizar MPI com placas gráficas GPGPU? Sim, existem diversas implementações de aplicações que utilizam MPI em ambientes de placas gráficas GPGPU. Neste caso, o MPI é utilizado para a inicialização dos processos individuais nas máquinas do cluster, onde os processos irão executar parte do seu código nas placas GPGPU das máquinas. O grande problema das placas gráficas é que elas não acessam diretamente a memória principal as placas gráficas quando têm que acessar o dado da memória principal perdem muito o desempenho. Desta forma, não é toda aplicação que pode tirar um bom desempenho deste tipo de implementação. 5) Para que ser o arquivo Machinefile O arquivo machinefile apresenta a ordem com a qual as máquinas da cluster devem ser alocadas. Ele é criado durante a instalação do MPI. O usuário também pode criar um arquivo machinefile na sua conta local para alterar a ordem de alocação de máquinas que foi gerada durante a instalação. Neste caso, o comando é o seguinte: mpirun -machinefile "arquivo" -np 2 ./teste01 No caso de uma cluster formada por máquinas multicore, o machinefile pode informar o número de cores de cada máquina para que as CPU´s possam ser alocadas individualmente para cada processo MPI. 6) O que é RANK? O MPI utiliza o nome RANK para identificar os processos que são gerados para serem executados nas máquinas de um cluster. Observe que mesmo em um sistema que contém apenas um processador é possível gerar diversos processos MPI onde cada processo irá possuir um RANK. Por exemplo, se você tiver o MPI instalado em um laptop que possui apenas um processador, se você executar o programa teste01 com o comando “mpirun -np 10 ./teste01 “ o MPI irá criar 10 processos onde cada processo terá um número de RANK. Durante as operações de troca de mensagens, o número do RANK é fundamental para identificar o processo de envio e de recebimento, assim como o RANK é necessário para identificar a parte do código que cada processo deverá executar. 7) Para que serve o MPI_INIT? O MPI_INIT é a rotina de inicialização que estabelece a comunicação entre as máquinas da cluster e fornece o número de RANK de cada processo. 8) Porque devemos evitar enviar mensagens com poucos dados? Existem diversos gastos envolvidos durante a transferência de uma mensagem no MPI. Por exemplo, uma rotina send tem que enviar os dados armazenados no buffer da aplicação para o buffer do sistema operacional, que por sua vez terá que enviar para o buffer da placa "ethernet", se for o caso, que por sua vez tem que "empacotar" a mensagem segundo o protocolo TCP/IP, que por sua vez terá que jogar os dados na rede internet, que por sua vez, ao ser recebido pela placa ethernet do nó de recebimento terá que fazer as operações acima de trás para frente até que o dado chegue ao buffer da aplicação! Desta forma, uma maneira de aumentar o desempenho é acumular o máximo de dados possíveis dentro de uma mesma mensagem. 9) Qual é a relação entre a granularidade de uma aplicação e o desempenho que ela pode ter com o MPI? Em um sistema distribuído que utiliza MPI, se você tem um programa que passa muito mais tempo processando do que se comunicando (o que chamamos de granularidade grossa), ele terá poucos gastos com a comunicação. Caso os gastos venham a ser desprezíveis em relação ao tempo total de execução da aplicação poderemos obter uma aceleração ideal na qual para um número n de processadores se obtém o tempo de execução n vezes menor em relação a execução com apenas um processador. Quando o programa possui pouca computação em relação a comunicação (granularidade baixa) o ideal é utilizar um ambiente de computação onde a comunicação seja mais eficiente, como por exemplo uma rede de alta velocidade ou um sistema de memória compartilhada. É importante observar que dependendo da granularidade do seu programa mesmo em um ambiente de memória compartilhada você pode não conseguir diminuir o tempo de execução do seu programa com o aumento do número de processadores. 10) O que são GRUPOS? Um grupo pode ser criado dentro de um comunicador para facilitar ao programador o gerenciamento do algoritmo. O conceito de grupo facilita a implementação de operações coletivas em algoritmos onde grupos de máquinas se comunicam separadamente. Um processo pode pertencer a mais de um grupo e a mais de um comunicador, isto é útil em algoritmos complexos onde um processo tem que fazer comunicações com diferentes conjuntos de processadores.
Compartilhar