I’m trying to use openmp to multithread a loop through std::set. When I write the following code –
#pragma omp parallel for
for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
const A a = *i;
operate(a);
}
I get this error:
error: invalid type for iteration variable 'i'
error: invalid controlling predicate
error: invalid increment expression.
Is there an another, correct way to iterate through std containers using openmp?
I know I can use int i and iterate from 0 to s.size() and an iterator or operator[] in the loop body, but this looks much less clean.
Loop parallelization for stl iterators only works since OpenMP 3.0, and only for random access iterators (e.g.
vectoranddeque). You should be able to do something like this:Overhead is quite big though because each thread iterates over the whole sequence (but only executes
operateon some of it). Your method using anint iis more efficient.As an alternative take a look at GCC’s parallel implementation of
std::for_each. See my comment.EDIT: The STL Parallism TS, which will most likely be part of C++17, might be a good option in the future for iterating over standard containers.