天网基准测试中的 TPL 样本不是真正平行的吗?

TPL sample on skynet benchmarks not really parallel?

我发现 this suite of benchmarks 比较 parallel/distributed 跨语言处理概念。

我查看了 .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;
}

我的理解对吗?如果不是,为什么?

更新:

代码库作者所述的 objective 代码:

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.

中的数组求和

这与代码描述不符。