Parallelism Map and Reduce
Zardoz
luis.panadero at gmail.com
Tue Dec 11 08:12:29 PST 2012
On Tuesday, 11 December 2012 at 15:22:49 UTC, Ali Çehreli wrote:
> That used to work a couple of dmd versions ago. I think it was
> a bug that it worked, so it stopped working after bug fixes.
>
> If I'm not mistaken this is actually related to a compiler
> implementation issue: Lambda's have a single pointer to store
> the context that they have been started in.
>
> When a lambda is a free-standing function (aka "module
> function" or "global function") then there is only the context
> to deal with. When the template is a member function
> (taskPool.map is) then there is also the object that the
> function is started on.
>
> The single pointer of the lambda is not sufficient to store
> both without big changes in the compiler.
>
> (I may be off with that description above. e.g. there may be
> two pointers when three are actually needed, etc.)
>
> I had to change following chapter after dmd's behavior had
> changed:
>
> http://ddili.org/ders/d.en/parallelism.html
>
> --- Quoting ---
> import std.parallelism;
> // ...
> double averageGrade(Student student)
> {
> return student.averageGrade;
> }
> // ...
> auto results = taskPool.map!averageGrade(students, 3);
>
> Note: The free-standing averageGrade() function above is needed
> due to a limitation that involves using local delegates with
> member function templates like TaskPool.map:
>
> auto results = taskPool.map!(a => a.averageGrade)(students,
> 3); // ← compilation ERROR
> ----------
>
> As you see above, the solution is to use a function with
> taskPool.map, not a lambda.
>
> Ali
I try to use a function instead of a lambda function I'm keep
getting compiler errors. Code :
Entity MapIntegrator (ref Entity me) {
me.Integrador3Orden (iDeltaT);
return me;
}
objects = array( taskPool.map!MapIntegrator(objects) );
With taskPool.Map I get this errors :
simulator.d(196): Error: template instance map!(MapIntegrator)
cannot use local 'MapIntegrator' as parameter to non-global
template map(functions...)
/usr/include/dmd/phobos/std/parallelism.d(1969): Error: function
std.parallelism.TaskPool.map!(MapIntegrator).map!(Entity[]).map.Map.fillBuf
cannot access frame of function D main
/usr/include/dmd/phobos/std/parallelism.d(1974): Error: template
instance amap!(MapIntegrator) cannot use local 'MapIntegrator' as
parameter to non-global template amap(functions...)
/usr/include/dmd/phobos/std/parallelism.d(1675): Error: function
std.parallelism.TaskPool.amap!(MapIntegrator).amap!(Entity[],ulong,Entity[]).amap
cannot access frame of function D main
/usr/include/dmd/phobos/std/parallelism.d(1706): Error: function
std.parallelism.TaskPool.amap!(MapIntegrator).amap!(Entity[],ulong,Entity[]).amap.doIt
cannot access frame of function D main
/usr/include/dmd/phobos/std/parallelism.d(1974): Error: template
instance
std.parallelism.TaskPool.amap!(MapIntegrator).amap!(Entity[],ulong,Entity[])
error instantiating
simulator.d(196): instantiated from here: map!(Entity[])
simulator.d(196): Error: template instance
std.parallelism.TaskPool.map!(MapIntegrator).map!(Entity[]) error
instantiating
make: *** [predSim] Error 1
But again, with std.algorthim Map it don give any error and works
fine.
More information about the Digitalmars-d-learn
mailing list