Ir ao conteúdo
  • Cadastre-se

C C e programação paralela


lucaocarv
Ir à solução Resolvido por V!OLADOR,

Posts recomendados

 Construir um programa em C que atribua valores a um vetor de 10 posições de números inteiros de maneira sequencial. A seguir, que crie uma thread que faça a soma dos elementos do vetor. Crie uma nova thread que encontre o maior valor e por fim, uma nova thread para encontrar o menor valor, sendo que as threads devem realizar o processamento em paralelo.

 

Quem puder ajudar, pois estou perdido

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Moderador

Caro usuário,

 

Seja bem-vindo ao Clube do Hardware.

 

No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.

 

Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.

 

Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.

 

Esperamos que compreenda.

 

Atenciosamente,

Equipe Clube do Hardware

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

tenho isso pronto, mas nao consigo linkar os 10 numeros lidos a parte da contagem

 

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main() {
    int tid, nthreads, i, tam, mult, soma;
    int *V;
    
    tam  = 11;
    mult = 1;
    
    //Aloca as posições no vetor V
    V = malloc(tam*sizeof(int *));
    
    //Inicia a região paralela - popular o vetor
    #pragma omp parallel shared(V, tam, i, mult)
    {
        #pragma omp for
        for(i = 0; i < tam; i++) {
            V[i] = i * mult;
        }
    } //Fim da região paralela
    
    soma = 0;
    #pragma omp parallel shared(V, tam, i)
    {
        #pragma omp for reduction(+:soma)
        for(i = 0; i < tam; i++) {
            soma = soma + V[i];
        }
    } //Fim da segunda região paralela    
    

int a, maior=0, menor=0;
    float Notas[10];

    printf("digite 10 notas");
    printf("\n");
    for (a=0;a<10;a++){
      printf("nota %d : ", a+1);
      scanf("%f", &Notas[a]);
      if(a==0){maior=Notas[a];menor=Notas[a];}
      if(Notas[a]>maior){
        maior=Notas[a];
      }
      else{
        if(Notas[a]<menor){
            menor=Notas[a];
        }
      }
    }
    printf("\no maior valor é %d\n", maior);
    printf("\ne o menor valor é %d\n\n", menor);
    
    printf("Soma final: %d\n", soma);
    free(V); //Desaloca da memória


        
    return(0);

}

Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza

tenho isso pronto, mas nao consigo linkar os 10 numeros lidos a parte da contagem

 

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main() {
    int tid, nthreads, i, tam, mult, soma;
    int *V;
    
    tam  = 11;
    mult = 1;
    
    //Aloca as posições no vetor V
    V = malloc(tam*sizeof(int *));
    
    //Inicia a região paralela - popular o vetor
    #pragma omp parallel shared(V, tam, i, mult)
    {
        #pragma omp for
        for(i = 0; i < tam; i++) {
            V[i] = i * mult;
        }
    } //Fim da região paralela
    
    soma = 0;
    #pragma omp parallel shared(V, tam, i)
    {
        #pragma omp for reduction(+:soma)
        for(i = 0; i < tam; i++) {
            soma = soma + V[i];
        }
    } //Fim da segunda região paralela    
    

int a, maior=0, menor=0;
    float Notas[10];

    printf("digite 10 notas");
    printf("\n");
    for (a=0;a<10;a++){
      printf("nota %d : ", a+1);
      scanf("%f", &Notas[a]);
      if(a==0){maior=Notas[a];menor=Notas[a];}
      if(Notas[a]>maior){
        maior=Notas[a];
      }
      else{
        if(Notas[a]<menor){
            menor=Notas[a];
        }
      }
    }
    printf("\no maior valor é %d\n", maior);
    printf("\ne o menor valor é %d\n\n", menor);
    
    printf("Soma final: %d\n", soma);
    free(V); //Desaloca da memória


        
    return(0);

}

Link para o comentário
Compartilhar em outros sites

Veja só, pela interpretação do enunciado, você não lê do teclado, você simplesmente atribui os valores (como fez).

No caso, a soma daria 55.

você está iniciando a soma ANTES de ler os dados dos vetores. Além disso, você lê os dados em uma variável diferente "Notas", enquanto que na soma você utiliza a varável "V".

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

O enunciado diz que o vetor deve ser criado sequencialmente. Então você não precisaria usar OpenMP aqui:

 

#pragma omp parallel shared(V, tam, i, mult)
{
	#pragma omp for
	for(i = 0; i < tam; i++) {
		V[i] = i * mult;
	}
}

 

Entretanto note um detalhe: você declarou i como uma variável compartilhada. Normalmente, em laços como o for, o índice do passo, no caso i, é uma variável privada. Isso porque você não gostaria que mais de uma thread modifique i ao mesmo tempo. Cada thread deve possuir uma copia unica de i, e assim acessar diferentes elementos de V ao mesmo tempo. Então, seria mais correto o seguinte

 

#pragma omp parallel shared(V, tam, mult) private(i)
{
	#pragma omp for
	for(i = 0; i < tam; i++) {
		V[i] = i * mult;
	}
}

 

De qualquer forma, como o enunciado disse pra criar o vetor sequencialmente, você pode fazê-lo da maneira tradicional. Uma maneira de executar varias porcões do código ao mesmo tempo, como requisitado pelo problema, seria através dos construtores OpenMP sections. No seu caso o enunciado pediu pra executar três tarefas: 1) somar todos os elementos de V; 2) achar o menor elemento de V; e, 3) achar o maior elemento de V. Com OpenMP sections, a sintaxe (simplificada) seria assim:

 

#pragma omp parallel sections 
{ 
	#pragma omp section
	{
		/* soma-se todos os elmentos de V aqui */
	}
  
	#pragma omp section
	{
		/* encontra-se o menor elemento de V aqui */
	}
  
  	#pragma omp section
	{
		/* encontra-se o maior elemento de V aqui */
	}
}

 

Então, bastaria implementar cada porcão de código, especifico pra cada tarefa, no respectivo bloco { }. Quando executar, se houver até três threads disponíveis, cada uma vai executar um bloco independentemente e ao mesmo tempo. Se por acaso apenas duas threads estão disponíveis, dois blocos seriam executados ao mesmo tempo e o terceiro apenas quando uma delas terminasse suas tarefas.

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!