/* Programa Suma numeros en arreglos. */ extern "C" { #include

Anuncio
/*
Programa Suma numeros en arreglos.
*/
extern "C" {
#include <bsp.h>
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int
nm,
nb,
tag,
sztag,
total;
//
//
//
//
//
//
void bsp_main()
{
numero de mensajes que recibe cada procesador.
total de bytes en la cola de mensajes.
identificador (header) de mensajes (no lo usamos).
tamaño del indentificador.
tamaño en bytes del siguiente mensaje a ser sacado
de la cola de nuevos mensajes en el procesador.
bsp_begin( bsp_nprocs() );
int pid= bsp_pid();
int nprocs= bsp_nprocs();
tag = 0;
sztag= sizeof(int);
bsp_set_tagsize(&sztag);
int N=128;
int *arreglo=new int[N];
// inicializacion del arreglo.
srand(pid*111+111+time(NULL));
for(int i=0; i<N; i++)
arreglo[i]= rand()%1024;
// Cada procesador calcula la suma.
int suma=0;
for(int i=0; i<N; i++)
suma += arreglo[i];
// Superstep 1:
// cada procesador le envia al procesador 0
// el resultado parcial de la suma global.
bsp_send(0, &tag, &suma, sizeof(int));
//bsp_sync(); // debe ir aqui para producir el envio
// efectivo de los mensajes.
// Superstep 2:
// lee cuantos mensajes llegaron (nm)
// y cual es la cantidad total de bytes recibidos (nb).
if (pid==0)
{
bsp_qsize(&nm, &nb); // numero de mensajes recibidos.
// extrae los mensajes uno por uno desde la cola
// de mensajes.
int suma_parcial, suma_global=0;
for(int i=0; i<nm; i++)
{
// solo procesador 0 aqui.
bsp_get_tag(&total,&tag); //Obtiene el encabezado del siguiente
mje
bsp_move(&suma_parcial,total);
suma_global += suma_parcial;
}
for(int i=0; i<nprocs; i++)
bsp_send(i, &tag, &suma_global, sizeof(int));
}
bsp_sync();
// Superstep 3:
int resultado;
bsp_get_tag(&total,&tag);
bsp_move(&resultado,total);
if (pid==1)
{
printf("El resultado es = %d\n",resultado);
}
bsp_sync();
bsp_end();
}
int main (int argc, char *argv[])
{
void bsp_main();
bsp_init(bsp_main, argc, argv);
bsp_main();
return 0;
}
Descargar