我从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)迭代?我需要你的帮助。
答案 0 :(得分:1)
1)i
是私有的,因为每个线程需要分别从0
迭代到n
;否则,如果您的帖子在一起从i
到0
进行一次循环迭代时共享n
。
2)是的,在此代码中,每个帖子都有自己的i
和j
变量副本,这就是他们分开操作的原因。
3)我不确定在这个例子中但我可以说你必须避免使用data dependency
因为它导致代码并行工作时出现问题:处理器(或workers
)必须完全一个工作不依赖于另一个工人的状态或结果,以提高效率。请参阅SIMD并尝试查找一些vectorization
信息。简而言之,矢量化是一种有助于代码并行化的技术,因为它实现了SIMD
范例。在现代cpu(如Intel Sandy Bridge
)和使用此技术的旧架构上,您可以使用AVX/AVX2
扩展来加速并行计算。