我需要帮助理解这个 openMP 示例

Posted

技术标签:

【中文标题】我需要帮助理解这个 openMP 示例【英文标题】:I need help understanding this openMP example 【发布时间】:2015-01-26 07:09:36 【问题描述】:

我从 openMP 开始,我想并行化这部分代码:

for (i=0 ;i<n ;i++) 
    for (j=1 ;j<n ;j++)  
       A[i][j]+=A[i][j-1];

我找到了这个答案:

#pragma omp parallel for private(i, j) shared(A, n)
for (i = 0; i < n; ++i) 
  for (j = 1; j < n; ++j)  
    A[i][j] += A[i][j-1];

我有一些问题:

为什么i是私有的而不是共享的? 关于这个答案,如果我有 4 个线程,所以每个线程执行相同的代码,我不明白如何获得与顺序代码相同的结果?

线程如何完成这项工作?我需要你的帮助。

【问题讨论】:

【参考方案1】:

为什么 i 私有而不共享?

变量ij 对于每个线程都是私有的,因为它们是循环计数器。每个线程都必须与其他线程分开跟踪它在做什么。如果ij 在线程之间共享,那么每个线程都会更新它们并扰乱其他线程的执行。

如果我有 4 个线程,所以每个线程执行相同的代码,我不明白如何获得与顺序代码相同的结果?

每个线程执行相同的代码行,但使用不同的变量。 OpenMP 的“for”指令有助于在线程之间自动分配迭代,以便每个线程在for 循环中获得不同的起始值i 和不同的结束值。所以更像是每个线程在循环内部获得相同的代码,但循环初始化和结束条件不同。所有它们一起(如果编程正确)将给出与顺序实现相同的最终结果。

当然,要使其工作,循环必须是可并行化的。如果循环的每次迭代都依赖于先前迭代计算的结果,那么它就不能并行运行。在这种情况下,您需要重写循环,以便每次迭代都可以独立运行。

【讨论】:

我的意思是两种情况下最终的结果都是一样的:(1)顺序执行; (2) 每个线程执行一组迭代。 但是,您的示例不可并行化,并且并行运行程序的结果是未定义的(想想:“如果我改变迭代的执行顺序,结果会改变吗?”)。一个可行的例子是:#pragma omp parallel for private(i, j) shared(A, n) for (i = 0; i @David 如果您阅读了有关race conditions 和loop-carried dependences 的信息,也许您会明白我的意思。在编写并行程序之前,您需要了解这两个关键概念。【参考方案2】:

我从来没有使用过 omp,但你的问题让我很好奇。我希望本文档对您有所帮助。这对我很有帮助。 https://computing.llnl.gov/tutorials/openMP/#Exercise1

【讨论】:

以上是关于我需要帮助理解这个 openMP 示例的主要内容,如果未能解决你的问题,请参考以下文章

用于矩阵乘法的 OpenMP

OpenMP:堆数组的性能不佳(堆栈数组工作正常)

OpenMP 代码帮助

理解openmp中的collapse子句

openmp递归任务示例比顺序慢

无法理解 OpenMP 代码中的一些意外行为