Why is amap implemented as a member function of TaskPool?
Atila Neves via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Sep 22 00:45:33 PDT 2014
On Saturday, 20 September 2014 at 06:46:43 UTC, Nordlöw wrote:
> On Thursday, 18 September 2014 at 19:49:00 UTC, Atila Neves
> wrote:
>> I had to roll my own parallel map today, but at least I did
>> get a nice 3x speedup.
>
> Is your own parallel map public somewhere? It would be
> interesting to see it.
I just did the simplest, stupidest thing that would work, so it's
probably buggy. It works where I used it (and was faster) so
that's all I needed to know. To even think of releasing this I'd
use atomics instead of the mutex and try to break it in all sorts
of ways. But here it is anyway:
private auto pmap(alias fun, R)(R range) if(isInputRange!R) {
import std.parallelism;
import core.sync.mutex;
static __gshared Mutex mutex;
if(mutex is null) mutex = new Mutex;
typeof(fun(range.front))[] values;
foreach(i, value; range.parallel) {
auto newValue = fun(value);
synchronized(mutex) {
if(values.length < i + 1) values.length = i + 1;
values[i] = newValue;
}
}
return values;
}
Oh, and the reason I don't just append to `values` is that I need
to preserve the original order.
Atila
More information about the Digitalmars-d-learn
mailing list