如何用OpenMP并行Fortran90中存在数据依赖的隐式格式循环?
关于Fortran90中带数据依赖循环的并行化问题
第一类反向递推循环
do l=n-1,1,-1 u(l)=u(l)-gam(l+1)*u(l+1) enddo
这个循环属于严格的顺序依赖结构:计算u(l)时必须用到已经更新完成的u(l+1)值,每一次迭代的输出是下一次迭代的输入,线程之间无法独立完成计算任务,因此常规的OpenMP并行指令(比如!$omp parallel do)完全无法适用,只能按串行顺序执行。
第二类正向递推循环
do l=2,n .... u(l)=(r(l)-a(l)*u(l-1))/bet .... enddo
这类是典型的链式递推循环,u(l)的计算依赖于前一个位置的u(l-1)结果,同样存在不可打破的串行依赖关系。常规的并行化方式无法直接应用,必须按原有顺序执行。
如果这类循环是整体计算流程的一部分,可以尝试从数学层面重构计算逻辑(比如将递推转换为矩阵运算等),看是否能打破依赖实现并行,但仅针对这两个循环本身的结构而言,不存在直接并行化的可能。
内容的提问来源于stack exchange,提问作者André Silva
相关产品推荐
相关产品推荐

