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矩阵,你不应该使用像这些矩阵那样的假矩阵。对于问题本身,你应该把块分成好的块,这样,任何代码“< >代码>代码>只会被触摸(读写)。同一个任务,而不是几个任务。