因此,为了尝试在C ++中练习一些openMP,我试图在不使用的情况下编写矩阵乘法
这是我尝试添加任务的矩阵乘法骨架。 我一直在研究一些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);
}
}
}
}
答案 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
本质上,您需要更改累积,以便获取某些行的副本,然后将结果组合在一个关键部分。