为什么随着核心数量的增加,运行时间会增加?
Why the elapsed time increases while the number of core increases?
我正在用 R 做多核计算。我是
这是每个计算的代码和输出。为什么经过的时间随着核心数量的增加而增加?这确实是违反直觉的。我认为随着核心数量的增加,经过的时间减少是合理的。有什么办法可以解决这个问题吗?
代码如下:
library(parallel)
detectCores()
system.time(pvec(1:1e7, sqrt, mc.cores = 1))
system.time(pvec(1:1e7, sqrt, mc.cores = 4))
system.time(pvec(1:1e7, sqrt, mc.cores = 8))
谢谢。
假设你的数据被分成N个部分。您的数据的每个部分都在 T 秒内计算。在单核架构中,您期望所有操作都将在 N x T 秒内完成。您还希望所有工作都应该在 N 核机器上完成 T 次。然而,在并行计算中,存在通信滞后,由每个单核消耗(初始化、从主向子传递数据、计算、传递结果和最终确定)。现在让通信延迟为 C 秒,为简单起见,它对所有内核都是恒定的。因此,在 N 核机器中,计算应在
中完成
T + N x C
秒,其中 T 部分用于计算,N X C 部分用于总通信。如果我们把它比作单核机器,不等式
(N x T) > (T + N x C)
至少对于我们的假设来说,应该满足于获得计算时间。如果我们简化不等式,我们可以得到
C < (N x T - T) / N
因此,如果常数通信时间不小于 (N x T - T) / N 的比率,我们就无法进行并行计算。
在您的示例中,创建、计算和通信所需的时间比函数 sqrt.
的单核计算要大
我正在用 R 做多核计算。我是
这是每个计算的代码和输出。为什么经过的时间随着核心数量的增加而增加?这确实是违反直觉的。我认为随着核心数量的增加,经过的时间减少是合理的。有什么办法可以解决这个问题吗?
代码如下:
library(parallel)
detectCores()
system.time(pvec(1:1e7, sqrt, mc.cores = 1))
system.time(pvec(1:1e7, sqrt, mc.cores = 4))
system.time(pvec(1:1e7, sqrt, mc.cores = 8))
谢谢。
假设你的数据被分成N个部分。您的数据的每个部分都在 T 秒内计算。在单核架构中,您期望所有操作都将在 N x T 秒内完成。您还希望所有工作都应该在 N 核机器上完成 T 次。然而,在并行计算中,存在通信滞后,由每个单核消耗(初始化、从主向子传递数据、计算、传递结果和最终确定)。现在让通信延迟为 C 秒,为简单起见,它对所有内核都是恒定的。因此,在 N 核机器中,计算应在
中完成T + N x C
秒,其中 T 部分用于计算,N X C 部分用于总通信。如果我们把它比作单核机器,不等式
(N x T) > (T + N x C)
至少对于我们的假设来说,应该满足于获得计算时间。如果我们简化不等式,我们可以得到
C < (N x T - T) / N
因此,如果常数通信时间不小于 (N x T - T) / N 的比率,我们就无法进行并行计算。
在您的示例中,创建、计算和通信所需的时间比函数 sqrt.
的单核计算要大