3

我正在学习 R 中的并行计算,我发现这发生在我的实验中。

简而言之,在下面的示例中,为什么大多数 'user' in 的值都t小于 in mc_t?我的机器有 32GB 内存,2 个 4 核 CPU 和 8 个超线程。

system.time({t = lapply(1:4,function(i) {
    m = matrix(1:10^6,ncol=100)
    t = system.time({
        m%*%t(m)
    })
    return(t)
})})


library(multicore)
system.time({
    mc_t = mclapply(1:4,function(m){
        m = matrix(1:10^6,ncol=100)
        t = system.time({
            m%*%t(m)
        })
        return(t)
    },mc.cores=4)
})

> t
[[1]]
user  system elapsed
11.136   0.548  11.703

[[2]]
user  system elapsed
11.533   0.548  12.098

[[3]]
user  system elapsed
11.665   0.432  12.115

[[4]]
user  system elapsed
11.580   0.512  12.115

> mc_t
[[1]]
user  system elapsed
16.677   0.496  17.199

[[2]]
user  system elapsed
16.741   0.428  17.198

[[3]]
user  system elapsed
16.653   0.520  17.198

[[4]]
user  system elapsed
11.056   0.444  11.520

并且sessionInfo()

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8       LC_NAME=C
[9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
    [1] multicore_0.1-7

澄清:对不起,我的描述可能模棱两可。我知道并行对于整个任务来说仍然更快。但是,时间计数器只是在计算函数中,mclapply没有考虑每个子进程的设置开销时间。所以我仍然很困惑为什么这个纯粹的计算(即m%*%t(m))步慢。

4

2 回答 2

1

我猜时间差异是由于内核之间的资源争用造成的,可能是内存或缓存,特别是如果您的 CPU 有一个在内核之间共享的缓存。即使有足够的主内存,也可能存在争用访问它,导致性能无法随内核数量线性扩展。

请注意,%*%如果您的 R 安装使用 MKL 或 ATLAS 等多线程数学库,则运算符将使用多个内核。通过在此之上使用多个进程,您可能拥有比内核更多的线程,从而损害您的性能。

于 2014-02-12T18:07:34.767 回答
0

并行算法的理论最佳可能加速计算为

S(n) = T(1) / T(n) = 1 / (P + (1 - P) / n)

其中T(n)是使用 n 个并行进程执行任务所花费的时间,P是严格串行的整个任务的比例。使用这个公式,假设一个任务在一个处理器上执行需要 10 秒,让我们计算 4 个处理器的并行算法的理论上可能的最佳加速。

1 / (0.5 + (1-0.5)/4) = 1.6x

使用此信息,我们可以说每个处理器都比算法的一个处理器版本慢,因为速度提升不到 4 倍。但这就是它的工作原理。这种情况称为阿姆达尔定律。阿姆达尔定律为我们提供了最大可能加速的估计值,它没有考虑开销。您可以在此处进一步阅读。

为了计算时间而不是加速率,我们使用公式

T(n) = T(1)*(P + (1-P)/n)

让我们计算在单个处理器上需要 10 秒的任务的最佳运行时间。

T(4) = 10 * (0.5 + (1 - 0.5)/4) = 6.25
于 2019-01-18T14:05:21.317 回答