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

Cola de tareas

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();} %

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Cómputo de alto rendimiento. OpenStax CNX. Sep 02, 2011 Download for free at http://cnx.org/content/col11356/1.2
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Cómputo de alto rendimiento' conversation and receive update notifications?

Ask