【问题标题】:Measuring time for a streamed, parallelized system测量流式并行系统的时间
【发布时间】:2018-08-30 12:27:34
【问题描述】:

在标准设置中,一个模块运行多个线程, 我们可以使用实时(也称为挂钟时间)和线程时间(模块使用的所有线程所花费的总时间)对程序进行计时。 如果实时时间很低,那么我们就没有问题。 程序很快完成,无需优化。 但是,如果实时性很高,我们想降低它,但我们不知道是什么让程序变慢:算法的效率或并行化。 现在,我们可以使用线程时间来查看时间用在了哪些地方。 如果线程时间较短,则需要优化并行化。 如果线程时间较长,则需要优化算法。

现在,这是众所周知的,并且已经在某种程度上被提及 What do 'real', 'user' and 'sys' mean in the output of time(1)?

我们在不同的环境中运行我们的程序。 我们有大量的数据,所以我们需要经常从磁盘保存和加载数据,因为我们不能同时将它们全部保存在内存中。 为了尽可能避免 IO,我们一次通过多个模块流式传输一个数据点。 举个例子来说明:我们有两个模块 A 和 B,还有一些数据 D。 数据是数据点 d1, d2, ... 的集合。 然后我们的管道被定义为:

disk -> d1 -> A -> d1' -> B -> d1'' -> disk
disk -> d2 -> A -> d2' -> B -> d2'' -> disk

等等。

现在,要添加一个额外的层,我们发现模块 B 很慢,所以我们将它并行化,它非常有效。 ...如果不是因为我们不能再依赖我们的实时测量。 以前,我们为每个模块设置了一个计时器,该计时器在计算给定数据点之前启动并在之后暂停它。 现在,我们在 A 和 B 同时运行时测量它们的实时时间。

问题

是否有一种方法可以测量流式并行系统的时间,从而可以推断优化的位置,以及是关注算法的效率还是并行化?

【问题讨论】:

  • 模块 B 是如何并行化的?该模块是用哪种语言编写的?我不是 unix 专家,但我经常阅读有关 Valgrind 的文章。 valgrind.org 是分析事物的最佳工具。

标签: multithreading architecture system timing


【解决方案1】:

虽然管道增加了很多价值,但它们的一个错误问题是pipeline stalls 的识别和修复。造成这种情况的原因有很多,一个是各个阶段的速度不同。例如(比如说)第一阶段运行得更快并且每秒产生数据,但是如果第二阶段很慢并且不能每秒消耗数据,那么队列将在阶段交界处建立或者第一阶段将停止/停止直到第二阶段阶段完成处理以前的数据。

根据实施情况,可以通过监控接口队列或阶段的空闲/等待时间来完成检测。补救措施几乎总是有多个较慢类型的并发阶段。另一种解决方案是将慢速阶段实际拆分为两个连续但较快的阶段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2021-02-11
    • 2022-11-16
    相关资源
    最近更新 更多