320 likes | 428 Views
Parallel Virtual Machine (PVM). O que é PVM?. Máquina virtual dinamicamente configurável Protocolo de transmissão de mensagens de alta-performance Interface extremamente simples Contém primitivas de alto-nível como broadcast e sincronização com barreiras. Características.
E N D
O que é PVM? • Máquina virtual dinamicamente configurável • Protocolo de transmissão de mensagens de alta-performance • Interface extremamente simples • Contém primitivas de alto-nível como broadcast e sincronização com barreiras
Características • Tolerância a falhas • Escalabilidade • Heterogeneidade • Portabilidade
Modelo de mensagens • O remetente não espera confirmação do destinatário. (Sua execução continua assim que a mensagem chega na camada de rede) • O destinatário pode usar o método bloqueante e não-bloqueante (com e sem time-out) para receber mensagens
Notificações • Tarefa termina ou trava • Host é removido ou trava • Host é adicionado
O daemon PVM (pvmd) • Cada host da máquina virtual executa uma instância do pvmd • Não é permitido que deamons rodando como usuários diferentes se comuniquem
A biblioteca PVM (libpvm) • É tão simples quanto possível, aumentando a eficiência • A segurança oferecida (como teste de parâmetros) é mínima • Apenas a interface é comum às diferentes arquiteturas de máquina. O núcleo é otimizado especificamente para cada uma
Libpvm: Buffers de dados • A passagem de mensagens é feita por meio de ponteiros, para agilizar sua transmissão • O gerenciamento de memória é feito por uma espécie de coletor de lixo
Libpvm: Mensagens • O remetente cria buffers de dados com primitivas específicas que anexam o tipo ao cabeçalho • O destinatário recebe a mensagem com tipo determinado
Libpvm: Linguagens Disponíveis • A biblioteca é diretamente escrita em C e C++ • Existe uma biblioteca em Fortran que, na verdade, é um wrapper para a biblioteca em C
Comunicação pvmd-pvmd • Protocolo UDP • Vantagens sobre o TCP: Escalabilidade Baixo overhead de inicialização Flexibilidade para implementação de métodos de tolerância a falhas
Comunicação pvmd-tarefa e tarefa-tarefa • Protocolo TCP • Porquê do protocolo TCP Inexistência de confiabilidade do UDP requer que os clientes interrompam suas tarefas para gerenciar problemas com pacotes
Roteamento de mensagens • As mensagens são fragmentadas de modo que o tamanho dos pacotes seja igual ao MTU da rede • Eventualmente uma comunicação pvmd-pvmd requer que os pacotes sejam refragmentados • O pvmd nunca se comunica com tarefas de outros hosts • É possível estabeler uma comunicação direta entre duas tarefas do mesmo host
Ambiente das tarefas • Variáveis de ambiente são suportadas pelo PVM, para exportar uma variável: PVM_EXPORT=nomes • Cada tarefa tem /dev/null aberto como stdin • Stdout do parent
Ambiente das tarefas: Tracing e Debugging • PVM pode armazenar todas as chamadas com parâmetros e resultados, mandando para o stdout, se o TID for 0 trace desligado • spawn com flag de depuração ligado faz com que as tarefas sejam inicializadas com o script de debug
Console PVM • programado em PVM • Configuração da virtual machine, • Inicialização de processos • coleta saída e maneja traces • maneja mensagens de notificação
Limitação de recursos • Inerente ao Sistema Operacional • PVM não impõe limitações. Quando alguma limitação é imposta pelo S.O. o daemon lança uma mensagem de erro
Limitação de Recursos: daemon • quantos processos o usuário pode rodar? • quantos file-descriptors o pvmd pode ter? TCP streams para comunicação com tarefas • mensagens são armazenadas em memória, sem controle por parte do daemon.
Limitação de recursos: Tarefas • Com quantas outras tarefas pode se conectar, TCP, conexão tarefa-tarefa • maior mensagem que uma tarefa pode enviar está limitada ao espaço de endereçamento da tarefa • overhead em um receptor único
Sistemas multiprocessados • PVM possui suporte a sistemas multiprocessados. Message Passing & Shared Memory. • Transparência para o usuário • Tarefa pode ser destinada a algum computador específico. • Ganho de eficiência. • Perda de portabilidade.
Ambiente De Programação • Consiste de um pool de hosts, configurado pelo programador, onde máquinas podem ser adicionadas ou excluídas deste pool. • Pode ser uma máquina, mono ou multi-processada, várias máquinas em cluster ou distribuídas por uma rede, podem inclusive estar geograficamente distantes (i.e. Internet)
Níveis de programação • Transparent mode: a tarefa é executada automaticamente no computador mais apropriado • Architecture-dependent: o programador especifica o tipo de computador em que a tarefa deverá rodar • Low-level: o programador especifica uma máquina específica em que determinada tarefa deverá ser executada
Esquema de programação • Para cada tarefa a ser executada, o programador gera um novo programa. • Este programa será compilado para a arquitetura do host pool. • O usuário inicia o processo mestre de uma tarefa. Este, por sua vez, inicializa os processos escravos (como será visto no Hello World remoto mais adiante).
Programando com PVM • Incluir o header pvm3.h • Inicialização do programa: info=pvm_mytid() • Finalização do programa: pvm_exit() • Para lançar uma tarefa a vários processadores, deve-se usar a função pvm_spawn: numt=pvm_spawn("my_task", argv, mode, where, n_task, tids)
Comunicação entre tarefas • Inicialização de transmissão: buf_id=pvm_initsend(mEmpacotamento). • Empacotamento dos dados: pvm_packM(), onde M é o modo de empacotamento • Enviar os dados: info=pvm_send(tid, msgtag), onde o tag indica como os dados foram empacotados. pvm_mcast é parecido com o pvm_send, mas recebe um array de tids.
Recebendo Mensagens • bufid=pvm_recv(tid, msgtag) • Tid ou msgtag = -1 aceita qualquer valor • Pvm_trecv: igual ao recv, porém, com timeout • Pvm_nrecv: igual ao recv, porém, não bloqueante • Pvm_probe: simplesmente avisa se uma mensagem chegou ou não • pvm_unpack()
Grupos Dinâmicos De Processos • Quando um conjunto de tarefas executam operações parecidas, pode-se criar um grupo de processos • Para entrar em um grupo, uma tarefa deve chamar: inum=pvm_joingroup("group_name"), caso o grupo não exista, ele é criado. Inum será a ordem da tarefa no grupo • Para sair de um grupo: pvm_lvgroup(). • Pvm_bcast: envia a todas as tarefas do grupo
Pvm_barrier() • Pvm_gather() • Pvm_scatter() • Pvm_reduce()
Exemplos de programas //hello.c main() { 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(); }
//Hello_other.c #include "pvm3.h“ main() { int ptid, msgtag; char buf[100]; ptid = pvm_parent(); strcpy(buf, "hello, world from "); msgtag = 1; pvm_initsend(PvmDataDefault); pvm_pkstr(buf); pvm_send(ptid, msgtag); pvm_exit(); }
Links • http://www.epm.ornl.gov/pvm/ • http://www.netlib.org/pvm3/ • http://www.math.cmu.edu/Parallel_Cluster/pvm.html