gpt4 book ai didi

c++ - 如何在 C++ 中使用 openmp 并行运行展开的 'for' 循环(tmp)?

转载 作者:行者123 更新时间:2023-12-03 06:52:23 26 4
gpt4 key购买 nike

代码 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()
}
}
}
代码 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);
}

1感谢 Nim 提供代码 2 How to generate nested loops at compile time ?

最佳答案

如果您删除 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);
}
您可以在 https://godbolt.org/z/nPrcWP 看到正在编译以使用 OpenMP (注意对 GOMP_parallel 的调用...)。该代码还使用 LLVM 编译(切换编译器以查看 :-))。

关于c++ - 如何在 C++ 中使用 openmp 并行运行展开的 'for' 循环(tmp)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64194611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com