假设我有一个依赖于非类型模板参数的函数,这个参数是一个std::size_t类型的值,可以取值0到N-1,其中N在编译时已知。
可以使用std::sequence或模板递归来遍历所有值。例如:
如何将“展开循环”转换为可以使用OpenMP并行化的标准for循环?就像这样(显然不能编译...)
显然,如果假设N=3,我可以用以下方式实现。
我对一个适用于任何
#include <utility>
template <std::size_t I>
void f() {
//...
}
template <std::size_t... I>
void loop_f_impl(std::index_sequence<I...>) {
(f<I>(),...);
}
template <std::size_t N>
void loop_f() {
loop_f_impl(std::make_index_sequence<N>{});
}
int main() {
constexpr std::size_t N = 4;
loop_f<N>();
}
如何将“展开循环”转换为可以使用OpenMP并行化的标准for循环?就像这样(显然不能编译...)
#pragma omp for
for (std::size_t i = 0; i < N; ++i)
f<i>();
显然,如果假设N=3,我可以用以下方式实现。
#pragma omp for
for (std::size_t i = 0; i < N; ++i)
switch (i) {
case 1:
f<1>();
break;
case 2:
f<2>();
break;
case 3:
f<3>();
break;
}
我对一个适用于任何
N
的通用代码很感兴趣。