Matrix OpenMP中局部矩阵加法的并行for循环

Matrix OpenMP中局部矩阵加法的并行for循环,matrix,parallel-processing,openmp,Matrix,Parallel Processing,Openmp,我有n个矩阵的本地副本,比如说“本地”,在n个线程中。我想更新一个全局共享矩阵“s”,它的元素是所有局部矩阵对应元素的总和。 例如s[0][0]=local_1[0][0]+local_2[0][0]+…+local_n[0][0] 我编写了以下循环来实现它- #pragma omp parallel for for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) s[i][j]=s[i][j]+local[i

我有n个矩阵的本地副本,比如说“本地”,在n个线程中。我想更新一个全局共享矩阵“s”,它的元素是所有局部矩阵对应元素的总和。 例如s[0][0]=local_1[0][0]+local_2[0][0]+…+local_n[0][0]

我编写了以下循环来实现它-

#pragma omp parallel for
for(int i=0;i<rows;i++)
{   
    for(int j=0;j<cols;j++)
        s[i][j]=s[i][j]+local[i][j];
}  
#pragma omp parallel for

对于(int i=0;i在整个回答过程中,我假设您已在每个线程上正确创建了
local
的私有版本,如您的问题和示例所示,而不是您的代码片段所示

在编写代码时,变量
i
private
,即每个线程都有自己的副本。因为它是最外层循环的迭代变量,所以每个线程将获得自己的一组值来处理。假设有3个线程和3行,那么线程
0
将获得
i
0
,线程
1
将获得
1
,依此类推。显然(或不)在每个线程上迭代更多行将获得更多的
i
值。在所有情况下,每个线程将获得
i
所获得的所有值集合的不相交子集

但是,如果线程
0
仅获取
i==0
来进行计算

s[i][j]=s[i][j]+local[i][j];
将只在线程
0
上的
0
本地
0
第行工作。在我使用的示例中,在线程
0
上,决不等于
1
,因此线程
0
上的
1
本地
第行中的值决不会添加到
s
第1行

在它们之间,3个线程将更新
s
的3行,但每个线程只会添加自己版本的
local
中自己的行


至于如何做你想做的,看看你正在尝试一个数组的减少,因为解释的原因,在C或C++中不直接支持。

< P>这应该是对答案的最后一段的评论,如果我被允许这样做的话。 参考问题中的第一种方法是并行化数组填充,而不是并行化数组缩减。根据规范(v4 p122):
关键构造将关联结构化块的执行限制为 一次一个线程。

每个线程都会减少数组中自己的部分,但只能一个接一个地减少,本质上代码是串行运行的。求和循环位于并行区域内的唯一原因是数组对每个线程都是局部的,这只有在填充数组时才有意义。它是做什么的?变量是如何定义的d?结果应该是什么样子?准备一个完整的例子。我用一个例子更新了这个问题。正如我提到的,变量“local”是线程的本地变量,变量“s”是共享的。它做什么,显示你的结果!将声明添加到代码中。阅读,否则你的问题将被关闭和删除。永远不要使用“它不起作用"在一个好问题中,请始终解释它的作用。我在您的代码中没有看到任何
private
,您如何确保它是本地的?我实际上在计算协方差矩阵,每个线程都包含一个单独的数据块。将本地副本相加以获得最终共享矩阵的过程是最后一步。我提取了详细信息to使问题更简单。我已在#pragma omp parallel指令(问题中未显示)中将“local”声明为private,将“s”声明为shared。我没有粘贴整个代码,因为它非常庞大。谢谢
s[i][j]=s[i][j]+local[i][j];