It’s hard if you have unprotected, shared mutable state.
If you use a language that uses immutable data structures (Haskell, Clojure, Erlang) it’s easy!
If you use a language that won’t let you share mutable data without the required protection (Rust) it’s also easy!
Everything else and you can be sure that even if it looks like it works, it most likely doesn’t.
Yep. I remember parallelising emarrasingly parallel C++ code once. I had an array for the results of each job, but forgot to give each job their own index in the array. So everyone wrote their results to the zeroeth entry in parallel. It was cache efficient this way, but the result was not what I expected.
It’s hard if you have unprotected, shared mutable state. If you use a language that uses immutable data structures (Haskell, Clojure, Erlang) it’s easy! If you use a language that won’t let you share mutable data without the required protection (Rust) it’s also easy! Everything else and you can be sure that even if it looks like it works, it most likely doesn’t.
Yep. I remember parallelising emarrasingly parallel C++ code once. I had an array for the results of each job, but forgot to give each job their own index in the array. So everyone wrote their results to the zeroeth entry in parallel. It was cache efficient this way, but the result was not what I expected.