[英]how can i understand my code in 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 <n; ++ i)和(j = 0; j <n; ++ j)迭代? 我需要你的帮助。
1) i
是私有的,因为每个线程需要分别从0
迭代到n
; 否则,如果让i
共享(当您的线程在一起时)将在一个循环中从0
循环到n
。
2)是的,在此代码中,每个线程都有其自己的i
和j
变量副本,因此它们将分开运行。
3)在这个示例中我不确定,但是我可以说您必须避免data dependency
因为它会导致使代码并行工作的问题:处理器(或workers
)必须仅完成一项工作,而又不依赖于另一个worker的状态或结果带来更高的效率。 请参阅SIMD并尝试查找一些vectorization
信息。 简而言之,矢量化是一种实现SIMD
范例的技术,可在代码并行化方面提供很大帮助。 在现代CPU(如Intel Sandy Bridge
和较旧的体系结构上,使用此技术可以使您通过使用AVX/AVX2
扩展来极大地加快并行计算的速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.