我刚刚开始了解OpenMP,并且在下面找到了这段代码
#pragma omp parallel for
for (int i = 1; i < N; i++) { A[i] = B[i] – A[i – 1]; }
我想知道是否可以并行化此循环?
答案 0 :(得分:1)
这里的等效代码仅从1个数组中读取:
auto a = A[ 0 ];
for( int i = 1; i < N; i++ )
{
a = B[ i ] - a;
A[ i ] = a;
}
如您所见,相邻循环之间存在数据依赖性,即结果取决于上一个迭代步骤。通常,无法并行化此类算法。
顺便说一句,如果您的值是浮点数,整数或以同样快的速度计算operator -
的值,则代码的速度可能受RAM带宽的限制,而不是受计算的限制。并行化无济于事。
答案 1 :(得分:0)
我会说不(至少不会以它值得的方式)。考虑使用两个线程进行基础并行化的方法:
// thread # 1
for(int i = 1; i < N / 2; i++) { A[i] = B[i] – A[i – 1]; }
// thread # 2
for(int i = N / 2; i < N; i++) { A[i] = B[i] – A[i – 1]; }
线程将并行工作,因此第二个线程将基于第一个线程可能尚未计算的A [N / 2-1]计算A [N / 2]。如果您找到一种方法来预先计算“相邻”项目(例如,在我们的示例中为N / 2-1),那么它就可以工作。但是,为此,您应该遍历所有元素直到N /2。您可能还可以做一些算术技巧来预先计算一些元素,但是随后您应该有另一个循环,这会使并行化无效...