OpenMP寻找循环依赖

1.OpenMP寻找循环依赖

​ 当我们试图使用一个parallel for指令时,首先应该注意的是:要小心发现循环依赖。我们不需要担心一般的数据依赖。例如,在下面循环中:

1
2
3
4
for(i=0;i<n;i++){
x[i] = a + i*h; //2
y[i] = exp(x[i]); //3
}

在第二行和第三行之间有一个数据依赖。然而,如下的并行化没有问题。

1
2
3
4
5
#pragma omp parallel num_threads(thread_count)
for(i=0;i<n;i++){
x[i] = a + i*h; //3
y[i] = exp(x[i]); //4
}

因为x[ i ]的计算与它接下来的使用总是被分配给同一个进程。

​ 我们也应该观察到,有依赖关系的语句,其中至少一条语句会有序地写或更新变量。因此为了检测循环依赖,我们只需要重点观察被循环体更新的变量,即我们应该寻找在一个迭代中被读或被写,而在另一个迭代中被写的变量。

2.总结

  1. 数据依赖在优化过程中非常常见
  2. 如何解决数据依赖对提升并行化的效果影响很大

3.参考资料

并行程序导论 (美)Peter S.Pacheco


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!