Parallelism with std.parallelism

Work units: parallel(range, workUnitSize). Avoid shared mutable state inside parallel bodies (or use atomics).

import std.parallelism, std.range, std.stdio, std.math;

void main()
{
    auto nums = iota(1_000_000).array;
    auto results = new double[](nums.length);

    foreach (i, ref r; parallel(results))       // parallel foreach over the default taskPool
        r = sqrt(cast(double) nums[i]);

    auto squares = taskPool.amap!(x => x * x)(nums);          // eager parallel map
    auto total = taskPool.reduce!"a + b"(nums);               // parallel reduce
    auto lazyMap = taskPool.map!(x => x * 2)(nums, 1000);     // lazy, buffered

    auto t = task!fib(35);                                     // future/task
    taskPool.put(t);
    writeln(t.yieldForce);                                     // wait for the result
    writeln(totalCPUs);

    auto pool = new TaskPool(4);                               // custom pool
    scope(exit) pool.finish();
}