Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Operating on different elements of std::vector in parallel

Say I have a std::vector<Object*>. The vector is large ( > 1000 elements) and each Object* needs to have extensive computation done on it. The for loop that runs each the computation on each element then, can be easily parallelized. In fact, I could process all 1000 elements in parallel for maximum speedup ("embarrassingly parallel?")

Now I'm wondering 2 things:

1) Is it safe to read and write to different elements of a std::vector without a lock? (not modifying the vector itself!)

2) Are there easy ways or conventions or patterns to follow to cut a for loop and dispatch to threads?

like image 559
bobobobo Avatar asked Sep 14 '11 12:09

bobobobo


2 Answers

1) Yes

2) You can use OpenMP to paralellize vector handling. If you are working with Microsoft VC++ 2010, Concurrency library has parallel_for and parallel_for_each algorithms.

like image 141
Alex F Avatar answered Sep 28 '22 10:09

Alex F


For 1, see my answer here:

§ 23.2.2 Container data races

2/ Notwithstanding (17.6.5.9), implementations are required to avoid data races when the contents of the contained object in different elements in the same sequence, excepting vector<bool>, are modified concurrently.

Obviously this is C++11 (as C++98/03 made no mention of threads), however most implementations already comply.

I am afraid I don't know any convention. OpenMP could probably automate this.

To do it manually, I would probably use a queue-like system, as not all objects may require the same time, you could have one thread finish well after the others if you split in "equal" portions, whereas a queue feeding the threads would alleviate this issue by maximizing the parallelism up until the very end.

like image 42
Matthieu M. Avatar answered Sep 28 '22 08:09

Matthieu M.