• Nenhum resultado encontrado

6.7 Interface de Passagem de Mensagens — MPI

6.7.2 Rotinas de Comunicação

6.7.2.1 Comunicação Ponto-a-Ponto

As rotinas de comunicação ponto-a-ponto baseiam-se nos comandos de envio57 e de recepção58

de mensagens entre dois processos (vd. figura 6.19). Estas podem assumir, de acordo com as necessidades de programação, tipos de transmissão bloqueantes ou não-bloqueantes. A selecção de um determinado tipo de transmissão pode estar relacionada com a sincronização requerida pelos processos ou com a necessidade de desempenho imposta por determinadas aplicações.

54Do inglês: communicator. 55Do inglês: rank.

56A importância da definição do comunicador prende-se com o facto da comunicação apenas poder ocorrer entre

processos que partilhem o mesmo comunicador. Não obstante o MPI permitir a definição de comunicadores adici- onais, no seguimento do texto considerar-se-á implicitamente, sem perda de generalidade, que todos os processos envolvidos numa comunicação partilham o comunicador geralMPI_COMM_WORLD.

57Do inglês: send. 58Do inglês: receive.

Interface de Passagem de Mensagens — MPI

Figura 6.19: Representação esquemática da passagem de mensagem através de comandos de envio e de recepção.

Uma rotina de envio é dita bloqueante, se não permitir que o processo emissor continue a ser executado até que a zona de armazenamento da mensagem (buffer ) possa ser reutilizada pelo referido processo, i.e. aquando da conclusão da operação de envio. Este tipo de comportamento garante que os dados armazenados no buffer de emissão não sofrem qualquer tipo de modificação até à sua transmissão para a rede de interligação. No entanto, atenda-se ao facto de não se garantir a correcta recepção da mensagem pelo processo-alvo; apenas se garante que a mensagem é correctamente transmitida pelo processo de emissão. Analogamente, uma rotina de recepção é dita bloqueante, se permitir que o processo receptor continue a ser executado unicamente após a recepção integral da mensagem comunicada, i.e. aquando da recepção total da mensagem por parte do buffer de recepção.

No que concerne ao tipo de envio bloqueante, o MPI define quatro modos de comunicação ponto-a-ponto:

1. Síncrono59— o processo emissor somente retoma a sua execução, após se ter iniciado o rece- bimento da mensagem por parte do buffer de recepção, assim que se conclua a transferência de dados a partir do buffer de emissão;

2. Pronto60 — a mensagem é enviada para a rede de interligação logo que ocorra a execução

do comando de envio pronto por parte do processo emissor. No entanto é necessário que este processo tenha já recebido uma notificação previamente enviada por parte do processo receptor, informando-o de que a transferência pode ser efectuada. Caso contrário, ocorre um erro no programa;

3. Armazenado61 — a mensagem é copiada do buffer de emissão do processo emissor para um

buffer de sistema, o qual deve ser previamente definido pelo programador. Após a conclusão

da operação de cópia, o processo emissor retorna ao seu modo de execução. Deste modo, este processo pode proceder a alterações nos dados do seu buffer de emissão, visto que estas não se irão reflectir na mensagem que será enviada;

4. Padrão62— depende da implementação de MPI considerada [MPIF 1995]. Em geral podem

ocorrer duas situações distintas, consoante o tamanho da mensagem a ser transmitida seja ou não superior a um valor crítico, designado valor-limiar63. No primeiro caso, o processo de

comunicação ocorre de um modo que em parte se assemelha ao verificado quando se utiliza o comando de envio síncrono. No segundo caso, verifica-se que, após a execução do comando de envio padrão, a mensagem é copiada, através da rede de interligação, do buffer de emissão do

59Do inglês: synchronous. 60Do inglês: ready. 61Do inglês: buffered. 62Do inglês: standard. 63Do inglês: threshold.

Interface de Passagem de Mensagens — MPI

processo emissor para um buffer do sistema localizado no nó associado ao processo receptor, retornando o processo emissor ao seu modo de execução logo que se completa a transferência da mensagem no buffer de emissão.

Aos modos de envio bloqueante correspondem as rotinas de comunicação ponto-a-ponto bloque- ante MPI_SSEND (envio síncrono), MPI_RSEND (envio pronto), MPI_BSEND (envio armazenado) e MPI_SEND (envio padrão). No entanto, no MPI é definido um único modo de recepção bloqueante, a que corresponde a rotina de comunicação ponto-a-ponto bloqueante MPI_RECV. A recepção blo- queante caracteriza-se pelo facto de o processo receptor apenas retomar a sua execução assim que se verificar o recebimento integral da mensagem por parte do buffer de recepção.

Em contraste, as rotinas de envio e de recepção não-bloqueantes permitem que um processo continue a ser executado logo após a sua invocação. Assim, embora possibilitem aos processos desempenharem outras tarefas em simultâneo com as de comunicação, não garantem que a ope- ração para a qual foram invocadas tenha sido concluída. Deste modo, não é seguro proceder-se à modificação do conteúdo de um buffer antes de se ter a certeza de que a transferência de da- dos tenha sido concluída de modo efectivo. Neste contexto, são providenciadas rotinas auxiliares que possibilitam testar se a comunicação foi ou não concluída (MPI_WAIT e MPI_TEST). Um dos principais objectivos da utilização do tipo de transmissão não-bloqueante consiste na melhoria do desempenho das aplicações. No que concerne ao tipo de envio não-bloqueante, o MPI define os mesmos quatro modos de comunicação ponto-a-ponto que para o tipo de envio bloqueante, a que correspondem as rotinas de comunicação ponto-a-ponto não-bloqueante MPI_ISSEND (envio síncrono), MPI_IRSEND (envio pronto), MPI_IBSEND (envio armazenado) e MPI_ISEND (envio pa- drão). De modo semelhante, no MPI é definido um único modo de recepção não-bloqueante, a que corresponde a rotina de comunicação ponto-a-ponto não-bloqueante MPI_IRECV. As rotinas não-bloqueantes apresentam a vantagem de os processos emissor e receptor poderem continuar o seu modo de execução, mesmo que a mensagem ainda não tenha sido completamente transferida do buffer de emissão ou para o buffer de recepção, respectivamente. Este facto permite a elimi- nação de fenómenos de bloqueio mútuo64 e a redução do overhead de sistema. No entanto, a sua utilização exige um controlo mais cuidado por parte do programador.

No Apêndice B apresenta-se uma análise detalhada dos principais aspectos relativos ao processo de passagem de mensagens em cálculo paralelo e distribuído utilizando rotinas de comunicação ponto-a-ponto, quer bloqueante quer não-bloqueante.