20

我正在尝试使用 openmp 通过 std::set 对循环进行多线程处理。当我编写以下代码时 -

    #pragma omp parallel for
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
            const A a = *i;
            operate(a);
    }

我收到此错误:

error: invalid type for iteration variable 'i'
error: invalid controlling predicate
error: invalid increment expression.

是否有另一种正确的方法来使用 openmp 遍历 std 容器? 我知道我可以使用int i和迭代 from 0tos.size()和迭代器或operator[]在循环体中,但这看起来不那么干净。

4

1 回答 1

27

stl 迭代器的循环并行化仅适用于自 OpenMP 3.0 以来,并且仅适用于随机访问迭代器(例如vectordeque)。你应该能够做这样的事情:

#pragma omp parallel {
   for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
      #pragma omp single nowait {
         operate(*i);
      }
   }
}

虽然开销很大,因为每个线程都迭代整个序列(但只执行operate其中的一部分)。您使用 an 的方法int i更有效。

作为替代方案,请查看 GCC 的并行实现std::for_each。看我的评论。

编辑:STL Parallism TS很可能是 C++17 的一部分,在未来迭代标准容器时可能是一个不错的选择。

于 2010-03-25T09:28:43.160 回答