How works internally ParallelForEach

Zardoz luis.panadero at gmail.com
Sat Dec 1 03:36:15 PST 2012


On Saturday, 1 December 2012 at 10:58:55 UTC, thedeemon wrote:
>
> taskPool.parallel is a library function, it doesn't make 
> compiler smarter and doesn't get much help from the compiler. 
> It means your "total" variable will not get any special 
> treatment, it's still a local variable referenced from the loop 
> body which is turned into a function by foreach. This function 
> is run by .parallel in several threads, so you'll get a race 
> condition and most probably an incorrect total value. You 
> should avoid changing the same memory in paralel foreach. 
> Processing different elements of one array (even local) is ok. 
> Writing to one variable not ok.

Humm... So ParallelForeach only launch N tasks doing a work over 
a slice from the range and nothing more.

The prevois code should work better if i set "total" to be sahred 
and hope that D shared vars have nnow the internal barries 
working ,or I need to manually use semaphores ?

import std.stdio;
import std.parallelism;
import std.math;

void main() {
   auto logs = new double[10_000_000];
   shared double total = 0;
   foreach(i, ref elem; taskPool.parallel(logs, 100)) {
     elem = log(i + 1.0);
     total += elem;
   }

   writeln(total);
}

PD: I know that I can use reduction to do the same thing much 
better...




More information about the Digitalmars-d-learn mailing list