OpenMP使用矩阵乘法任务

时间:2014-09-20 03:55:58

标签: c++ c matrix openmp matrix-multiplication

因此,为了尝试在C ++中练习一些openMP,我试图在不使用的情况下编写矩阵乘法     

这是我尝试添加任务的矩阵乘法骨架。

#include <omp.h>
#include <cstdio>

void process(double **a, double **b, double **c, int i) {
  for(int j=0;j<1024;j++)
    for(int k=0;k<1024;k++)
      c[i][j] += a[i][k]*b[k][j];
}

void matrix_mult(double **a, double **b, double **c) {

  omp_set_num_threads(4);

  /* do I need to modify some storage attributes here? shared, private etc? */
  #pragma omp parallel 
  {  
    for(int i=0;i<1024;i++) {

      #pragma omp task 
      {
        process(a,b,c,i);
      }
    }
  }
}

我一直在研究一些openMP概述和示例,但是我很难将概念应用到我的代码中。当我使用多个线程时,我不断得到不正确的矩阵结果。我该怎么做才能解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:1)

你有一个逻辑错误:你不会生成1024个任务,而是生成(#个线程)* 1024个任务,因为每个线程在 parallel <内部运行 for -loop / strong>地区。只需将 for -loop放在单个区域内。

答案 1 :(得分:0)

我现在没有OpenMP 3.0编译器,但我建议你遇到的大部分问题来自c [i] [j]上的累积问题。

在执行+ =之前,每个线程堆栈可能存储了不同的c [i] [j]值,导致错误的累积。

SO上有类似问题的答案,包括: Matrix multiplication by vector OpenMP C

本质上,您需要更改累积,以便获取某些行的副本,然后将结果组合在一个关键部分。