cod*_*der 5 c++ templates openmp tmp
代码 1 显示了使用 openmp 并行化“for”循环。我想在使用模板元编程展开“for”循环后实现类似的并行化(请参阅代码 2)。能否请你帮忙?
代码 1:外部 for 循环与四个线程并行运行
void some_algorithm()
{
// code
}
int main()
{
#pragma omp parallel for
for (int i=0; i<4; i++)
{
//some code
for (int j=0;j<10;j++)
{
some_algorithm()
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码 2:与代码 1 相同,我想使用 openmp 并行运行外部 for 循环。怎么做?1
template <int I, int ...N>
struct Looper{
template <typename F, typename ...X>
constexpr void operator()(F& f, X... x) {
for (int i = 0; i < I; ++i) {
Looper<N...>()(f, x..., i);
}
}
};
template <int I>
struct Looper<I>{
template <typename F, typename ...X>
constexpr void operator()(F& f, X... x) {
for (int i = 0; i < I; ++i) {
f(x..., i);
}
}
};
int main()
{
Looper<4, 10>()(some_algorithm);
}
Run Code Online (Sandbox Code Playgroud)
1感谢 Nim 提供代码 2如何在编译时生成嵌套循环?
如果删除constexpr声明,那么您可以使用_Pragma("omp parallel for")类似这样的
#include <omp.h>
template <int I, int ...N>
struct Looper{
template <typename F, typename ...X>
void operator()(F& f, X... x) {
_Pragma("omp parallel for if (!omp_in_parallel())")
for (int i = 0; i < I; ++i) {
Looper<N...>()(f, x..., i);
}
}
};
template <int I>
struct Looper<I>{
template <typename F, typename ...X>
void operator()(F& f, X... x) {
for (int i = 0; i < I; ++i) {
f(x..., i);
}
}
};
void some_algorithm(...) {
}
int main()
{
Looper<4, 10>()(some_algorithm);
}
Run Code Online (Sandbox Code Playgroud)
您可以在https://godbolt.org/z/nPrcWP上看到它被编译为使用 OpenMP (观察对 ... 的调用GOMP_parallel)。该代码还可以使用 LLVM 进行编译(切换编译器即可查看:-))。
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |