Saltar para o conteúdo

Parallel Virtual Machine

Origem: Wikipédia, a enciclopédia livre.
Navegação no histórico de edições: ← ver edição anterior (dif) ver edição seguinte → (dif) ver última edição → (dif)

Como a paralelização pode ajudar a resolver problemas complexos de otimização


Uma característica comum aos problemas de otimização é a dificuldade de encontrar uma solução ótima. O grande número de variáveis e restrições tornam esses problemas extremamente complexos exigindo uma grande quantidade de recursos computacionais para resolver mesmo problemas de pequeno ou médio porte. Como nem toda empresa tem os recursos necessários para financiar um ambiente computacional compatível com as necessidades impostas pelos problemas sendo pesquisados, há que se tirar o máximo proveito dos recursos existentes.

A norma hoje em dia nas empresas é possuir uma rede de comunicação formada por pontos (computadores) de baixo e médio custo que permitem compartilhar os recursos computacionais como CPUs e impressoras, ou seja, uma rede local. Essa topologia substituiu a organização centralizada dos recursos computacionais em um mainframe que possuía um alto poder de processamento e uma boa taxa de E/S (entrada e saída). Esses dois quesitos foram sacrificados nessa mudança e a busca por um melhor desempenho, maior confiabilidade e maior modularidade impulsionou o desenvolvimento de arquiteturas distribuídas e paralelas.

Computação Paralela e Seus Tipos

É conveniente definir neste momento o conceito de computação paralela. Dizemos que está havendo computação paralela quando, num dado instante, existe mais de um processador trabalhando na resolução de um mesmo problema. Não é raro ver este termo erroneamente associado à execução de mais de um processo (ou programa) em um único processador através do acesso intercalado a ele. Neste caso não está ocorrendo um processamento paralelo, mas sim uma multitarefa. Considerando a definição de computação paralela acima, temos duas maneiras de obter um processamento paralelo: (1) usando uma máquina que possua mais de um processador (e um sistema operacional capaz de operá-los) ou (2) usando processadores de máquinas distintas para obter o paralelismo. Chamaremos o primeiro tipo de paralelismo de paralelismo interno e o segundo tipo de paralelismo externo.

O paralelismo interno é a maneira mais clássica de se obter um processamento paralelo e é também a mais rápida e eficiente. Por outro lado, esta solução exige um hardware especial cuja complexidade de projeto aumenta exponencialmente com o número de processadores, um sistema operacional que consiga gerenciar o processamento paralelo e programadores treinados em desenvolvimento multithread (desenvolvimento de código destinado a rodar em mais de um processador, possivelmente de tipos diferentes). Tudo isso se reflete em um aumento dos custos que podem inviabilizar o projeto de uso de computação paralela.

O paralelismo externo pressupõe o uso de uma rede de comunicação que interligue os processadores das máquinas para que estes possam trabalhar em conjunto. Além da rede de comunicação, é necessário uma camada de software que possa gerenciar o uso paralelo destas máquinas. Se por um lado o paralelismo externo é potencialmente mais lento que o interno devido às baixas velocidades de transmissão das redes locais (em comparação com a velocidade do barramento interno que liga os processadores de uma máquina paralela), ele é muito mais acessível pois utiliza equipamentos de linha (mais baratos), não exige investimentos em software pois existem softwares gratuitos que implementam o gerenciamento das tarefas paralelas e também não exige conhecimentos especiais dos programadores que aprendem rapidamente a usar as primitivas de paralelização. Discutiremos neste texto como obter o paralelismo externo com o uso do pacote de paralelização PVM (Parallel Virtual Machine).

Afinal, O que é PVM?

PVM é uma abreviatura para Parallel Virtual Machine, ou Máquina Paralela Virtual. O PVM permite que um conjunto de máquinas heterogêneas seja enxergado como uma única máquina paralela virtual. O PVM lida transparentemente com o roteamento de mensagens, conversão de dados e o escalonamento de processos em uma rede formada por arquiteturas antes incompatíveis.

Usuários do PVM desenvolvem suas aplicações como uma série de tarefas PVM que trabalham juntas na resulução de um problema. As tarefas têm acesso aos recursos do PVM através de uma interface padrão composta de rotinas implementadas em uma biblioteca de funções que é compilada juntamente com o código do programa. O PVM atualmente possui bibliotecas para as linguagens C e Fortran, mas há registro de seu uso com outras linguagens como LISP.

As primitivas de troca de mensagens foram desenvolvidas para trabalhar em ambientes heterogêneos. Antes de ser transmitido, um dado precisa ser empacotado, ou seja, transformado para uma forma canônica que possa ser entendida por todas as máquinas da rede. Assim, ao empacotar um valor inteiro para transmissão, o usuário não tem que se preocupar com o número de bytes usados para representar um inteiro em cada máquina nem com a ordem em que esses bytes são armazenados.

A programação no ambiente PVM segue o paradigma da programação de aplicações com multiprocessadores e memória distribuída (MIMD). As técnicas de programação no lado lógico e algorítmico também são as mesmas, mas certos aspectos devem ser levados em conta como o gerenciamento da máquina virtual e o tempo de comunicação entre os processos. Considere, por exemplo, o problema da soma de dois vetores de dados n-dimensionais. Uma forma intuitiva de implementar uma solução paralela é criar uma tarefa mestre responsável por particionar os vetores em p partições de igual tamanho, onde p é o número de máquinas disponíveis na MV (Máquina Virtual), e distribuir esses subproblemas para p tarefas escravo. Uma vez resolvidos, os resultados dos subproblemas são enviados para a tarefa mestre e concatenados para gerar a solução global. Uma análise ingênua pode deduzir que esta solução dividiria o tempo total de execução por p (considerando uma rede homogênea), ocorre que o tempo gasto na transmissão dos subvetores para as aplicações escravo somado com o tempo de transmitir as respostas parciais para a aplicação mestre pode deteriorar o desempenho global ao ponto de a solução serial (não paralela) é mais rápida.

O exemplo acima mostra que fatores como a heterogeneidade da rede somado com os atrasos impostos pela mídia de comunicação dos processos podem influir de maneira decisiva na eficiência dos algoritmos implementados. Tendo isso em vista, podemos concluir que o uso do PVM é mais indicado para casos aonde o processamento em cima dos dados seja complexo o suficiente para que os atrasos de comunicação sejam compensados pelo ganho de performance fornecido pela paralelização. Felizmente, este muitas vezes é o caso em problemas da Pesquisa Operacional (PO).

Obtendo e Instalando o PVM

A versão mais recente do código fonte do PVM e de sua documentação está sempre disponível no site da netlib. Netlib é um serviço de distribuição de software montado na Internet que contém distribuições de variados tipos de programa. Os softwares podem ser obtidos na netlib via WWW, ftp e email. A seguir descrevemos como obter o software em cada uma das maneiras citadas:

   * WWW - Esta talvez seja a maneira mais fácil de pegar a última versão do PVM. 

Os arquivos do PVM estão disponíveis no endereço http://www.netlib.org/pvm3/index.html.

   * Ftp - O endereço ftp da netlib é ftp.netlib.org. Verifique o diretório pvm3, o arquivo 

index contém uma descrição dos arquivos do diretório e seus subdiretórios.

   * Email - O acesso por email é feito em duas etapas. Primeiramente deve-se mandar 

um email para netlib@netlib.org com a mensagem send index from pvm3. Um programa automatizado irá devolver uma lista dos arquivos disponíveis e instruções sobre como continuar o download por email.

A versão mais recente do PVM quando da escrita deste texto é a 3.3.11 (a versão 3.4.beta6 é apenas uma versão beta e não foi considerada uma distribuição de fato). Considerando os pacotes dirigidos ao ambiente UNIX, esta versão pode ser obtida em dois formatos:

   * GZIP/TAR - fazendo o download do arquivo pvm3.3.11.tgz.
   * UUENCODE/COMPRESS/TAR - fazendo o download do arquivo pvm3.3.11.tar.z.uu.

Recomendamos pegar o arquivo no formato GZIP/TAR pois é bem menor do que a versão UUENCODE/COMPRESS/TAR, pois esta última é codificada para ser transmitida por email e esta codificação (codificação uuencode) aumenta o tamanho do arquivo em 37%. Infelizmente o formato UUENCODE é o único formato disponível para quem tem acesso apenas por email à Internet. A seguir mostraremos como desempacotar ambos os tipos de distribuição.

Formato GZIP/TAR

Para abrir este tipo de arquivo são necessários 2 programas: o programa gzip, que é um compressor/descompressor fornecido pela Free Software Foundation, e o programa tar, que é um dos utilitários padrão que vem com praticamente todas as versões do UNIX. Caso você não tenha o programa gzip, peguem uma cópia no servidor ftp da UNICAMP: ftp.unicamp.br diretório /pub/gnu. Este repositório também pode ser acessado via WWW: http://ftp.unicamp.br.

O comando para desempacotar este arquivo é:

gzip -dc pvm3.3.11.tgz | tar xv

Este procedimento irá criar um diretório chamado pvm3 sob o diretório corrente. As instruções para compilar e configurar o PVM se encontram no arquivo pvm3/Readme. Uma dica importante neste ponto é configurar uma variável de ambiente chamada PVM_ROOT cujo valor é o diretório de instalação do pvm, por exemplo, /usr/local/pvm3.

Formato UUENCODE/COMPRESS/TAR

Este é o tipo de arquivo que você irá receber caso opte por fazer o download via email. Você precisará dos programas uudecode, uncompress e tar para completar os procedimentos abaixo. Os programas uncompress e tar são padrões em sistemas UNIX mas o uudecode não. Verifique se o seu sistema possui o uudecode ou então pegue uma versão do programa no ftp da UNICAMP: ftp.unicamp.br diretório /pub/unix-c/mail. O procedimento para abrir o arquivo que contém a distribuição PVM no formato UUENCODE/COMPRESS/TAR é: 1. Salvar o email no qual você recebeu o pacote PVM com o nome pvm3.3.11.tar.z.uu. A forma exata de fazer isso depende do programa de email utilizado, consulte o manual do seu software.

2. Rodar o programa uudecode para gerar o arquivo pvm3.3.11.tar.Z. A linha de comando é: uudecode pvm3.3.11.tar.z.uu

3. Abrir o pacote com o comando: uncompress -c pvm3.3.11.tar.Z | tar xv Estes procedimentos irão criar um diretório chamado pvm3 sob o diretório corrente. As instruções para compilar e configurar o PVM se encontram no arquivo pvm3/Readme. Uma dica importante neste ponto é configurar uma variável de ambiente chamada PVM_ROOT cujo valor é o diretório de instalação do pvm, por exemplo, /usr/local/pvm3.

A Máquina Virtual do PVM

Para tratar um conjunto de máquinas interligadas por uma rede como um grande computadore multiprocessado virtual, O PVM roda um programa daemon chamado pvmd em cada uma das máquinas componentes da MV (Máquina Virtual). Toda a comunicação entre duas máquinas da MV passam pelos processos pvmd que rodam nas máquinas em questão. Por exemplo, se um processo de uma máquina A quer mandar uma mensagem para um processo na máquina B, esta mensagem será enviada para o pvmd da máquina A, passará para o pvmd da máquina B e só então será repassada para o processo destino na máquina B.

Montar uma MV no PVM significa iniciar um pvmd em cada uma das máquinas que queremos presente na MV. O primeiro pvmd que é iniciado numa MV funciona como mestre e é o único capaz de reconfigurar a MV como acrescentar ou remover máquinas. A partir do pvmd mestre, os demais pvmds são iniciados com status de escravos. Pedidos de reconfiguração da MV vindos de processos cujo pvmd local seja um pvmd escravo são repassados ao pvmd mestre e executados de lá.

Existem duas maneiras de montar uma máquina virtual, através de um programa feito pelo usuário ou usando o console do PVM, um programa chamado pvm que vem junto com a distribuição do PVM. Descreveremos inicialmente o uso do console do PVM e mais para frente discutiremos como controlar a configuração da MV além de passar mensagens e gerenciar tarefas PVM no modo programado.

O Console do PVM

A partir do console do PVM é possível executar diversas tarefas de gerenciamento da MV. Algumas tarefas comuns são:

   * acrescentar e remover máquinas na MV;
   * iniciar e encerrar tarefas em máquinas que fazem parte da MV;
   * listar parte ou todas as tarefas da MV;
   * eviar sinais para tarefas.

Para iniciar a execução do console do PVM, basta digitar pvm na linha de comando do seu shell: [user@quark user]$ pvm pvm>


Para acrescentar novas máquinas em sua MV (ao ser iniciado o console acrescenta a máquina atual na MV caso ela já não esteja presente), use o comando add: pvm> add quark

1 successful

HOST DTID

quark 40000

pvm>


Para verificar a configuração atual da MV use o comando conf: pvm> conf

1 host, 0 data format

HOST DTID ARCH SPEED DSIG

quark 40000 LINUX 1000 0x00408841

pvm>


Para encerrar a execução do console sem desativar a MV, use o comando quit: pvm> quit


Console: exit handler called

pvmd still running.


Antes de finalizar o programa, o console avisa o usuário que o daemon do PVM (pvmd) ainda está rodando, portanto a MV continua ativa. Para encerrar tanto o console quanto a MV o comando a ser usado é halt: [user@quark user]$ pvm

pvmd already running.

pvm> conf

1 host, 0 data format

HOST DTID ARCH SPEED DSIG

quark 40000 LINUX 1000 0x00408841

pvm> halt

Terminated

[user@quark user]$ Programando o PVM

O programa console do PVM nada mais é que uma aplicação desenvolvida a partir da biblioteca do pvm (libpvm.a) cuja função é fornecer uma interface para que o usuário modifique a configuração da MV e possa fazer algum gerenciamento de tarefas. Para explorar todas as capacidades do sistema PVM, é necessário programar um algoritmo paralelo que se adeqüe ao problema sendo estudado. A eficiência do algoritmo paralelo é altamente dependente da decomposição do algoritmo serial em tarefas independentes. Essa decomposição em tarefas independentes (ou concorrentes) leva em conta questões como:

   * Qual será o tamanho (tempo de execução) das tarefas independentes em
relação ao tamanho do algoritmo serial correspondente? Essa medida é chamada de grão de paralelização.
   * Quanto tempo será gasto em transmissão dos dados de cada grão para os 

processadores envolvidos na paralelização?

O tamanho escolhido para o grão de paralelização deve levar em conta os tempos de transmissão dos dados do grão em relação ao seu tempo de execução. Quanto maior for o tempo de execução do grão, menores serão os custos relativos à comunicação. Os problemas encontrados na PO tendem a apresentar um tempo de solução que cresce exponencialmente com o tamanho do problema. Esta característica facilita a decomposição das tarefas e permite bons ganhos de performance, speedup no jargão da computação paralela. Via de regra, o grão deve ser dimensionado de tal forma que a transmissão dos dados na rede não comprometa a performance do algoritmo paralelo, isto é, o algoritmo paralelo deve fornecer ganhos suficientes para justificar o esforço de paralelização.

A Interface de Programação

O PVM fornece duas interfaces análogas de programação, uma em linguagem C/C++ e outra em linguagem FORTRAN. Estaremos descrevendo neste texto as rotinas da interface C/C++ mas todas as funções e conceitos são facilmente adaptados para a interface FORTRAN, muitas vezes apenas com a mudança do nome da função (por exemplo, a função C pvm_mytid() é escrita em FORTRAN como pvmfmytid()).

Funções de Controle de Processos

Toda aplicação paralela pressupõe a existência de diversos processos que rodam concorrentemente. O gerenciamento de processos, ou tarefas como os processos são comumente referenciados na documentação do PVM, é feito através de um conjunto de funções de controle de processos. Os mais importantes são:

   * pvm_mytid() – Devolve o identificador (um valor inteiro) pelo qual o processo chamador
é conhecido na MV. Este número é usado pelos demais processos PVM para comunicar-se com o 

processo chamador. Esta função normalmente é a primeira função PVM chamada no programa e tem a função dupla registrar o processo na MV e informar ao processo o seu identificador na MV.

   * pvm_exit() – É a última função a ser chamada por um programa PVM. Ele informa ao pvmd 

local que o processo está se desligando da máquina virtual. A boa praxe de programação PVM exige que um programa comece com pvm_mytid() e termine em pvm_exit().

   * pvm_spawn() – É usado para iniciar novas tarefas na MV. No modelo de programação mestre/escravo, esta função é usada no programa mestre para lançar processos escravos para 

as máquinas constituintes da MV.

   * pvm_kill() – Tem por objetivo forçar o término da execução de algum processo PVM rodando 

na MV. Pode ser usada por um programa mestre para encerrar a execução de escravos trabalhando

em soluções numéricas que não estão convergindo.
   * pvm_addhosts()/pvm_delhosts() – Estas funções acrescentam e removem máquinas físicas da MV do PVM.

Funções de Informação

O gerenciamento de tarefas concorrentes em uma aplicação muitas vezes necessita da aquisição de informações adicionais sobre o estado da MV incluindo identificadores de outros processos, nome da máquina no qual uma tarefa está executando e outras informações. Algumas rotinas de obtenção destas informações no PVM seguem:

   * pvm_parent() – Função útil em processos escravos. Esta função retorna o identificador 

do processo que iniciou o processo atual. Este identificador será necessário se o escravo desejar trocar mensagens com o programa mestre.

   * pvm_perror() – Esta função imprime para a saída padrão uma mensagem indicando o tipo 

de erro retornado por uma função PVM. Valores de retorno menores que 0 indicam um erro na função.

   * pvm_config() – As informações retornadas por esta função são úteis para detectar 

falhas em máquinas e tarefas da MV. Por exemplo, para saber se alguma máquina da MV foi desligada ou desconectada da rede.

Funções de Gerenciamento de Buffers

Os chamados buffers são regiões de memória destinados a armazenar mensagens que serão enviados para outras tarefas ou recebidas delas. Toda comunicação entre tarefas envolve o uso de buffers. A memória ocupada por um buffer de envio ou recebimento deve ser inicializada antes de ser usada e as funções abaixo tem este propósito.

   * pvm_initsend() – Deve ser invocada ao menos uma vez no programa, define a codificação
a ser usada na transmissão de dados. Uma discussão sobre codificação de dados se encontra 

na seção Funções de Envio de Dados a seguir, mas as opções são: codificação XDR e sem codificação.

   * pvm_mkbuf() – Cria um novo buffer de dados.
   * pvm_freebuf() – Libera a memória alocada para o buffer.

Funções de Envio de Dados

A funcionalidade do PVM é construída sobre um conjunto de diretivas de troca de mensagens. As aplicações PVM funcionam trocando informações que são empacotadas em mensagens. Cada mensagem possui um identificador de tipo, uma codificação e os dados propriamente ditos.

Os identificadores de tipo de mensagem podem ser usados para implementar prioridades de recebimento das mensagens. Mensagens com dados marcados "urgentes" podem ser processados antes que outras mensagens com outros tipos.

A codificação é importante em ambientes heterogêneos, onde cada processador pode ter convenções próprias para a representação interna dos dados. Um exemplo clássico das diferenças que podem surgir é a representação interna de um número inteiro nas plataformas Intel x86 e Sun SPARC. A Intel costuma armazenar seus números inteiros da direita para a esquerda seguindo a convenção "little endian" enquanto a Sun armazena números inteiros da esquerda para a direita, convenção conhecida como "big endian".

Quando se quer que dois ou mais computadores de arquiteturas distintas (como Intel e Sun SPARC) se comuniquem, é necessário converter os dados para um formato intermediário que todas as plataformas conheçam, assim, só é necessário que cada computador saiba converter os dados de e para este formato intermediário e sua própria representação interna. O PVM adota a codificação XDR (External Data Representation), um padrão criado pela Sun, para implementar a transparência de arquitetura em suas mensagens. Quando a MV contém apenas máquinas de uma mesma arquitetura, é possível não codificar os dados o que implica em alguma economia de tempo na transmissão das mensagens uma vez que a codificação XDR sacrifica um pouco de espaço de armazenamento em favor da portabilidade.

As principais funções de envio de dados são:

   * pvm_send() – Envia os dados armazenados em um buffer de envio para uma dada tarefa.
   * pvm_mcast() – Envia os dados armazenados em um buffer de envio para um conjunto de 

tarefas (multicast).

   * pvm_pk??() – Este na verdade é um conjunto de funções de empacotamento 

(codificação + armazenamento) de dados em um buffer de envio. A função para empacotar um inteiro para transmissão se chama pvm_pkint() e assim por diante. Consulte a man page pvm_pk para saber todas as opções.

Funções de Recepção de Dados

Estas funções tem funcionamento inverso às funções de envio de dados. São elas:

   * pvm_recv() – Recebe uma mensagem enviada por outro processo e a coloca no buffer de
recebimento. Caso não existam mensagens a ser recebidas, o processo fica bloqueado 

até que uma mensagem se faça disponível para recepção.

   * pvm_nrecv() – Análoga à função anterior com a diferença que a função retorna um 

erro ao invés de bloquear o processo se não existirem mensagens para serem recebidas.

   * pvm_upk??() – Estas funções são análogas às funções pvm_pk??(). Servem para desempacotar
(decodificar + retirar do buffer) os dados armazenados no buffer de recebimento. 

Para desempacotar um inteiro use a função pvm_upkint() e assim por diante. Uma descrição de todas as opções de desempacotamento está na man page pvm_upk.

Algumas Dicas de Compilação de Programas PVM

Todo programa escrito na linguagem C do PVM deve incluir a linha #include "pvm3.h" no início do programa. Equivalentemente, programas PVM escritos em FORTRAN devem incluir a linha #include "fpvm3.h" em seu início. Esses arquivos contém as definições das diversas funções do PVM e informam ao compilador como fazer a verificação de tipos e sintaxe das chamadas PVM. Se o arquivo pvm3.h (ou fpvm3.h) não estiver no diretório onde seu programa fonte se localiza, é preciso substituir o nome do arquivo pelo seu caminho completo ou informar ao compilador onde localizá-lo. Uma dica interessante é criar um link simbólico no diretório corrente para o arquivo de cabeçalho. Por exemplo, supondo que o arquivo de cabeçalho pvm3.h se localize em /usr/local/pvm3/include/pvm3.h, o comando para criar o link simbólico seria: ln –s /usr/local/pvm3/include/pvm3.h ./pvm3.h


Ao compilar programas PVM, não esqueça de incluir na linha de comando do compilador a biblioteca do PVM para que o código referente às funções PVM utilizadas no seu programa sejam incluídos no seu executável. Um exemplo de compilação de um programa PVM poderia ser: gcc –o hello_master hello_master.c –lpvm3


Dependendo de como está sua instalação do PVM, pode ser necessário informar ao compilador onde procurar as bibliotecas do PVM. Compiladores C/C++ costumam usar a opção –L para especificar este diretório. Outra possibilidade é acrescentar o diretório apropriado na variável de ambiente LD_LIBRARY_PATH. Verifique o manual do seu compilador para estudar a melhor maneira de informar seu compildor da localização tanto do arquivo de cabeçalho quanto das bibliotecas do PVM.

Balanceamento de Carga

Uma importante questão na programação de uma aplicação PVM é a melhor maneira de distribuir os processos entre as máquinas que compõem a MV do PVM. Esta distribuição de carga depende de diversos fatores como a homogeneidade dos grãos de paralelização obtidos na fase de decomposição do problema, a velocidade e performance das máquinas presentes na MV e o perfil de carga de cada máquina no decorrer do tempo dado que outros usuários podem usá-las.

Uma abordagem simples para o problema é a alocação estática de recursos. Nesta abordagem, o usuário elabora alguma heurística de alocação de tarefas que busca balancear a carga entre as máquinas presentes levando em conta os fatores acima. A grande vantagem deste método é sua facilidade de projeto/implementação. Pode ser a solução adotada para problemas cuja solução não seja crítica ao funcionamento de um sistema e tudo que se quer é obter um speedup utilizando capacidade ociosa da rede atual. Este método é pouco adaptável a mudanças de configuração da rede ou do seu perfil de uso e apresenta melhores resultados em redes de comportamento bastante previsível.

O outro extremo do balanceamento de carga é monitorar a carga em todas as máquinas da rede determinando qual máquina é mais indicada para o lançamento de novos processos. Uma monitoração eficiente deve levar em conta um histórico recente de utilização da máquina (1, 2, 5, a 10 minutos no passado) juntamente com dados estatísticos de utilização em períodos maiores (perfis de uso semanal e mensal). Este método é difícil de implementar pois não existe uma forma portável de se monitorar o desempenho instantâneo (ou quase instantâneo) das máquinas de modo que qualquer solução pode precisar de adaptações ao ser transferido para outras redes. Além disso, existe uma complexidade de gerar modelos ótimos de balanceamento de carga e o tráfego das informações de monitoramento podem impor uma carga adicional nos nós e nos meios de transmissão da rede.

Soluções eficientes e de implementação mais fácil são obtidos fazendo um compromisso entre a eficiência e a adaptabilidade. Estas soluções híbridas misturam lados positivos de ambos os métodos buscando uma melhor adaptação para o problema sendo resolvido.

Conclusão

O PVM é uma importante ferramenta de paralelização para problemas que exijam um grande volume de processamento. Sua habilidade de trabalhar em redes heterogêneas permitem obter o máximo dos recursos computacionais existentes sem exigir novos investimentos em hardware. A interface de programação é simples e suporta duas linguagens de programação amplamente usados na indústria e no meio acadêmico: C e FORTRAN.

A simplicidade do modelo de programação permite que mesmo programadores inexperiente com aplicações paralelas consiga desenvolver programas que apresentem um apreciável speedup em relação ao código serial correspondente.

O PVM é gratuito e está disponível online, possui uma grande base instalada de usuários e está muito bem documentado inclusive com referências online. Se tem acesso a uma rede local de computadores e continua desenvolvendo programas que rodam serialmente em uma única máquina, está na hora de prestar atenção nos desenvolvimentos do PVM e aumentar sua produtividade.

Referências

[1] Geist, Al; Beguelin, Adam; Dongarra, Jack; Jiang, Weicheng ; Manchek, Robert; Sunderam, Vaidy. URL: http://www.netlib.org/pvm3/book/pvm-book.html – Versão online do livro "PVM: Parallel Virtual Machine - A Users' Guide and Tutorial for Networked Parallel Computing". MIT Press, 1994.

[2] URL: http://www.epm.ornl.gov/pvm/pvm_home.html – Home Page do projeto PVM.

[3] Colouris, George; Dollimore, Jean; Kindberg, Tim. "Distributed Sytems – Concepts and Design". Second Edition, Addison-Wesley, 1996.

[4] Tanembaum, Andrew S. "Modern Operating Systems". Prentice-Hall, 1992.