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

问题描述 投票:0回答:1

代码 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 如何在编译时生成嵌套循环

c++ templates openmp template-meta-programming
1个回答
1
投票

如果删除

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 进行编译(切换编译器即可查看:-))。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.