Ir ao conteúdo

C C e programação paralela


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

Posts recomendados

Postado

 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
  • Membro VIP
Postado

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
Postado

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);

}

Postado

@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);

}

Postado

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
  • Solução
Postado

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

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!