gpt4 book ai didi

c++ - 我可以用 openmp 迭代 C++11 std::tuple 吗?

转载 作者:太空狗 更新时间:2023-10-29 21:45:16 25 4
gpt4 key购买 nike

我给出了以下代码来遍历 std::tuple。代码来自这里 here .

#include <tuple>
#include <utility>

template<std::size_t I = 0, typename FuncT, typename... Tp>
inline typename std::enable_if<I == sizeof...(Tp), void>::type
for_each(std::tuple<Tp...> &, FuncT) // Unused arguments are given no names.
{ }

template<std::size_t I = 0, typename FuncT, typename... Tp>
inline typename std::enable_if<I < sizeof...(Tp), void>::type
for_each(std::tuple<Tp...>& t, FuncT& f)
{
f(std::get<I>(t));
for_each<I + 1, FuncT, Tp...>(t, f);
}

现在,我想用 openmp 执行这个 for_each 循环,就像我可以在 for 上使用 openmp 一样。是否有使这成为可能的技巧?

注意:您可以修改以上代码或使用您自己的任何其他版本的for_each

最佳答案

C++11 模板语法对我来说非常陌生,但是像这样的递归问题最好使用显式 OpenMP 任务并行处理:

template<std::size_t I = 0, typename FuncT, typename... Tp>
inline typename std::enable_if<I < sizeof...(Tp), void>::type
for_each(std::tuple<Tp...>& t, FuncT& f)
{
#pragma omp task firstprivate(I) shared(t,f)
{
f(std::get<I>(t));
}
for_each<I + 1, FuncT, Tp...>(t, f);
}

...

// Proper usage
#pragma omp parallel
{
#pragma omp single
for_each(...);
}

重要的部分是让顶层调用 for_eachsingleparallel 中构建地区。因此只有一个线程会调用 for_each ,这又会导致 f(std::get<I>(t));作为显式任务排队等待稍后执行。其他线程在 single 末尾的隐式屏障处等待。构造,将开始从任务队列中拉取任务并并行执行它们,直到队列为空。为清楚起见,明确给出了任务使用的所有变量的共享类。

t 的对象和 f应该共享引用,并且引用本身(基本上是实现引用的指针)应该是 firstprivate。另一方面,OpenMP 标准禁止引用类型成为 firstprivate,不同的编译器供应商往往以不同的方式实现该标准。英特尔 C++ 编译器接受以下代码并在任务中给出正确的结果,但引用的变量被私有(private)化(这是错误的):

void f(int& p)
{
#pragma omp task
{
cout << "p = " << p << endl;
p = 3;
cout << "p' = " << p << endl;
}
}

void f1()
{
int i = 5;

#pragma omp parallel
{
#pragma omp single
f(i);
}
cout << "i = " << i << endl;
}

PGI 的编译器给出了正确的结果并且没有私有(private)化 i .另一方面,GCC 正确地确定了 p应该是 firstprivate但随后遇到标准中的禁止并给出编译时错误。

如果将任务修改为阅读:

#pragma omp task shared(p)
{
...
}

它与 GCC 一起正常工作,但任务打印出错误的初始值 p然后导致英特尔 C++ 编译器和 PGI 的 C++ 编译器出现段错误。

去看看吧!

关于c++ - 我可以用 openmp 迭代 C++11 std::tuple 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004213/

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