我如何理解我在 openMP 中的代码?

Posted

技术标签:

【中文标题】我如何理解我在 openMP 中的代码?【英文标题】:how can i understand my code in openMP? 【发布时间】:2015-01-25 10:12:10 【问题描述】:

我从 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 个线程,那么每个线程都有 (i = 0; i

【问题讨论】:

I need help understanding this openMP example的可能重复 【参考方案1】:

1) i 是私有的,因为每个线程需要分别从0 迭代到n;否则,如果在您的线程在一起时使i 共享,则将遍历一个循环,从0n

2) 是的,在这段代码中,每个线程都有自己的 ij 变量副本,这就是它们将单独运行的原因。

3) 在这个例子中我不确定,但我可以说你必须避免data dependency,因为它会导致代码并行工作的问题:处理器(或workers)必须只完成一项工作而不依赖于另一个工人的状态或结果带来更高的效率。请参阅SIMD 并尝试查找一些vectorization 信息。简而言之,向量化是一种有助于并行代码的技术,因为它实现了SIMD 范式。在现代 cpu 上,如 Intel Sandy Bridge 和使用此技术的旧架构,您可以通过使用 AVX/AVX2 扩展来加速并行计算。

【讨论】:

The for directive splits the for-loop so that each thread in the current team handles a different portion of the loop. 如果使用 3 个线程,则第二个线程将在 n/3..2n/3 范围内拥有 i,在 1..n 范围内拥有 j。所以数据依赖没有问题:j 循环不是并行的。 这就是为什么我说“我不确定”:) 谢谢。但无论如何,这些信息很有用,我会在答案中保留它。 感谢您有趣的回答,但我不明白尽管每个线程执行相同的代码(如果是 4 个线程),我怎样才能获得真实的结果? @francis,j 循环不是并行的,因此结果将是正确的,但是先前迭代对 j 的依赖性将导致自动矢量化失败。 It can be done with SIMD but it's not trivial.

以上是关于我如何理解我在 openMP 中的代码?的主要内容,如果未能解决你的问题,请参考以下文章

理解openmp中的collapse子句

如何确认多核系统中的openmp是不是使用了所有内核?

如何在英特尔 MIC 上本地分析 openmp 代码?

c++ openmp中的线程

减少 OpenMP 中的数组

如何修复 OpenMP 程序的 gdb 运行中的线程数