Buscar

Algoritmo CGM com Comunicação Coletiva

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

//Algoritmo CGM utilizando comunicacao coletiva para efetuar a soma de um conjunto de valores
//Bibliotecas Utilizadas
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
	long n; //Tamanho da entrada
	int size; //Quantidade de processadores
	int rank; //Rank do processador
	int soma = 0; //Variavel p/ a soma de valores locais
	int *B; //Buffer p/ entrada local de valores
	int *P; //Buffer p/ a soma local de prefixos
	MPI_Status status;
	MPI_Init( &argc, &argv ); //Iniciando o mpi
	MPI_Comm_size( MPI_COMM_WORLD, &size ); //Retornando a quantidade de processadores em operacao
	MPI_Comm_rank( MPI_COMM_WORLD, &rank ); //Retornando o rank do processador
	if( rank == 0 )
	{
		FILE *arquivo; //Ponteiro p/ o arquivo de entrada
		char entrada[30];
		
		printf("\nInforme o arquivo de entrada: ");
		scanf("%s", entrada);
		if(!(arquivo = fopen( entrada, "r" ))) //Abrindo o arquivo de entrada
		{
			printf("\n ERRO NA ABERTURA DO ARQUIVO!!! ");
			MPI_Finalize();
			return 0;
		}
		fscanf(arquivo,"%ld",&n); //Lendo o tamanho da entrada
		MPI_Bcast( &n, 1, MPI_LONG, 0, MPI_COMM_WORLD ); //Enviando o tamanho da entrada p/ os outros processadores
		B = new int[n/size]; //Alocando o buffer p/ a entrada local de valores
		int *A = new int[n]; //Alocando um buffer temporario p/ enviar as entradas dos outros processadores
		for( long i = 0; i <= n; i++ ) //Lendo a entrada de valores do arquivo
			fscanf( arquivo,"%d", &A[i] );
		MPI_Scatter( A, n/size, MPI_INT, B, n/size, MPI_INT, 0, MPI_COMM_WORLD ); //Realizando a distribuicao das entradas p/ os processadores
		fclose(arquivo);//Fechando o arquivo de entrada
		delete( A ); //Desalocando buffer temporario
	}
	else
	{
		MPI_Bcast( &n, 1, MPI_LONG, 0, MPI_COMM_WORLD ); //Recebendo o tamanho da entrada
		B = new int[n/size]; //Alocando o buffer p/ entrada local de valores
		MPI_Scatter( B, n/size, MPI_INT, B, n/size, MPI_INT, 0, MPI_COMM_WORLD ); //Recebendo a entrada local de valores
	}
	double tempo, tempo1, tempo2;
	tempo1 = MPI_Wtime(); //Coletando tempo
	for( long i = 0; i < n/size; i++ ) //Realizando a soma dos valores locais
		soma = soma + B[i];
	if( rank == 0 )
	{
		int *S = new int[size]; //Alocando um buffer temporario p/ receber a soma de todos processadores
		MPI_Gather( &soma, 1, MPI_INT, S, 1, MPI_INT, 0, MPI_COMM_WORLD ); //Recebendo a soma de valores dos processadores
		soma = 0;
		for( int i = 0; i < size; i++ ) //Calculando a soma dos dados recebidos
			soma = soma + S[i];
			
		delete( S ); //Desalocando buffer temporario
	}
	else
	{
		MPI_Gather( &soma, 1, MPI_INT, B, 1, MPI_INT, 0, MPI_COMM_WORLD ); //Enviando a soma dos valores locais	
	}
	MPI_Barrier(MPI_COMM_WORLD);
	tempo2 = MPI_Wtime(); //Coletanto tempo
	tempo = tempo2 - tempo1; //Determinando o tempo gasto no processamento
	if( rank == 0 )
	{
		FILE *arqtemp; //Ponteiro p/ o arquivo dos tempos
		if(!(arqtemp = fopen( "tempo.txt", "a" ))) 
		{
			printf("\n ERRO NA ABERTURA DO ARQUIVO!!! ");
			MPI_Finalize();
			return 0;
		}
		double *V = new double[size]; //Alocando buffer temporario p/ receber os tempos dos processadores
		double maior = 0;
		double somat = 0;
		MPI_Gather( &tempo, 1, MPI_DOUBLE, V, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ); //Recebendo os tempos gastos pelos processadores
		for( int i = 0; i < size; i++ )
		{
			if( maior < V[i] )
				maior = V[i];
			somat = somat + V[i];
		}
		//Imprimindo os dados dos tempos no arquivo
		fprintf(arqtemp, "\nEntrada: %ld Proc: %d", n, size);
		fprintf(arqtemp,"\nMaior: %.4lf\nMedia: %.4lf\n", maior, somat/size);
		delete( V ); //Desalocando buffer temporario
		fclose(arqtemp); //Fechando o arquivo dos tempos
		FILE *arquivo; //Ponteiro p/ o arquivo de saida
			
		if(!(arquivo = fopen( "saida1.txt", "w" ))) //Criando o arquivo de saida
		{
			printf("\n ERRO NA ABERTURA DO ARQUIVO!!! ");
			MPI_Finalize();
			return 0;
		}
		
		fprintf(arquivo, "Resultado da Soma: %d ", soma);
		
		fclose(arquivo);//Fechando o arquivo de saida
	}
	else
	{
		MPI_Gather( &tempo, 1, MPI_DOUBLE, P, n/size, MPI_INT, 0, MPI_COMM_WORLD ); //Enviando o tempo gasto no processamento
	}
	MPI_Finalize(); //Finalizando o mpi
	delete( B ); //Desalocando o buffer de entrada local
	return 0;
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando