c# - skynet 基准测试中的 TPL 样本并非真正并行?

标签 c# .net parallel-processing task-parallel-library

我找到了this suite of benchmarks比较跨语言的并行/分布式处理概念。

我查看了 .NET TPL 基准测试的代码,发现它有点奇怪,然后继续调试它。

debugging threads

看来我们有一个任务与主任务并行运行,并且如果我理解正确的话,它只对所有同步和递归结果执行异步减少(聚合)。

源代码是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/

相关文章:

c# - 在网格顶部添加新行

c# - 关于 Nullable<T> 结构的显式运算符实现的困惑

c# - 使用Sql Spatial Data(C#)找不规则多边形的 "visual"中心

c# - .Net FileWatcher 无法处理 ~80 多个文件

c# - 为什么 ConfigurationManager.GetSection "system.webServer/handlers"不可用?

c# - 从 Teltonika FM4200 读取 GPS 数据

c# - 过滤 DataGridView

c++ - 为什么循环变量必须并行签名?

sql-server-2008 - 并行联合... SQL Server 会这样做吗?

c# - 运行异步代码的 Windows 服务不等待工作完成