Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Parallel Virtual Machine (PVM) e Message Passing Interface (MPI) A abstração não existe no MPI, pois não possui o conceito de máquina virtual paralela. Na verdade, o MPI está mais voltado para o conceito de message passing. No PVM, ao contrário, é possível considerar a coleção de máquinas como um único recurso computacional. O controle de processos é muito maior no PVM, já que se permite iniciar, interromper e controlar processos em tempo de execução, ao passo que, no MPI, o controle é bastante restrito – permite-se somente o controle de grupo de tarefas. Quanto aos recursos, o PVM torna-se bastante dinâmico pelo próprio conceito de máquina virtual paralela, permitindo uma abstração que não é suportada pelo MPI, no qual o controle de recursos é totalmente estático. Quanto à topologia, o PVM exige que o programador arranje, manualmente, tarefas em grupos, obedecendo a uma determinada organização diferente do MPI, que, embora não possua o conceito de PVM, provê um alto nível de abstração em termos de topologia. O MPI inclui conceitos como rank1, group2 e communicator3, que permitem um gerenciamento do uso de cada máquina do cluster. 1 Rank Cada processo tem uma identificação única e crescente. 2 Group Conjunto ordenado de processos. 3 Communicator 2 Veja, a seguir, um exemplo de um programa em C que cria dois grupos de processos diferentes que requerem a criação de novos comunicadores: #include "mpi.h" #include <stdio.h> #define NPROCS 8 int main(argc, argv) int argc;char *argv[]; { int rank,new_rank,sendbuf,recvbuf,numtasks,ranks1[4] = {0,1,2,3}, ranks2[4] = {4,5,6,7}; MPI_Group orig_group, new_group; MPI_Comm new_comm; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); if (numtasks != NPROCS) { printf("Deve especificar MP_PROCS= %d. Terminando.\n", NPROCS); MPI_Finalize(); exit(0); } sendbuf = rank; /* Extrai o grupo original */ MPI_Comm_group(MPI_COMM_WORLD, &orig_group); /* Divide tarefas em dois grupos distintos baseados no ''rank'' */ if (rank < NPROCS / 2) { MPI_Group_incl(orig_group, NPROCS/2, ranks1, &new_group); } else { MPI_Group_incl(orig_group, NPROCS/2, ranks2, &new_group); } /* Cria novos comunicadores e então realiza comunicação coletiva. */ MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm); MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, new_comm); MPI_Group_rank(new_group, &new_rank); Coleção de grupos. 3 printf("rank= %d newrank= %d recvbuf= %d\n", rank, new_rank, recvbuf); MPI_Finalize(); } Fonte: http://pt.wikipedia.org/wiki/Message_Passing_Interface. Pthreads – POSIX Threads Bibliotecas que implementam o padrão de POSIX threads – Portable Operating System Interface (POSIX) – são normalmente chamadas de Pthreads. O pacote de threads POSIX fornece funções para criação e exclusão dinâmicas de threads. Dessa forma, não é necessário informar, inicialmente, o número de threads até a execução da aplicação. O exemplo a seguir mostra duas threads executando ao mesmo tempo, ou seja, realizando um trabalho concorrente: include <pthread.h> #include <stdlib.h> #include <stdio.h> typedef struct { int id; } thread_arg; void *thread(void *vargp); 4 int main() { pthread_t tid[2]; thread_arg a[2]; int i = 0; int n_threads = 2; //Cria as threads for(i=0; i<n_threads; i++) { a[i].id = i; pthread_create(&(tid[i]), NULL, thread, (void *)&(a[i])); } // Espera que as threads terminem for(i=0; i<n_threads; i++) { pthread_join(tid[i], NULL); } pthread_exit((void *)NULL); } void *thread(void *vargp) 5 { int i = 0; thread_arg *a = (thread_arg *) vargp; printf("Comecou a thread %d\n", a->id); // Faz um trabalho qualquer for(i = 0; i < 1000000; i++); printf("Terminou a thread %d\n", a->id); pthread_exit((void *)NULL); } Fonte: http://pt.wikibooks.org/wiki/Programa%C3%A7%C3%A3o_Paralela_em_Arquiteturas_Multi- Core/Programa%C3%A7%C3%A3o_em_Pthreads.
Compartilhar