Simple parallel foreach and summation/reduction

Chris Katko ckatko at gmail.com
Sat Sep 22 02:26:41 UTC 2018


On Saturday, 22 September 2018 at 02:13:58 UTC, Chris Katko wrote:
> On Friday, 21 September 2018 at 12:15:59 UTC, Ali Çehreli wrote:
>> On 09/21/2018 12:25 AM, Chris Katko wrote:
>>> [...]
>>
>> You can use a free-standing function as a workaround, which is 
>> included in the following chapter that explains most of 
>> std.parallelism:
>>
>>   http://ddili.org/ders/d.en/parallelism.html
>>
>> That chapter is missing e.g. the newly-added fold():
>>
>>   https://dlang.org/phobos/std_parallelism.html#.TaskPool.fold
>>
>> Ali
>
> Okay... so I've got it running. The problem is, it uses tons of 
> RAM. In fact, proportional to the working set.
>
> T test(T)(T x, T y)
> 	{
> 	return x + y;
> 	}
> 	
> double monte(T)(T x)
> 	{
> 	double v = uniform(-1F, 1F);
> 	double u = uniform(-1F, 1F);
> 	if(sqrt(v*v + u*u) < 1.0)
> 		{
> 		return 1;
> 		}else{
> 		return 0;
> 		}
> 	}
>
> 	auto taskpool = new TaskPool();
> 	sum = taskpool.reduce!(test)(
> 	taskpool.amap!monte(
> 		iota(num)
> 		)	);	
> 	taskpool.finish(true);
>
> 1000000 becomes ~8MB
> 10000000 becomes 80MB
> 100000000, I can't even run because it says "Exception: Memory 
> Allocation failed"

Also, when I don't call .finish(true) at the end, it just sits 
there forever (after running) like one of the threads won't 
terminate. Requiring a control-C. But the docs and examples don't 
seem to indicate I should need that...


More information about the Digitalmars-d-learn mailing list