Ir ao conteúdo
  • Cadastre-se
chrislix

Multiplicação de matrizes com thread

Recommended Posts

Alguem poderia me ajudar?

estou tentando multiplicar duas matrizes, A e B

e salvar o resultado em C

o resultado nao ta certo, to usando thread

so queria uma opinião para saber se ta certo o que to fazendo, porque o que ta me intrigando é que os valores da linha da matriz C nao altera

 

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


pthread_t thread_1;
pthread_t thread_2;
pthread_t thread_3;

int a[3][2] = {{1, 4}, {2, 5}, {3, 6}};
int b[2][3] = {{7, 8, 9}, {10, 11, 12}};
int c[3][3] = {{1, 2, 3}, {0, 0, 0}, {0, 0, 0}};

void* tarefa_1(void *p)
{
      printf("\nThread1\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[1][col] += a[1][i] * b[i][col];
            }
            printf("%i\t",c[1][col]);
            printf("\n");
      }
}

void* tarefa_2(void *p)
{
      printf("\nThread2\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[2][col] += a[2][i] * b[i][col];
            }
            printf("%i\t",c[2][col]);
            printf("\n");
      }
     
}
void* tarefa_3(void *p)
{
      printf("\nThread3\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[3][col] += a[3][i] * b[i][col];
            }
            printf("%i\t",c[3][col]);
            printf("\n");
      }
     
}

int main()
{
   printf("Inicio das Threads...\n");
   
    // inicia as duas threads, passando como parametroa thread e a função que cada uma deve executar
   
    pthread_create(&thread_1, NULL, tarefa_1, NULL);
    pthread_create(&thread_2, NULL, tarefa_2, NULL);
    pthread_create(&thread_3, NULL, tarefa_3, NULL);
   
    // faz com que a thread principal espere a thread 1,2,3 acabarem;
   
    pthread_join(thread_1, NULL);
    pthread_join(thread_2, NULL);
    pthread_join(thread_3, NULL);
    printf("resultado da tabela 3\n");

    
        for(int i = 0;i<3; i++){
                for(int j= 0; j<3;j++){
              printf("%i\t  ",c[i][j]);
                }
                printf("\n");
        }

    exit(0);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema parece ser apenas que os índices usados nas matrizes estavam errados... Em C os índices começam em 0 ao invés de 1...

 

Ex: 
c[1][col] += a[1][i] * b[i][col];

deveria ser

c[0][col] += a[0][i] * b[i][col];

Então apenas fazendo esta modificação em cada função parece ter resolvido o problema:

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


pthread_t thread_1;
pthread_t thread_2;
pthread_t thread_3;

int a[3][2] = {{1, 4}, {2, 5}, {3, 6}};
int b[2][3] = {{7, 8, 9}, {10, 11, 12}};
int c[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};

void* tarefa_1(void *p)
{
      printf("\nThread1\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[0][col] += a[0][i] * b[i][col];
            }
            printf("%i\t",c[0][col]);
            printf("\n");
      }
}

void* tarefa_2(void *p)
{
      printf("\nThread2\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[1][col] += a[1][i] * b[i][col];
            }
            printf("%i\t",c[1][col]);
            printf("\n");
      }
     
}
void* tarefa_3(void *p)
{
      printf("\nThread3\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[2][col] += a[2][i] * b[i][col];
            }
            printf("%i\t",c[2][col]);
            printf("\n");
      }
     
}

int main()
{
   printf("Inicio das Threads...\n");
   
    // inicia as duas threads, passando como parametroa thread e a função que cada uma deve executar
   
    pthread_create(&thread_1, NULL, tarefa_1, NULL);
    pthread_create(&thread_2, NULL, tarefa_2, NULL);
    pthread_create(&thread_3, NULL, tarefa_3, NULL);
   
    // faz com que a thread principal espere a thread 1,2,3 acabarem;
   
    pthread_join(thread_1, NULL);
    pthread_join(thread_2, NULL);
    pthread_join(thread_3, NULL);
    printf("resultado da tabela 3\n");

    
        for(int i = 0;i<3; i++){
                for(int j= 0; j<3;j++){
              printf("%i\t  ",c[i][j]);
                }
                printf("\n");
        }

    exit(0);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

nussss, que erro feio o meu, muito obrigado, tava me batendo aqui e nao tinha visto isso

brigadão mesmo, deu certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×