4 Funcionamento do MPI_SPY
4.1 Alterações feitas na biblioteca MP
4.1.2 Momento do Envio da Mensagem do Programa MPI para o SPY_Server
Informações adicionais são necessárias quando se executa uma instrução MPI_Send ou MPI_Recv. Nessas duas instruções são necessários os dados:
1. O tamanho da mensagem que está sendo executada pelo cluster 2. O tipo de cada elemento no vetor de mensagens.
4.1.2 Momento do Envio da Mensagem do Programa MPI para o SPY_Server
Devido a algumas características das funções que são interceptadas pelo SPY_Server, elas não são interceptadas em um mesmo ponto de execução, isto é, no início de cada instrução ou antes do término.
4.1.2.1 Interceptando a Instrução mpirun
A instrução mpirun é utilizada para se iniciar a execução de um programa no cluster, e ela é interceptada em dois pontos durante a sua execução: no início da instrução e no fim da instrução.
A interceptação no início é feita para se saber o instante em que a aplicação começou a ser executada. Na verdade a mensagem é passada ao SPY_Server é a primeira operação dessa instrução. Por ser a primeira requisição feita ao SPY_Server, esta ocorre sem problemas, pois no início não haverá qualquer outra requisição sendo atendida
E ao final da instrução é feita uma nova interceptação, para se saber se houve a conclusão da aplicação MPI, como pode ser visto na Figura 4.3.
Figura 4.3: Interceptação da instrução MPI_RUN
A mensagem MPI_END, por ser enviada ao final da aplicação MPI, poderá encontrar o SPY_Server sobrecarregado atendendo outras instruções MPI. Nesse caso, a mensagem só será recebida pelo SPY_Server, quando este não estiver mais sobrecarregado. E ao receber a mensagem contendo o MPI_END, o SPY_Server só poderá enviar esta mensagem ao SPY_View, quando já tiver enviado todas as outras que estavam sendo enviadas, para garantir que a mensagem MPI_END realmente indique o fim da aplicação MPI.
Ao se executar o comando:
$ mpirun –v 4 progmpi
Será iniciado o processo de execução do programa progmpi pela biblioteca MPI. Antes de realizar qualquer procedimento da biblioteca MPI para administrar o programa progmpi, será enviada uma mensagem ao SPY_Server sinalizando o início da execução do programa progmpi, correspondente a passo 1 da Figura 4.3. Após isso são iniciados 4 processos referentes ao progmpi no cluster, e ao terminarem de executar será enviada uma nova mensagem ao SPY_Server indicando o fim da execução do programa progmpi, que está indicado na Figura 4.3 como passo 2.
4.1.2.2 Interceptando a Instrução MPI_Init
A instrução MPI_Init é a primeira a ser executada em um programa MPI. Sendo assim durante a sua execução algumas variáveis que serão incluídas na mensagem ainda não foram inicializadas, portanto a mensagem não pode ser interceptada logo no início da execução desta instrução. O ponto onde a mensagem é enviada ao SPY_Server fica próximo da metade da execução do MPI_Init. Caso o SPY_Server não esteja tratando alguma outra mensagem, a operação de interceptação ocorre normalmente, e a instrução MPI_Init continua sendo executada. Caso não haja uma disponibilidade do SPY_Server em atender esta requisição no instante que foi solicitado, a instrução MPI_Init ficará temporariamente paralisada, esperando o atendimento ser feito pelo SPY_Server.
4.1.2.3 Interceptando a Instrução MPI_Send
A instrução MPI_Send é utilizada para se enviar uma mensagem de um processo a outro em uma aplicação MPI. Nesta instrução, a interceptação da mensagem ocorre no início da instrução, sendo a primeira operação realizada durante sua execução.
Apesar de se utilizar uma instrução bloqueante, não é feita uma checagem verificando se os dados da instrução foram passados corretamente, e também não é feita uma verificação de quando a instrução é concluída, pois estas duas verificações são feitas e garantidas pela biblioteca MPI. O SPY_Server recebe apenas uma mensagem indicando que a instrução MPI_Send foi utilizada pela aplicação MPI.
As condições para o atendimento desta mensagem pelo SPY_Server se mantêm, ou seja, a mensagem só é passada da aplicação MPI para o SPY_Server se houver menos de 5 requisições sendo atendidas, caso contrário, a instrução MPI_Send ficará aguardando o SPY_Server.
Quando houver uma disponibilidade do SPY_Server para o atendimento desta instrução, a mensagem será enviada da aplicação MPI para o SPY_Server e então o a biblioteca MPI seguirá normalmente com o procedimento de envio dos dados de um processo MPI para outro.
4.1.2.4 Interceptando a Instrução MPI_Recv
A instrução MPI_Recv é utilizada para se receber uma mensagem em um processo vinda de outro em uma aplicação MPI. A interceptação da instrução é análoga a interceptação do MPI_Send, ou seja, ocorre no início da instrução. As regras para o atendimento desta mensagem pelo SPY_Server também são os mesmos.
Da mesma forma que acontece com a instrução MPI_Send, existem mecanismos de controle que garantem o funcionamento adequado da instrução MPI_Recv, não havendo necessidade de existir uma verificação do conteúdo da mensagem pelo SPY_Server.
Também não existe uma verificação checando se para cada instrução MPI_Send houve a execução de uma instrução MPI_Recv, pois isto será uma verificação visual do próprio usuário ao visualizar a interface do SPY_View.
4.1.2.5 Interceptando a Instrução MPI_Finalize
A instrução MPI_Finalize é executada ao final da execução da aplicação MPI. A interceptação desta mensagem é feita no início de sua execução.
As regras para o atendimento desta requisição pelo SPY_Server são as mesmas regras válidas para as instruções MPI_Init, MPI_Send e MPI_Recv, ou seja, caso o limite de 5 conexões ao SPY_Server não tenha sido atingido, a mensagem será enviada ao SPY_View, caso contrário, o processo MPI ficará aguardando a disponibilidade do SPY_Server em receber essa conexão para enviar a mensagem informando a execução da instrução MPI_Finalize ao SPY_View. Não existe um controle feito pelo SPY_Server para verificar se existe alguma mensagem pendente, esta verificação pe feita pela biblioteca MPI.
A finalização da aplicação MPI é verificada quando a instrução mpirun envia a mensagem MPI_END ao SPY_Server.