4 Funcionamento do MPI_SPY
4.3 Modo de Funcionamento do SPY_View
O SPY_View é a interface com o usuário. Nele serão exibidos os dados referentes as mensagens vindas do programa MPI através do SPY_Server. Diferentemente do SPY_Server, o SPY_View não é um programa servidor. Não existem outras instâncias em execução do SPY_View, sendo assim apenas uma conexão estará disponível para atender as requisições das múltiplas instâncias do SPY_Server que estiverem em execução.
Como o SPY_View irá receber as mensagens do SPY_Server, e o SPY_Server receberá as mensagens dos processos MPI, deve-se obedecer a uma certa ordem para se ter a execução destes programas:
1. SPY_View no computador que receberá as mensagens do SPY_View;
2. SPY_Server no computador que receberá as mensagens dos processos MPI;
3. Aplicação MPI.
Os itens 1 e 2 podem ocorrer em uma ordem diferente, mas o item 3 só pode ser iniciado depois de se ter iniciado o SPY_View e o SPY_Server.
4.3.1 Recebendo uma mensagem do SPY_Server
Ao receber uma mensagem o SPY_View irá processar essa mensagem e verificar qual o seu conteúdo. Como são seis mensagens interceptadas pelo SPY_Server e enviadas ao SPY_View, o conteúdo de cada uma delas será diferente.
O atendimento das instâncias do SPY_Server é feito da seguinte forma: ao receber uma primeira requisição, o SPY_View irá atender esta requisição. Quando obtiver o conteúdo da mensagem passada pelo SPY_Server, o SPY_View irá processar essa mensagem e verificar qual instrução foi interceptada pelo SPY_Server, para realizar a leitura dos dados da mensagem. Se neste ponto alguma outra instância do SPY_Server tentar se comunicar com o SPY_View para enviar alguma mensagem interceptada da aplicação MPI, esta nova instância não será atendida imediatamente, pois o SPY_View estará ocupado realizando o processamento da mensagem anterior. Após realizar o processamento desta mensagem o SPY_View estará liberado para ler uma outra mensagem enviada por outro SPY_Server.
Como mostra a Figura 4.7a, duas instâncias do SPY_Server estão tentando se comunicar com o SPY_View, a instância SPY_Server(1) e SPY_Server(2). O SPY_View irá atender primeiro a instância SPY_Server(1),
lendo a mensagem passada da aplicação MPI. Da mesma forma como acontece com o SPY_Server ao interceptar uma aplicação MPI, o SPY_View não possui um critério para selecionar qual mensagem será processada primeiro, ele fica apenas aguardando algum pedido de comunicação, e atende a primeira requisição que for solicitada. Ao se comunicar com o SPY_View, e enviar a mensagem que foi interceptada, o SPY_Server(1) irá finalizar, mas o SPY_View ainda deve processar a mensagem enviada pelo SPY_Server(1) antes de atender uma nova comunicação e receber uma nova chamada. O processamento da mensagem é feito de forma diferente para cada instrução, pois os dados passados em cada uma delas são diferentes. Durante o processamento da mensagem no SPY_View, o SPY_Server(2) ficará aguardando até que o SPY_View atenda a sua requisição, como está representado na Figura 4.7b. Após realizar o processamento da mensagem recebida do SPY_Server(1), o SPY_View estará apto a atender uma nova requisição, e então o SPY_Server(2) irá enviar sua mensagem contendo os dados da instrução interceptada da aplicação MPI para o SPY_View, que pode ser visto na Figura 4.7c.
4.3.2 Processamento da Mensagem no SPY_View
Ao receber uma mensagem do SPY_Server, o SPY_View irá fazer o processamento desta mensagem, primeiro verificando qual a instrução que foi executada para gerar aquela mensagem, e a partir disso, processar os outros dados da mensagem.
Na Figura 4.7 tem-se um exemplo de como é feito o processamento da instrução. Primeiramente o SPY_Server envia a mensagem com os dados da instrução para o SPY_View. Então o SPY_View irá verificar qual a instrução que foi executada, e a partir da identificação da instrução, o SPY_View irá fazer a leitura dos dados da instrução. Foi identificado que a instrução executada foi a MPI_Send, sendo assim será feita a leitura do conteúdo da mensagem de acordo com o que é passado na instrução MPI_Send. A leitura dos dados pode ser feita em apenas uma etapa ou é dividida em duas etapas. O comando mpirun, que gera as mensagens MPI_RUN e MPI_END, e as instruções MPI_Init e MPI_Finalize geram uma mensagem lida em apenas uma etapa. Já as outras instruções, MPI_Send e MPI_Recv geram mensagens que devem ser lidas em duas etapas.
Na Figura 4.8 são apresentadas algumas instruções contendo apenas um campo Parte 1, e outras instruções contendo dois campos: Parte 1 e Parte 2. Esses campos contêm mais de uma informação.
Para as instruções MPI_RUN e MPI_END a Parte 1 contêm o número de computadores utilizados pela aplicação e o nome da aplicação a ser executada. As instruções MPI_Init e MPI_Finalize contêm em Parte 1 o nome do computador que executou a instrução e o rank do processo MPI. As instruções MPI_Send e MPI_Recv têm a mesma informação na Parte 1, e na Parte 2 foram adicionadas as seguintes informações: tipo do dado na mensagem que será enviada na instrução MPI_Send, ou recebida pela instrução MPI_Recv, quantidade de elementos que serão enviados, o número do processo que está executando a instrução, e o número de processo para onde será enviada a mensagem para o caso da instrução MPI_Send, ou o número do processo de onde se receberá a mensagem no caso da instrução MPI_Recv.
Durante o processamento da mensagem, uma das tarefas realizadas pelo SPY_View é atualizar a interface, para que o usuário possa acompanhar o andamento da aplicação MPI. A interface não é atualizada simultaneamente a cada nova mensagem recebida. A interface obedecerá a um certo intervalo de tempo para poder realizar a atualização das informações exibidas ao usuário. Durante esse intervalo o SPY_View irá atender as requisições feitas pelo SPY_Server armazenando os dados referentes as mensagens que irão sendo enviadas. A outra tarefa feita pelo SPY_View é a criação de um log de instruções. Cada processo MPI que executar uma das instruções que será enviada para o SPY_View, terá um registro do momento da execução desta instrução armazenado em um log específico para o processo MPI.