我徒劳地试图解决以下几个小时的问题: “进行必要的循环转换,以便可以进行并行执行”
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
不幸的是,我的循环转换知识很差。如果可能的话,我可能需要详细解释。请提前感谢您的帮助!
答案 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/