PVM Thiago Villela. PVM - Parallel Virtual Machine Pacote (software) de paralelização que permite...

Post on 17-Apr-2015

105 views 0 download

Transcript of PVM Thiago Villela. PVM - Parallel Virtual Machine Pacote (software) de paralelização que permite...

PVM

Thiago Villela

PVM - Parallel Virtual Machine

• Pacote (software) de paralelização que permite a uma coleção heterogênea de computadores interligados em rede possa ser vista como uma máquina virtual paralela com memória distribuída, ou seja, como um único recurso computacional.

Histórico

Surgiu em 1989 nos laboratórios da Emory University e Oak Ridge National Laboratory, com o objetivo de criar e executar aplicações paralelas em um hardware já existente.

Principais Características

• Pode ser instalado por qualquer usuário• Pode ser partilhado entre usuários • Fácil de configurar através dos seu próprio

arquivo host• Configurações de usuários podem se sobrepor

sem conflitos • Fácil de escrever programas através de uma

interface de troca de mensagens padrão • Suporta C , FORTRAN e Java • Múltiplas aplicações podem rodar em um único

PVM • Pacote pequeno, requer apenas alguns Mbytes.

Heterogeneidade

• Aplicação: Subtarefas podem explorar a arquiterura que melhor se adapte ao seu problema

• Máquina: Computadores com diferentes formatos de dados, arquiteturas e sistemas operacionais

• Redes: Diferentes tipos de redes (Ethernet, Token Ring)

O Sistema PVM

• pvmd - um daemon

• console - interface entre o usuário e o sistema

• libpvm - a biblioteca de funções do pvm

• aplicação - programa do usuário

Conceitos• Hospedeiro:

– O Computador, também chamado nó • Máquina Virtual:

– Uma meta máquina composta de um ou mais hosts • Processo:

– Um programa: dados, pilha, etc • Tarefa:

– Um processo pvm • pvmd:

– O daemon do pvm • Mensagem:

– Uma lista ordenada de dados enviada de uma tarefa para outra • Grupo:

– Uma lista ordenada de tarefas que recebem um nome simbólico

PVMD

PVMD (2)

• Roda em cada hospedeiro da máquina virtual

• Autentica tarefas • Executa processos no hospedeiro • Provê detecção de falhas • Roteia mensagens • Mais robusto que as aplicações • Contato com os hospedeiros

Console

• 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.

Console(2)

• Para iniciar a execução do console do PVM, basta digitar pvm na linha de comando do seu shell:

[user@quark user]$ pvm pvm>

Console(3)

• 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>

Console(4)

• 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>

Console(5)

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

pvm> quit

Console: exit handler called

pvmd still running.

Console(6)• 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]$

Console(7)• add

– followed by one or more host names, adds these hosts to the virtual machine.

• alias – defines or lists command aliases.

• conf – lists the configuration of the virtual machine including hostname, pvmd

task ID, architecture type, and a relative speed rating. • delete

– followed by one or more host names, deletes these hosts from the virtual machine. PVM processes still running on these hosts are lost.

• echo – echo arguments.

• halt – kills all PVM processes including console, and then shuts down PVM.

All daemons exit.

Console(8)• help

– can be used to get information about any of the interactive commands. Help may be followed by a command name that lists options and flags available for this command.

• id – prints the console task id.

• jobs – lists running jobs.

• kill – can be used to terminate any PVM process.

• mstat – shows the status of specified hosts.

• ps -a – lists all processes currently on the virtual machine, their locations, their

task id's, and their parents' task id's.

Biblioteca – 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.

Controle de Processos• 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.

Biblioteca – Gerenciamento de Tarefas

• 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.

Gerenciamento de Tarefas

• 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.

Biblioteca – 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.

Gerenciamento de Buffers

• 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.

Biblioteca – 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.

Funções de Envio de Dados

• 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.

Funções de Recepção de Dados

• 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.

Exemplo 1 - Mestremain() { int cc, tid, msgtag; char buf[100]; printf("i'm t%x\n", pvm_mytid()); cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid); if (cc == 1) {

msgtag = 1; pvm_recv(tid, msgtag); pvm_upkstr(buf); printf("from t%x: %s\n", tid, buf);

} else

printf("can't start hello_other\n"); pvm_exit(); }

Exemplo 1 - Escravo

main(){ int ptid, msgtag; char buf[100]; ptid = pvm_parent(); strcpy(buf, "hello, world from ");gethostname(buf + strlen(buf), 64); msgtag = 1; pvm_initsend(PvmDataDefault);pvm_pkstr(buf); pvm_send(ptid, msgtag);pvm_exit(); }

Exemplo 2• #include <stdlib.h>

#include <stdio.h>#include <pvm3.h>

void main() { int mytid, parent; mytid = pvm_mytid(); parent = pvm_parent();; if (parent == PvmNoParent)

master(); else

slave();}

void master(){ int tids[3], numt; pvm_catchout(stdout); numt = pvm_spawn("bobao", NULL, PvmTaskDefault,"", 3, tids); printf("Abriu %d processos\n", numt); if (numt < 0)

printf("Nao abriu os processos\n"); else

printf("Eu sou o mestre.\n"); pvm_exit();}void slave(){ int mytid; mytid = pvm_mytid(); printf("Eu sou o escravo %d\n", mytid);}

Conclusão

• O PVM é uma importante ferramenta de paralelização para problemas que exijam um grande volume de processamento.

• A simplicidade do modelo de programação permite que mesmo programadores inexperiente com aplicações paralelas consigam desenvolver programas.

• 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.

Bibliografia• http://equipe.nce.ufrj.br/adriano/tep/bibliogr/pvm/pvm.html• http://www.linhadecodigo.com.br/artigos.asp?id_ac=1166• http://equipe.nce.ufrj.br/gabriel/progpar/PVM.pdf• http://tcsc.ic.uff.br/node/98• http://www.dct.ufms.br/~edson/jai2001/livro.ps.gz• http://www.cos.ufrj.br/index

.php?option=com_publicacao&task=visualizar&id=693• http://www.inf.puc-rio.br/~noemi/victal/pvm.html• http://www.cisc.usp.br/documentacao/tutoriais/sp/pvm.html• http://www.inf.ufrgs.br/procpar/disc/cmp134/trabs/T2/981/mpi.html• http://black.rc.unesp.br/gpacp/descricao.htm• http://www.inf.puc-rio.br/~noemi/pd-96/aula4.html• http://pop.unicruz.edu.br/ppd/CDJoaoJunior/Projeto%20paralelismo/pvm/

Uma%20Introdu%E7%E3o%20ao%20PVM.htm• http://www.impa.br/~rbs/pdf/pvm.pdf• http://www.unimar.br/ciencias/volume8-3/resumo8-3/resumo8.htm