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?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With