我如何理解openMP中的代码?

时间:2015-01-25 10:12:11

标签: c++ c multithreading parallel-processing openmp

我从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&lt; n; ++ i)和(j = 0; j&lt; n; ++ j)迭代?我需要你的帮助。

1 个答案:

答案 0 :(得分:1)

1)i是私有的,因为每个线程需要分别从0迭代到n;否则,如果您的帖子在一起从i0进行一次循环迭代时共享n

2)是的,在此代码中,每个帖子都有自己的ij变量副本,这就是他们分开操作的原因。

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