3

我有一个矩阵乘法代码,它通过以下矩阵乘以矩阵 A * 矩阵 B = 矩阵 C

for(j=1;j<=n;j++) {
 for(l=1;l<=k;l++) {
  for(i=1;i<=m;i++) {
   C[i][j] = C[i][j] + B[l][j]*A[i][l];

 }
}

现在我想把它变成多线程矩阵乘法,我的代码如下:

我使用结构

struct ij
{
 int rows;
 int columns;
};

我的方法是

void *MultiplyByThread(void *t)
{
 struct ij *RowsAndColumns = t;
 double total=0; 
 int pos; 
 for(pos = 1;pos<k;pos++)
 {
  fprintf(stdout, "Current Total For: %10.2f",total);
  fprintf(stdout, "%d\n\n",pos);
  total += (A[RowsAndColumns->rows][pos])*(B[pos][RowsAndColumns->columns]);
 }
 D[RowsAndColumns->rows][RowsAndColumns->columns] = total;
 pthread_exit(0);

}

我的主要内容是

      for(i=1;i<=m;i++) {
        for(j=1;j<=n;j++) {

   struct ij *t = (struct ij *) malloc(sizeof(struct ij));
   t->rows = i;
   t->columns = j;

    pthread_t thread;
    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(&thread, &threadAttr, MultiplyByThread, t);    
    pthread_join(thread, NULL);    

        }
      }

但我似乎无法得到与第一个矩阵乘法相同的结果(这是正确的)有人能指出我正确的方向吗?

4

2 回答 2

2

尝试以下操作:

#pragma omp for private(i, l, j)
for(j=1;j<=n;j++) {
    for(l=1;l<=k;l++) {
        for(i=1;i<=m;i++) {
            C[i][j] = C[i][j] + B[l][j]*A[i][l];
        }
    }
}

在谷歌搜索 GCC 编译器开关以启用 OpenMP 时,我实际上遇到了这篇博客文章,它比我能更好地描述了发生的事情,并且还包含一个更好的示例。

用于多核机器的大多数合理相关的编译器都支持 OpenMP,有关更多信息,请参阅OpenMP 网站

于 2010-11-04T17:28:47.583 回答
0

实际上,您的线程代码不是线程的。您创建一个线程并通过在调用 create 之后调用 join 来等待它完成。您必须创建一个 mxn 线程矩阵,将它们全部启动,然后将它们全部加入。除此之外,代码似乎与循环计算相同。与结果的确切差异是什么?

示例(注意,未编译):

pthread_t threads[m][n]; /* Threads that will execute in parallel */

然后主要是:

 for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {

    struct ij *t = (struct ij *) malloc(sizeof(struct ij));
    t->rows = i;
    t->columns = j;

    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(thread[i][j], &threadAttr, MultiplyByThread, t);    
    }
  }

  /* join all the threads */
  for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {
       pthread_join(thread[i][j], NULL);
    }
  }

(或多或少,只是不调用pthread_join循环内的每个线程)。

于 2010-11-04T16:50:59.860 回答