On Tuesday, 24 November 2015 at 18:49:25 UTC, Bishop120 wrote:
I figured this would be a simple parallel foreach function with
an iota range of sizeX and just making int X declared inside
the function so that I didnt have to worry about shared
variable but I cant get around the alive++ reduction and I dont
understand enough about D's reduction/parallel library.
Any ideas? Thanks in advance for yalls patience and assistance!
Incrementing often the same variable from different parallel
threads is a very bad idea in terms of performance. I would
suggest counting number of alive cells for each row independently
(in a local non-shared variable) and storing it to an array (one
value per row), then after the loop sum them up.
auto aliveCellsPerRow = new int[N];
foreach(i; iota(N).parallel) {
int aliveHere;
//...process a row...
aliveCellsPerRow[i] = aliveHere;
}
alive = aliveCellsPerRow.sum;
Then everything will be truly parallel, correct and fast.