【发布时间】:2015-01-28 19:14:32
【问题描述】:
我在 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];
}
这似乎不起作用。有人可以指出我哪里出错了吗?
更新示例 -
假设有 3 个线程,具有以下局部矩阵 -
线程 1 本地 = 1 2 3 4 线程 2 本地 = 5 6 7 8 线程 3 本地 = 1 0 0 1 共享矩阵将是 小号 = 7 8 10 13【问题讨论】:
-
它有什么作用?变量是如何定义的?结果应该如何?准备一个完整的例子。
-
我已经用一个例子更新了这个问题。就像我提到的,变量'local'对于线程来说是本地的,而变量's'是共享的。
-
它是做什么的,显示你的结果!将声明添加到代码中。阅读stackoverflow.com/help/mcve 和stackoverflow.com/help/how-to-ask,否则您的问题可能会被关闭和删除。永远不要在一个好问题中使用“它不起作用”,总是解释它的作用。
-
我在您的代码中没有看到任何
private,您如何确保它是本地的? -
我实际上是在计算协方差矩阵,每个线程都有一个单独的数据块。将本地副本相加以获得最终共享矩阵的过程是最后一步。我抽象出细节以使问题更简单。我已在#pragma omp parallel 指令中将“local”声明为私有,将“s”声明为共享(问题中未显示)。我没有粘贴整个代码,因为它非常庞大。谢谢
标签: matrix parallel-processing openmp