使用矩阵乘法任务的OpenMP
OpenMP using tasks for matrix multiplication
因此,为了在C++中练习一些openMP,我尝试在不使用#的pragma omp并行
这是我的矩阵乘法骨架,我正试图将任务添加到其中。
#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概述和示例,但在这里很难将概念应用到我的代码中。当我使用超过1个线程时,我总是得到不正确的矩阵结果。我能做些什么来解决这个问题?谢谢
您有一个逻辑错误:您不会生成1024个任务,而是生成(#threads)*1024个任务,因为每个线程都在并行区域内运行for-循环。只需将-循环的放在单个区域内。
我现在没有OpenMP 3.0编译器,但我认为你遇到的大部分问题都来自c[I][j]上的累积问题。
在执行+=之前,每个线程堆栈可能存储了不同的c[i][j]值,从而导致错误的累积。
SO上有类似问题的答案,包括:矩阵乘矢量OpenMP C
从本质上讲,您需要更改累积,以便获得某些行的副本,然后将结果组合在一个关键部分中。
相关文章:
- 任务内部的 OpenMP 任务循环
- OpenMP 任务看不到共享变量的更改
- openMp 动态调度与按处理时间排序任务时的 LPT 调度相同吗?
- OpenMP 任务等待不起作用
- OpenMP 4.5 任务依赖关系和执行顺序
- OpenMp 任务:无法通过引用传递参数
- 在OpenMP上的并行合并排序上的数组大小问题.如何将合并分类分类为更多任务
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- C 异步与OpenMP任务
- 在OpenMP中设计具有任务的算法
- OpenMP任务依赖性忽略了
- 在隐式屏障处等待 OpenMP 任务完成
- OpenMP 任务中的数据属性
- OpenMP:即使在深度极限的情况下,递归任务也比顺序慢
- 传递"shared"指针的 OpenMP 任务
- C++ OpenMP 任务 - 通过引用问题传递
- 使用矩阵乘法任务的OpenMP
- 使用OpenMP将循环划分为唯一的任务
- 在OpenMP中屈服于其他线程/任务
- Visual Studio中的OpenMP任务