我需要帮助理解这个 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
私有而不共享?
变量i
和j
对于每个线程都是私有的,因为它们是循环计数器。每个线程都必须与其他线程分开跟踪它在做什么。如果i
或j
在线程之间共享,那么每个线程都会更新它们并扰乱其他线程的执行。
如果我有 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 示例的主要内容,如果未能解决你的问题,请参考以下文章