Lockstep iteration in parallel: Error: cannot have parameter of type `void`

Ali Çehreli acehreli at yahoo.com
Fri May 19 21:18:28 UTC 2023


On 5/19/23 02:17, kdevel wrote:

> Should this compile? dmd says

Multiple points:

- lockstep works only with foreach loops but it's not a range.

- std.range.zip can be used instead but it does not provide 'ref' access 
to its elements.

- However, since slices are already references to groups of elements, 
you don't need 'ref' anyway.

- You seem to want to assign to elements in parallel; such functionality 
already exists in std.parallelism.

- Phobos documentation is not very useful these days as it's not clear 
from the following page that there are goodies like amap, asyncBuf, etc. 
It just shows parallel() and a few friends at the top:

   https://dlang.org/phobos/std_parallelism.html

One needs to know to click TaskPool:

   https://dlang.org/phobos/std_parallelism.html#.TaskPool

The following amap example there may be useful for your case but I could 
not make the types work:

// Same thing, but explicitly allocate an array
// to return the results in.  The element type
// of the array may be either the exact type
// returned by functions or an implicit conversion
// target.
auto squareRoots = new float[numbers.length];
taskPool.amap!sqrt(numbers, squareRoots);

// Multiple functions, explicit output range, and
// explicit work unit size.
auto results = new Tuple!(float, real)[numbers.length];
taskPool.amap!(sqrt, log)(numbers, 100, results);
https://dlang.org/phobos/std_parallelism.html#.TaskPool.amap

Ali



More information about the Digitalmars-d-learn mailing list