<< Chapter < Page | Chapter >> Page > |
En esta sección tenemos dos programas de ejemplo: uno es una operación maestro-esclavo, y la otra es una solución del tipo descomposición de datos, ambos para el problema del flujo de calor.
En este ejemplo, un proceso (
mast
) crea cuatro procesos esclavos (
slav
) y reparte 20 unidades de trabajo (sumar uno a un número). Conforme responde un proceso esclavo, se le da un nuevo trabajo o se le dice que se han agotado todas las unidades de trabajo:
% cat mast.c
#include<stdio.h>#include "pvm3.h"#define MAXPROC 5
#define JOBS 20main(){
int mytid,info;int tids[MAXPROC];int tid,input,output,answers,work;mytid = pvm_mytid();
info=pvm_spawn("slav", (char**)0, 0, "", MAXPROC, tids);/* Envía el primer trabajo */for(work=0;work<MAXPROC;work++) {
pvm_initsend(PvmDataDefault);pvm_pkint(&work, 1, 1 ) ;
pvm_send(tids[work],1) ;/* 1 = msgtype */
}/* Envía el resto de las solicitudes de trabajo */work = MAXPROC;
for(answers=0; answers<JOBS ; answers++) {
pvm_recv( -1, 2 ); /* -1 = any task 2 = msgtype */pvm_upkint(&tid, 1, 1 );
pvm_upkint(&input, 1, 1 );
pvm_upkint(&output, 1, 1 );
printf("Gracias a %d 2*%d=%d\n",tid,input,output);pvm_initsend(PvmDataDefault);
if ( work<JOBS ) {
pvm_pkint(&work, 1, 1 ) ;
work++;} else {
input = -1;pvm_pkint(&input, 1, 1 ) ; /* Les indica que se detengan */
}pvm_send(tid,1) ;
}pvm_exit();}
%
Uno de los aspectos interesantes de la interfaz PVM es la separación de llamadas para preparar un nuevo mensaje, empaquetar datos en él y enviarlo. Ello es así por varias razones. PVM tiene la capacidad de convertir entre distintos formatos de punto flotante, cambiar el orden de los bytes y traducir formatos de caracteres. Esto también permite que un único mensaje tenga múltiples elementos de datos con diferentes tipos.
El propósito del tipo de mensaje en cada envío o recepción PVM es permitir a quien envía esperar por un tipo particular de mensaje. En este ejemplo, usamos dos tipos de mensajes: el primero es un mensaje del maestro al esclavo, y el segundo es la respuesta.
Al realizar una recepción, un proceso puede o bien esperar un mensaje proveniente de un proceso específico, o un mensaje de cualquier proceso.
En la segunda fase del cómputo, el maestro espera la respuesta de cualquier esclavo, la imprime y luego reparte otra unidad de trabajo al esclavo, o le indica que termine, enviándole un mensaje con el valor -1.
El código del esclavo es muy simple: espera un mensaje, lo desempaqueta, comprueba si se trata de un mensaje de terminación, regresa una respuesta, y repite:
% cat slav.c
#include<stdio.h>#include "pvm3.h"/* Un programa sencillo para duplicar enteros */
main(){
int mytid;int input,output;
mytid = pvm_mytid();while(1) {pvm_recv( -1, 1 ); /* -1 = cualquier tarea 1= tipo de mensaje */
pvm_upkint(&input, 1, 1);
if ( input == -1 ) break; /* Todo realizado */output = input * 2;pvm_initsend( PvmDataDefault );
pvm_pkint(&mytid, 1, 1 );
pvm_pkint(&input, 1, 1 );
pvm_pkint(&output, 1, 1 );
pvm_send( pvm_parent(), 2 );}
pvm_exit();}
%
Notification Switch
Would you like to follow the 'Cómputo de alto rendimiento' conversation and receive update notifications?