【问题标题】:Loop parallelization循环并行化
【发布时间】:2015-08-31 22:08:52
【问题描述】:

几个小时以来,我一直在徒劳地尝试解决以下问题: “进行必要的循环转换,以便可以并行执行”

do i=1,n
   do j=1,n
       A[i,j]=A[i-3,j-3]+A[i-4,j-4]
   end do
end do

不幸的是,我的循环转换知识很差。因此,如果可能的话,我可能需要一个详细的解释。提前感谢您的帮助!

【问题讨论】:

标签: parallel-processing transformation nested-loops


【解决方案1】:

您的代码完全适合用于自动循环转换和局部优化的所谓多面体框架。请参阅 PLUTO 编译器,它可以自动并行化您的代码。 PLUTO 将您的代码转换为:

for (t1=0;t1<=floord(N-1,16);t1++) {
    lbp=max(0,ceild(32*t1-N+1,32));
    ubp=min(floord(N-1,32),t1);
    #pragma omp parallel for private(lbv,ubv,t3,t4)
    for (t2=lbp;t2<=ubp;t2++) {
        for (t3=32*t1-32*t2;t3<=min(N-1,32*t1-32*t2+31);t3++) {
        lbv=32*t2;
        ubv=min(N-1,32*t2+31);
        #pragma ivdep
        #pragma vector always
        for (t4=lbv;t4<=ubv;t4++) {
           A[t3][t4]=A[t3-3][t4-3]+A[t3-4][t4-4];;
        }
    }
}

您可以看到,平铺跟随倾斜有助于提取两个级别的并行性。 更多细节可以在以下位置找到: http://pluto-compiler.sourceforge.net/

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 2013-12-08
    • 1970-01-01
    • 2016-07-23
    • 2021-08-24
    • 2014-01-31
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多