【发布时间】: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