【发布时间】:2021-12-20 05:31:24
【问题描述】:
我有一个嵌套循环,如下所示 -
for(int i=0; i<limit1; i++)
{
for(int j=0; j<limit2; j++){
/*
Code with Custom function calls, branching etc etc.
*/
}
}
内循环和外循环迭代是相互独立的。由于这个循环不能简单地向量化,我想将它折叠到一个巨大的迭代空间中,以便可以更有效地展开它,从某种意义上说,不是只展开内部循环,而是可以展开组合的迭代空间。
我不想并行化它。根据我的理解,我不认为 openmp 提供了像 #pragma omp collapse(2) 这样的独立的 collapsing pragma,而是将 collapse 子句与 simd 或 for 等其他 pragma 结合使用。
可以通过 OpenMP 或其他方法来实现。
PS - 我不确定这种方法的优缺点,是否会显着提高性能等等。如果有人从理论上解释(或者如果可以的话)如何(即在基准测试之前) ) 确定这一点,那就太好了。
TIA
【问题讨论】:
-
为什么不手动折叠循环?
for( n=0; n<limit1*limit2;n++){ i=n/limit1; j=n%limit1; ......}我不认为它会明显更快,但你可以尝试....
标签: c++ openmp vectorization loop-unrolling