1

您如何确定是否值得根据代码大小对特定代码块进行并行化?下面的计算是否正确?

认为:

  • 线程池由每个 CPU 一个线程组成。
  • 执行时间为X毫秒的 CPU 绑定代码块。
  • Y = min(number of CPUs, number of concurrent requests)

所以:

  • 成本:代码复杂性、潜在错误
  • 好处:(X * Y)毫秒

我的结论是,对于XY的小值不值得并行化,其中“小”取决于您的请求必须有多响应。

4

3 回答 3

4

可以帮助您弄清楚的一件事是阿姆达尔定律

在并行计算中使用多个处理器的程序的加速受到程序的顺序部分所需的时间的限制。例如,如果一个程序需要 20 小时使用单个处理器内核,而 1 小时的特定部分不能并行化,而 19 小时(95%)的剩余有希望的部分可以并行化,那么无论我们投入多少处理器对于该程序的并行执行,最短执行时间不能少于关键的 1 小时。因此,加速被限制在 20 倍以内。

弄清楚你想在加速中实现什么,以及你实际上可以实现多少并行度,然后看看它是否值得。

于 2009-06-08T16:30:00.090 回答
1

它取决于许多因素,如代码并行化的难度、从中获得的加速(划分问题和连接结果的开销成本)以及代码在那里花费的时间量(阿姆达尔定律)

于 2009-06-08T16:30:40.947 回答
0

好吧,好处真的更多:

(X * (Y-1)) * Tc * Pf

其中 Tc 是您正在使用的线程框架的成本。没有线程框架可以完美扩展,因此使用 2x 线程最多可能是 1.9x 速度。

Pf 是完全取决于算法的并行化因素(即:您是否需要锁定,这会减慢处理速度)。

此外,它是 Y-1,因为单线程基本上假设 Y==1。

至于决定,这也是用户沮丧/期望的问题(如果他们的用户对等待某事感到恼火,这将比用户并不真正介意的任务带来更大的好处 - 这并不总是因为等待时间等 - 部分是预期)。

于 2009-06-08T16:32:48.013 回答