使用线程的矩阵乘法,其中每个线程计算一行

时间:2015-04-28 20:30:53

标签: c

  1. 大家好,我用线程编写了下面的矩阵乘法代码, 因此,当我运行该代码时,每个线程应该计算一行 只给出第一行和另一行的正确结果 行中的大多数元素都是零。 M * M的马蒂克斯大小!!我无法找到错误的地方!!提前致谢

            # include <stdio.h>
            # include <pthread.h>
            # include <stdlib.h>
            #include <sys/time.h>
            int M;
            int A [100][100];
    
            int B [100][100];
            int C [100][100];
    
            struct v {
               int i; /* row */
               int j; /* column */
            };
    
            void *runner(void *param); /* the thread */
    
            int main()
            {
            clock_t cstart = clock();
              clock_t cend = 0;
               int count=0;
               pthread_t tid;    
                int iCount,jCount,kCount;
            printf("Enter The Size: \n");
            scanf("%d",&M);
            for(iCount=0;iCount<M;iCount++)
                {
                    for(jCount=0;jCount<M;jCount++)
                    {
                        printf("Enter Mat1[%d][%d] :",iCount,jCount);
                        scanf("%d",&A[iCount][jCount]);
                    }
                }
            for(iCount=0;iCount<M;iCount++)
                {
                    for(jCount=0;jCount<M;jCount++)
                    {
                        printf("Enter Mat2[%d][%d] :",iCount,jCount);
                        scanf("%d",&B[iCount][jCount]);
                    }
                }
             for(iCount = 0; iCount < M; iCount++) {
                     struct v *data = (struct v *) malloc(sizeof(struct v));
                     data->i = iCount;
                     data->j = jCount;
                     pthread_t tid;       
                     pthread_attr_t attr; 
                     pthread_attr_init(&attr);
                     pthread_create(&tid,&attr,runner,&C[iCount]);
                     pthread_join(tid, NULL);
                     count++;
               }
              printf("\n Matrix 1 \n");
    
                for(iCount=0;iCount<M;iCount++)
                {
                    for(jCount=0;jCount<M;jCount++)
                    {
                        printf("%d \t",A[iCount][jCount]);
                    }
                    printf("\n");
                }    
    
                printf("\n Matrix 2 \n");
    
                for(iCount=0;iCount<M;iCount++)
                {
                    for(jCount=0;jCount<M;jCount++)
                    {
                        printf("%d \t",B[iCount][jCount]);
                    }
                    printf("\n");
                } 
    
            printf("\n Multipication of Matrices ...\n");
               for(iCount = 0; iCount < M; iCount++) {
                  for(jCount = 0; jCount < M; jCount++) {
                     printf("%d \t", C[iCount][jCount]);
                  }
                  printf("\n");
               }
            cend = clock();
              printf ("it took %.3f cpu sec\n", ((double)cend - (double)cstart)* 1.0e-6);
            return 0;
    
          }
    
            void *runner(void *param) {
               struct v *data = param; 
               int n, sum = 0; 
               int jCount;
            do{sum=0;
               for(n = 0; n< M; n++){
                  sum += A[data->i][n] * B[n][data->j];
               }
               C[data->i][data->j] = sum;
    
            data->j++;
            }while(data->j<M);
               pthread_exit(0);
            }
    
       // compile code : gcc thread.c -o out -pthread
      //                 ./out
    

2 个答案:

答案 0 :(得分:0)

错误在于线程创建循环:

data->j = jCount;

您应该将data->j初始化为0。而是在矩阵初始化阶段结束时将其初始化为jCount,其值为Mdata->j作为线程参数没有意义,因为每个线程计算整个列。

答案 1 :(得分:0)

malloc()一个struct v,但随后什么都不做。

 struct v *data = (struct v *) malloc(sizeof(struct v));

您将C 2维数组的第n行的地址传递给您创建的主题:

pthread_create(&tid,&attr,runner,&C[iCount]);

但线程将地址视为struct v *

struct v *data = param; 

此外,启动一个单独的线程然后立即等待它完成是没有意义的:

         pthread_attr_init(&attr);
         pthread_create(&tid,&attr,runner,&C[iCount]);
         pthread_join(tid, NULL);

在该循环中启动 all 您的线程,将tid存储在数组中,然后运行另一个连接它们的循环。