next up previous
Next: Ambiente Up: Máquina Paralela Virtual (PVM) Previous: Máquina Paralela Virtual (PVM)


Introdução

Este texto descreve o sistema PVM e a forma como se desenvolvem programas, usando o software que o PVM constitui. O PVM foi especialmente desenhado para interligar recursos computacionais numa rede, fornecendo ao utilizador uma plataforma paralela para correr aplicações, independentemente da localização, da quantidade ou das diferenças entre os computadores na rede. Em PVM um programa vê um conjunto heterogéneo de computadores, UNIX, de um modo uniforme como se tratasse um único computador paralelo.

O PVM é o resultado de um projecto de investigação e colaboração entre Oak Ridge National Laboratory, the University of Tennessee, Emory University, and Carnigie Mellon University.

O PVM que evoluiu nos últimos anos até se tornar uma tecnologia viável para o processamento paralelo e distribuído, cobre um vasto leque de disciplinas, recorre a um modelo funcionalmente completo de passagem de mensagens.

Os objectivos deste texto são a apresentação e discussão do PVM com base nos seguintes tópicos:

Outros tópicos tais como: o desempenho ou a sobrecarga das comunicações, são também analisados. Para demonstrar as possibilidades do PVM na computação científica de grande escala, apresentamos ainda alguns programas exemplares.

O objectivo deste texto é ainda o de familiarizar os leitores com os conceitos básicos do PVM e da programação em redes de computadores, ao mesmo tempo que serve de guia para:

Origem

O projecto PVM teve início no verão de 1989 no Oak Ridge National Laboratory com a construção de um protótipo PVM 1.0, Vaidy Sunermam e Al Geist, que foi usado apenas internamente.

Em março de 1991 a Universidade de Tennessee desenvolveu a versão 2.0 que foi sucessivamente alterada, 2.1 - 2.4, como resultado das críticas e sugestões de utilizadores.

Em Fevereiro de 1993 estava concluída a versão 3.3, que agora apresentamos, distribuída livremente e utilizada em vários projectos em todo o mundo.

Em Julho de 1997 foi lançada uma nova versão do PVM, presumivelmente a última, que para além das emendas aos erros descobertos nas versões anterior oferce um conjunto notável de melhoramentos, nomeadamente, contextos de comunicação, tratamento automático de mensagens (tipo ``mensagens activas''), caixas de mensagens (anónimas), grupos estáticos, etc..

Introdução

O processamento paralelo é um método emergente nas novas tecnologias da programação que permite resolver problemas complexos dividindo-o em pequenas tarefas. A adopção e uso crescente deste método em computação científica de elevado desempenho e outras aplicações de uso mais geral, como forma de aumentar o desempenho e baixar o custo, sem fazer diminuir a produtividade, tem vindo a beneficiar do desenvolvimento de novas arquitecturas para o processamento maciçamento paralelo (MPP) e da vulgarização do uso de redes distribuídas de computadores. O factor mais importante a considerar é o custo. Grandes sistemas MPP tem um custo que excede os 10 milhões dólares. Comparativamente, a interligação de computadores já existentes tem um custo associado relativamente baixo. É evidente que as diferenças de capacidade computacional são enormes, mas, ainda assim, a computação distribuída permite resolver problemas que de outra forma seriam impensáveis.

Um conceito partilhado por ambas as aproximações é o da passagem de mensagens. Em qualquer processamento paralelo, os dados têm de ser trocados entre as diferentes tarefas. Vários paradigma têm vindo a ser utilizados tais como: partilha de memória, compiladores que paralelizam e passagem de mensagens. Este último têm vindo a ser adoptado se considerarmos que recorrem a este paradigma uma grande variedade de multiprocessadores, de aplicações, de linguagens ou de sistemas de software.

O PVM usa o modelo de passagem de mensagens como plataforma para a utilização da computação distribuída numa vasta gama de computadores, incluindo MPP, que do ponto de vista do utilizador são apenas uma enorme máquina virtual.

Computação em redes Heterogéneas

Num computador MPP, todos os processador são iguais dispondo das mesmas capacidades que no que respeita os recursos genéricos, o software ou a velocidade de comunicação. Esta situação é radicalmente diferente numa rede que tipicamente comporta diferentes computadores de diferentes vendedores ou diferentes compiladores e outros recursos.

A exploração de um sistema heterogéneo de computadores tem que tomar em atenção os seguintes tópicos:

$\diamond$ Arquitectura O conjunto de computadores na rede inclui uma vasta gama de arquitecturas que contemplam tanto o mais vulgar dos computadores pessoais como os super-computadores ou MPP. Esta diversidade ocasiona os seguintes problemas: $\diamond$ Formatos de dados Os formatos de dados são muitas vezes incompatíveis. Esta incompatibilidade é de enorme importância se considerarmos a necessidade de transferência de dados entre diferentes tarefas possivelmente distribuídas em diferentes arquitecturas. O modelo de passagem de mensagem gere as diferenças entre formatos, assegurando conversões apropriadas quer na origem quer no destino das mensagens. Infelizmente o desenvolvimento prematura dos mecanismos de passagem de mensagens em MPP específicos, não são os mais apropriados para a sua utilização em ambientes distribuídos porque a informação codificada em cada pacote não é suficiente para que o método seja utilizado em todo e qualquer computador. $\diamond$ Velocidade de Processamento Para a heterogeneidade contribuem ainda as diferentes velocidades de processamento dos computadores. Se considerarmos o caso em que um supercomputador concorre com outros computadores na mesma máquina virtual, há que assegurar que o programa tem que ser desenvolvido de forma a evitar que o supercomputador fique á espera dos dados que deverão ser enviados por outros computadores de mais baixo desempenho. $\diamond$ Carga Computacional O problema da velocidade de processamento abrange também a situação, em que máquinas diferenciadas dos seus recursos. Com efeito, a carga computacional em cada máquina e em cada momento é caracterizada pelo número de utilizadores simultâneas e recursos computacionais exigidos pelas diferentes aplicações em execução. $\diamond$ Carga de Comunicações Da mesma forma que a carga computacional, o tempo usado para enviar uma mensagem na rede depende da carga de comunicações na rede, imposta por todos os utilizadores na rede. Este tempo de comunicação pode ser de grande relevância em programas sensíveis ao instante de chegada de mensagens ou quando isso se reflecte numa efectiva perda de desempenho, ocasionada pela necessidade de uma tarefa ter de suspender a sua actividade, até descongestinar o sistema de comunicações e a mensagem chegue ao destino.

Apesar das numerosas dificuldades provocadas pela heterogeneidade a computação distribuída oferece também muitas vantagens:

Tendências na Computação Distribuída

Actualmente o poder computacional das estações de trabalho atinge valores de dezenas de milhões de operações por segundo e tudo leva a crer que essa capacidade tenha tendência a crescer. Mas para ser efectiva, essa capacidade necessita de elevadas velocidades de comunicação. Nos últimos 15 anos, as velocidades de transmissão aumentaram vários graus de grandeza.

Vista Geral do PVM

O PVM cria um enquadramento computacional uniforme que favorece o desenvolvimento rápido e directo de aplicações paralelas, em equipamentos já existentes. O modelo computacional é simples e geral adaptando uma grande variedade de estruturas de programação.

O PVM gere de forma transparente todo o encaminhamento de mensagens, a conversão de dados e o escalonamento de tarefas que se realiza numa rede heterogénea de computadores.

Outros Pacotes

PVM o Sistema

Os objectivos principais do projecto são a investigação dos problemas da computação concorrente e heterogénea e o desenvolvimento de soluções. O PVM é um conjunto integrado de bibliotecas e programas que fazem a emulação um sistema flexível, de uso geral numa rede distribuída e heterogénea de computadores.

O PVM foi construído a partir dos seguintes princípios básicos:

configuração personalizada:
as tarefas, que constituem cada aplicação particular, executam num conjunto de máquinas seleccionadas pelo utilizador. Podem ser seleccionadas quaisquer tipos de máquinas, uniprocessador ou multiprocessador ( memória partilhada ou distribuída). O conjunto inicial de computadores pode ser aumentado ou reduzido dinamicamente, adequado a tolerância a falhas.
acesso transparente ao hardware:
as aplicações olham para os equipamentos como uma colecção virtual de processadores ou, em alternativa, podem explorar o hardware específico colocando determinadas tarefas em computadores determinados;
computação baseada em processos:
a unidade de paralelismo em PVM é a tarefa, ( normalmente um processo em Unix), que é um fluxo independente e sequencial de controlo que alterna entre computação e comunicação. O modelo não força qualquer tipo de relação processo-processador, em particular, pode dizer-se que múltiplas tarefas podem ser executadas num único processador.
modelo explícito de passagem de mensagens:
as tarefas cooperam, enviando ou recebendo voluntariamente mensagens. O tamanho de uma mensagem é apenas limitado pelo disponibilidade de memória existente;
heterogeneidade:
de máquinas, redes e aplicações. No que respeita ao modelo de comunicação, a transferência de informação inclui vários tipos de dados, que podem ser circular entre computadores com diferentes representações de dados.
multi-processadores:
uso de mecanismos de passagem de mensagens nativos suportados pelo hardware específico. Cada vendedor produz uma versão optimizada do PVM para a arquitectura sem prejuízo da ligação á versão pública.
O sistema é composto de duas partes, o servidor PVMD e uma biblioteca de rotinas para interface com as aplicações. O servidor, que tem de existir em cada um dos computadores que constituem a máquina virtual, foi concebido de forma a poder ser instalado localmente em cada computador por qualquer utilizador com um nome válido.

Para executar uma aplicação o utilizador começa por arrancar com o PVM a que se segue a execução da aplicação, da forma tradicional em Unix, em qualquer um dos nodos que constitui a máquina virtual. Múltiplos utilizadores podem criar a sua própria máquina virtual, com os recursos associados, e cada utilizador poderá correr múltiplas aplicações simultaneamente.

A biblioteca contém um repertório completo de rotinas primitivas necessárias para o estabelecimento da cooperação entre tarefas. A biblioteca inclui rotinas acessíveis ao utilizador, para a criação de tarefas, a passagem de mensagens, a sincronização entre tarefas e a alteração da máquina virtual. O modelo de computação PVM baseia-se na noção de aplicação como um conjunto de tarefas em que cada uma é responsável por uma das partes do problema. A esta divisão correspondem duas possíveis visões:

paralelismo nas funções:
a aplicação é dividida em tarefas de acordo com a funcionalidade esperada, isto é cada tarefa é responsável por uma função distinta, por exemplo a entrada de dados, a saída de dados, o estabelecimento das condições iniciais, etc.
paralelismo nos dados:
neste método mais habitual, todas as tarefas são iguais, mas cada uma delas conhece apenas uma pequena parte do problema para o qual é requerida a sua participação na resolução. Este método é vulgarmente designado por SPMD.
Actualmente, as linguagens hospedeiras que podem evocar o PVM são o C, o C++ e o Fortran. que foram escolhidas por se considerar que, a maioria das aplicações actualmente desenvolvidas são escritas nessas linguagens.

Os programas escritos em C e C++ podem ter acesso às bibliotecas do PVM se forem convenientemente ligados á bibliotecas públicas libpvm3.a. No caso do Fortran o acesso às bibliotecas é realizado por rotinas em vez de funções que usam bibliotecas de conversão libfpvm3.a que por sua vez evocam as rotinas C da biblioteca anterior. Aparte esta diferença e os nomes escolhidos para prefixo, das funções ou rotinas correspondentes, existe uma correspondência biunívoca entre funções em C e rotinas em Fortran.

Em PVM todas as tarefas são identificadas por um número inteiro TID, único em toda a máquina virtual, que é criado automaticamente pelo pvmd local sempre que uma nova tarefa é gerada. O inteiro codifica uma identificação não relevante para a aplicação.

Em aplicações em que é natural a constituição de grupos de interesse, ou nos casos em que para a própria aplicação é útil a identificação das tarefas por números, ( 0 - (p -1) em que p representa o número de tarefas), o PVM possibilita o uso do conceito de grupos declarados. Assim quando uma tarefa entra num grupo é-lhe atribuída um número de identificação no grupo, que começa em zero e aumenta para cada novo elemento que se lhe reune.

A filosofia de grupo declarado é extremamente simples podendo qualquer tarefa entrar ou sair do grupo a qualquer momento e fazer parte de múltiplos grupos, ou difundir mensagens para as tarefas de um grupo, sem que para isso tenha de informar qualquer uma das outras tarefas na aplicação.

Ao paradigma geral para o desenvolvimento de uma aplicação em PVM correspondem os seguintes passos:

O processo descrito atrás representa apenas um cenário típico compatível com a criação de novas tarefas, iniciadas manualmente. As tarefas comunicam enviando e recebendo, explicitamente, mensagens que identificam o destinatário e o remetente com base nos respectivos números de identificação, TIDs.

Exemplo

O exemplo que apresentamos a seguir ilustra os conceitos básicos da programação em PVM. O programa olá, evocado manualmente, depois de imprimir o seu TID, obtido pela evocação da função pvm_mytid(), lança uma cópia de um outro programa olá_meu recorrendo á função pvm_spawn().

O programa evoca uma nova função pvm_rec() e entra em modo de recepção bloqueante. A chegada da mensagem liberta-o do estado de espera, seguindo-se a obtenção do conteúdo da mensagem e da identificação do respectivo remetente, função pvm_upstr(). O programa desassocia-se da máquina virtual pvm_exit() depois de imprimir a mensagem no écran.

O programa olá_meu começa por obter a identificação do programa que o lançou, pvm_parent() assim como o nome do computador hospedeiro. A informação obtida no passo anterior é seguidamente transmitida, usando uma sequência de três funções:

  1. pvm_initsend() - para iniciar um tampão de memória para comunicação;
  2. pvm_pkstr() - para colocar uma mensagem no tampão;
  3. pvm_send() - para enviar, finalmente, a mensagem. Um dos parâmetros da função de emissão é uma etiqueta de identificação da mensagem.

next up previous
Next: Ambiente Up: Máquina Paralela Virtual (PVM) Previous: Máquina Paralela Virtual (PVM)

1999-06-26