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