几个小时以来,我一直在徒劳地试图解决以下问题:“进行必要的循环转换,使并行执行成为可能。”
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不幸的是,我的循环转换知识是poor.Therefore我可能需要一个详细的解释,如果你提前possible.Thank你的帮助!
发布于 2017-07-10 13:54:50
您的代码非常适合用于自动循环转换和局部性优化的所谓多面体框架。参考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/
https://stackoverflow.com/questions/32320705
复制相似问题