Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenMP使用任务进行矩阵乘法 所以,为了在C++中实践一些OpenMP,我试图在不使用的情况下编写一个矩阵乘法。 #pragma-omp并行_C++_C_Matrix_Openmp_Matrix Multiplication - Fatal编程技术网

OpenMP使用任务进行矩阵乘法 所以,为了在C++中实践一些OpenMP,我试图在不使用的情况下编写一个矩阵乘法。 #pragma-omp并行

OpenMP使用任务进行矩阵乘法 所以,为了在C++中实践一些OpenMP,我试图在不使用的情况下编写一个矩阵乘法。 #pragma-omp并行,c++,c,matrix,openmp,matrix-multiplication,C++,C,Matrix,Openmp,Matrix Multiplication,这是我试图添加任务的矩阵乘法框架 #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, d

这是我试图添加任务的矩阵乘法框架

#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);
      }
    }
  }
}
#包括
#包括
作废流程(双**a、双**b、双**c、int i){

对于(int j=0;j我现在没有OpenMP 3.0编译器,但我建议您遇到的大多数问题都来自c[I][j]上的累加问题

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

类似问题的答案如下:


本质上,您需要更改累加,以便复制某些行,然后将结果合并到关键部分。

您有一个逻辑错误:您不会生成1024个任务,而是生成(#线程)* 1024个线程,因为每个线程在<强>平行<强>区域内运行<<强> > C++。只需在<强>单< /强>区域内将< <强> > < <强> >。英特尔有一个非常详细的文档,描述如何使用Strassen算法和使用OMP任务来做矩阵矩阵倍数。这不是C++。如果你在C++中使用它们,C++有特定的模板类型,如果你在C++中使用它们,C就有真正的2D矩阵,你不应该使用像这些矩阵那样的假矩阵。对于问题本身,你应该把块分成好的块,这样,任何代码“< >代码>代码>只会被触摸(读写)。同一个任务,而不是几个任务。