Ir ao conteúdo

Posts recomendados

Postado

Boa noite, 

Estou com dificuldade de realizar este exercício da linguagem C utilizando a biblioteca MPI.

Preciso criar um programa para calcular a tangente do ângulo passado como parâmetro na execução do programa e testar com 4 e 8 processadores. O objetivo desta aplicação é utilizar as séries de Taylor para o cálculo do seno e do cosseno de um determinado ângulo, com o intuito de calcular a tangente deste ângulo. 

Esse é o formulário:

 

Fórmula para o cálculo do seno é usada a fórmula infinita:

            Sen x    =         x1 – x3 + x5 – x7  + x9 – x11 + …

                                    1!    3!    5!     7!      9!    11!             (! = fatorial)

Fórmula para o cálculo do cosseno é usada a fórmula infinita:

            Cos x    =        x0 – x2 + x4 – x6  + x8 – x10 + …

                                    0!    2!    4!     6!     8!   10!

Fórmula para o cálculo da tangente é usada a fórmula:

Tan x    =          sen x

                        cos x

 

Desenvolvi este código para a solução do problema:

 

#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

long fat(int num){
  if(num == 0 || num ==1)
    return 1;
  else
    return num * fat(num-1);     
}

int main( int argc, char *argv[]){	

  double ang_aux, graus, min, seg, ang, sen, cos,
  tg, tempoInicial, tempoFinal, soma_sen, 
  soma_cos, PI=3.14;
 
  int n, myid, numprocesso, i;
        
  MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numprocesso);
  MPI_Comm_rank(MPI_COMM_WORLD,&myid);    
   		   
  if(myid==0){
    printf("Cálculo das funções trigonométricas através do polinômio de Taylor de forma paralela \n");
    graus = atoi(argv[1]);
    min = atoi(argv[2]);
    seg = atoi(argv[3]);
    n = atoi(argv[4]);
    ang_aux = (double) (graus + (min / 60.0) + (seg / 3600.0));
    ang = (ang_aux * PI) / (180.0);
    printf("\nN=%d",n);
    printf("\nGraus: %.0lf Minutos: %.0lf Segundos: %.0lf", graus, min, seg);          
    tempoInicial = MPI_Wtime();
    }
    
    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(&ang, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    
    for (i = myid; i < n; i += numprocesso){
      cos += (double) (pow(-1, i) * pow(ang, 2 * i)) / fat(2 * i) ; 
      sen += (double) (pow(-1, i) * pow(ang, 2 * i + 1)) / fat(2 * i + 1);
    }
    
    MPI_Reduce(&sen, &soma_sen, 1, MPI_DOUBLE, MPI_SUM, 0,MPI_COMM_WORLD);
    MPI_Reduce(&cos, &soma_cos, 1, MPI_DOUBLE, MPI_SUM, 0,MPI_COMM_WORLD);
    
    tg = (soma_sen / soma_cos);
    
    if (myid == 0) {
      printf("\nSeno de %.1lf %.1lf %.1lf em %d iteracoes = %1.15lf\n\n", graus, min, seg, n, soma_sen);
	    printf("Cosseno de %.1lf %.1lf %.1lf em %d iteracoes = %1.15lf\n\n", graus, min, seg, n, soma_cos);
	    printf("Tangente de %.1lf %.1lf %.1lf em %d iteracoes = %1.15lf\n\n", graus, min, seg, n, tg);
	   
      tempoFinal = MPI_Wtime();
      
      printf("\nTempo inicial: %.5lf\n", fabs(tempoInicial));
      printf("\nTempo final: %.5lf\n", fabs(tempoFinal));
      printf("\nTempo decorrido: %.5lf\n", fabs(tempoFinal - tempoInicial)); 
 }        
	
  MPI_Finalize();
  return 0;
}

 

O problema é que na hora da execução do programa no simulador na máquina virtual, eu recebo um erro, e não consigo executar o processo. Já tentei mudar várias coisas no código, mas este erro sempre persiste. 

 

2022-04-14.png

Postado

Segmentation fault (erro de segmentação),

 

Pode ser causado por esse trecho

 graus = atoi(argv[1]);
    min = atoi(argv[2]);
    seg = atoi(argv[3]);
    n = atoi(argv[4]);

 

Lembrando que arrays em c começam com índice 0 (argv[0], argv[1], argv[2], argv[3])

você tem que checar a variável argc e verificar se realmente foram passados 04 argumentos na chamada do executável.

Outra coisa é que min, seg e graus são do tipo ponto flutuante, e não inteiros (deve usar atof).

Então o correto seria:

if (argc < 4)
             {
             printf ("Comando inválido\n");
             return -1;
             }
             
if(myid==0){
    printf("Cálculo das funções trigonométricas através do polinômio de Taylor de forma paralela \n");
    graus = atof(argv[0]);
    min = atof(argv[1]);
    seg = atof(argv[2]);
    n = atoi(argv[3]);
    ang_aux = (double) (graus + (min / 60.0) + (seg / 3600.0));
    ang = (ang_aux * PI) / (180.0);
    printf("\nN=%d",n);
    printf("\nGraus: %.0lf Minutos: %.0lf Segundos: %.0lf", graus, min, seg);          
    tempoInicial = MPI_Wtime();
    }

 

Acho que é isso.

 

Postado

Olá Flávio, obrigado pela ajuda!

 

Fiz as alterações que você comentou e realmente o erro não aparece mais. Só que agora estou com outro erro aparecendo no meu servidor, você sabe me dizer o que pode ser?

2022-04-15 (2).png

Postado

Então, você não está passando os argumentos ao chama o executável. você tem que passar 4 argumentos (perceba que o programa imprime "Comando inválido").

Seria algo assim:

paralelot2t.exe 90 6 1 10

Além disso, a checagem da variável argc  deve ser colocado logo no começo, antes de fazer qq coisa:

 

int main( int argc, char *argv[]){	

  double ang_aux, graus, min, seg, ang, sen, cos,
  tg, tempoInicial, tempoFinal, soma_sen, 
  soma_cos, PI=3.14;
 
  int n, myid, numprocesso, i;

if (argc < 4)
             {
             printf ("Comando inválido\n");
             return -1;
             }
             ....

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!