Baixe o app para aproveitar ainda mais
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; }
Compartilhar