taskPool.reduce() help
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Nov 28 14:44:01 PST 2015
On 11/28/2015 01:57 PM, Ish wrote:
> The following code does not compile (with gdc) but if the line
> containing taskPool.reduce is reduce it does compile. Any pointers will
> be appreciated.
>
> import std.stdio;
> import std.math;
> import std.algorithm;
> import std.parallelism; // does not work!!
> import core.thread;
>
> double aCalculation(double result, int element) {
>
> double r = 4.0*(pow(-1.0, element)/(2.0*cast(double)element + 1.0));
> result += r;
>
> return result;
> }
>
> void main() {
> writefln("Result: %7.2f.", taskPool.reduce!aCalculation(0.0, [0, 1,
> 2, 3, 4]));
> }
>
> -ish
I had observed this difference before and had explained it here:
http://ddili.org/ders/d.en/parallelism.html
<quote>
However, there are important differences in the way taskPool.reduce() works.
Like the other parallel algorithms, taskPool.reduce() executes the
functions in parallel by using elements in different tasks. Each task
works on the elements that it is assigned to and calculates a result
that corresponds to the elements of that task. Since reduce() is called
with only a single initial value, every task must use that same initial
value to initialize its own result (the parameter 0 above).
The final values of the results that each task produces are themselves
used in the same result calculation one last time. These final
calculations are executed sequentially, not in parallel. For that
reason, taskPool.reduce() may execute slower in short examples as in
this chapter as will be observed in the following output.
The fact that the same initial value is used for all of the tasks,
effectively being used in the calculations multiple times,
taskPool.reduce() may calculate a result that is different from what
std.algorithm.reduce() calculates. For that reason, the initial value
must be the identity value for the calculation that is being performed,
e.g. the 0 in this example which does not have any effect in addition.
Additionally, as the results are used by the same functions one last
time in the sequential calculations, the types of the parameters that
the functions take must be compatible with the types of the values that
the functions return.
</quote>
So, since the result type is double, the function must be able to take
(double, double) for those final sequential calculations.
Ali
More information about the Digitalmars-d-learn
mailing list