我找到了this suite of benchmarks比较跨语言的并行/分布式处理概念。
我查看了 .NET TPL 基准测试的代码,发现它有点奇怪,然后继续调试它。
看来我们有一个任务与主任务并行运行,并且如果我理解正确的话,它只对所有同步和递归结果执行异步减少(聚合)。
源代码是here :
long limit = 1000000;
var x3 = Task.Run( () => skynetTpl( 0, limit, 10 ) );
...
static void skynetTplRecursion( ITargetBlock<long> src, long num, long size, long div )
{
if( size == 1 )
{
src.SendAsync( num );
return;
}
for( var i = 0; i < div; i++ )
{
var sub_num = num + i * ( size / div );
skynetTplRecursion( src, sub_num, size / div, div );
}
}
static async Task<long> skynetTpl( long num, long size, long div )
{
BatchBlock<long> source = new BatchBlock<long>( 1024 );
long sum = 0;
ActionBlock<long[]> actAggregate = new ActionBlock<long[]>( vals => sum += vals.Sum(),
new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 1, SingleProducerConstrained = true } );
source.LinkTo( actAggregate, new DataflowLinkOptions() { PropagateCompletion = true } );
skynetTplRecursion( source, num, size, div );
source.Complete();
await actAggregate.Completion;
return sum;
}
我的理解正确吗?如果不是,为什么?
更新:
存储库作者所述的代码目标:
Creates an actor (goroutine, whatever), which spawns 10 new actors, each of them spawns 10 more actors, etc. until one million actors are created on the final level. Then, each of them returns back its ordinal number (from 0 to 999999), which are summed on the previous level and sent back upstream, until reaching the root actor. (The answer should be 499999500000).
最佳答案
是的,你说得对。所有递归代码在单个线程上同步运行。还有另一个计算与此并行运行:对 ActionBlock
中的数组求和。
这与代码的描述不符。
关于c# - skynet 基准测试中的 TPL 样本并非真正并行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482762/