2

我正在运行一个非常并行的软件。我需要运行大约 400 个完全不相互依赖的命令,所以我只是将它们分叉出来,并希望拥有更多的 CPU 意味着每单位时间执行更多的进程。

代码:

foreach cmd ($CMD_LIST)
    $cmd &    #fork it off
end

很简单。这是我的测试结果:

在 1 个 CPU 上,这需要 1006 秒,即 16 分 46 秒。

使用 10 个 CPU,这需要 600 秒或 10 分钟!

为什么不将花费的时间(大约)除以 10?感觉这里被骗了=(

编辑 - 当然,我愿意提供您想知道的其他详细信息,只是不确定什么是相关的,因为用最简单的术语来说,这就是我正在做的事情。

4

1 回答 1

3

您假设您的进程是 100% 受 CPU 限制的。

如果您的进程执行任何磁盘或网络 I/O,瓶颈将出现在那些无法并行化的操作上(例如,一个进程将以 100k/s 的速度下载文件,2 个进程以 50k/s 的速度下载文件,因此您不会看到任何根本没有改进,此外,由于开销,您可能会遇到性能下降)。

请参阅:Amdahl's_law - 这允许您估计并行化任务时的性能改进,知道可并行部分和不可并行部分之间的比例)

于 2012-11-06T22:49:29.013 回答