/*
 *         	        Exemple "Worker.c" PVM versio 3.3
 *		 Susana Maria Bajo Sanchez (ei05646@salleURL.edu)
 *		 Josep Maria Garrell i Guiu (josepmg@salleURL.edu)
 *				Software Paral.lel
 *		           Departament d'Informatica (DI)
 *	               Enginyeria i Arquitectura La Salle
 *		           Universitat Ramon Llull (URL)
 *		              	Curs 1999/2000
*/

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

#define SIZE 1000
#define NPROCS 5

void main()
{
	int mytid;
	int i, sum, *a;
	int num_data, master;

	mytid = pvm_mytid();
	printf("Worker: Soy la tarea #%x\n",mytid);

	// recibe una porción de array para sumar
	pvm_recv(-1,-1);

	pvm_upkint(&num_data,1,1);
	printf("Worker: Desempaqueto el entero %d\n",num_data);

	a=(int*)malloc(num_data*sizeof(int));
	pvm_upkint(a,num_data,1);
	
	sum=0;
	for (i=0;i<num_data;i++) sum += a[i];

	// enviar el sum calculado al 'Master'
	master = pvm_parent();
	printf("Worker: Mi padre es la tarea #%x\n",master);

	pvm_initsend(PvmDataRaw);
	printf("Worker: Inicializo el SEND\n");

	pvm_pkint(&sum,1,1);
	printf("Worker: Empaqueto el entero %d\n",sum);

	pvm_send(master,7);
	printf("Worker: Envio a la tarea %x con msgtag 7\n",master);
	
	pvm_exit();
	printf("Worker: Salgo de PVM\n");
}
