循环并行化

时间:2015-08-31 22:08:52

标签: parallel-processing transformation nested-loops

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

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

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

1 个答案:

答案 0 :(得分:0)

您的代码非常适合所谓的多面体框架,用于自动循环转换和局部优化。请参阅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/