3 回答

TA貢獻(xiàn)2065條經(jīng)驗 獲得超14個贊
并行運行工作會產(chǎn)生開銷。只有當(dāng)您在工作節(jié)點上觸發(fā)的作業(yè)花費大量時間時,并行化才能提高整體性能。當(dāng)單個作業(yè)只需幾毫秒時,不斷解雇作業(yè)的開銷將降低整體性能。訣竅是在節(jié)點上劃分工作,使作業(yè)足夠長,比如說至少幾秒鐘。我使用它可以同時運行六個Fortran模型,但是這些單獨的模型運行需要幾個小時,幾乎可以消除開銷的影響。
請注意,我沒有運行您的示例,但是當(dāng)parallization比順序運行花費更長時間時,我上面描述的情況通常是個問題。

TA貢獻(xiàn)1890條經(jīng)驗 獲得超9個贊
這些差異可歸因于1)通信開銷(特別是如果跨節(jié)點運行)和2)性能開銷(例如,與啟動并行化相比,您的工作不是那么密集)。通常,如果您正在并行化的任務(wù)并不那么耗時,那么您將發(fā)現(xiàn)并行化并沒有太大的影響(這在大型數(shù)據(jù)集中非常明顯。
即使這可能不能直接回答您的基準(zhǔn)測試,但我希望這應(yīng)該是相當(dāng)簡單的并且可以與之相關(guān)。作為一個例子,在這里,我建立一個data.frame與1e6具有行1e4唯一的列g(shù)roup項,并在列中的某些值val。然后我plyr在parallel使用doMC和不使用并行化時運行。
df <- data.frame(group = as.factor(sample(1:1e4, 1e6, replace = T)),
val = sample(1:10, 1e6, replace = T))
> head(df)
group val
# 1 8498 8
# 2 5253 6
# 3 1495 1
# 4 7362 9
# 5 2344 6
# 6 5602 9
> dim(df)
# [1] 1000000 2
require(plyr)
require(doMC)
registerDoMC(20) # 20 processors
# parallelisation using doMC + plyr
P.PLYR <- function() {
o1 <- ddply(df, .(group), function(x) sum(x$val), .parallel = TRUE)
}
# no parallelisation
PLYR <- function() {
o2 <- ddply(df, .(group), function(x) sum(x$val), .parallel = FALSE)
}
require(rbenchmark)
benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")
test replications elapsed relative user.self sys.self user.child sys.child
2 PLYR() 2 8.925 1.000 8.865 0.068 0.000 0.000
1 P.PLYR() 2 30.637 3.433 15.841 13.945 8.944 38.858
正如您所看到的,并行版本的plyr運行速度慢了3.5倍
現(xiàn)在,讓我使用相同的data.frame,但不是計算sum,讓我構(gòu)建一個更苛刻的功能,比如說median(.) * median(rnorm(1e4)((無意義,是的):
你會看到潮汐開始轉(zhuǎn)變:
# parallelisation using doMC + plyr
P.PLYR <- function() {
o1 <- ddply(df, .(group), function(x)
median(x$val) * median(rnorm(1e4)), .parallel = TRUE)
}
# no parallelisation
PLYR <- function() {
o2 <- ddply(df, .(group), function(x)
median(x$val) * median(rnorm(1e4)), .parallel = FALSE)
}
> benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")
test replications elapsed relative user.self sys.self user.child sys.child
1 P.PLYR() 2 41.911 1.000 15.265 15.369 141.585 34.254
2 PLYR() 2 73.417 1.752 73.372 0.052 0.000 0.000
這里,并行版本比非并行版本1.752 times 更快。
編輯:關(guān)注 @Paul的評論,我剛剛實施了一個小延遲Sys.sleep()。當(dāng)然結(jié)果很明顯。但僅僅為了完整起見,這是20 * 2 data.frame的結(jié)果:
df <- data.frame(group=sample(letters[1:5], 20, replace=T), val=sample(20))
# parallelisation using doMC + plyr
P.PLYR <- function() {
o1 <- ddply(df, .(group), function(x) {
Sys.sleep(2)
median(x$val)
}, .parallel = TRUE)
}
# no parallelisation
PLYR <- function() {
o2 <- ddply(df, .(group), function(x) {
Sys.sleep(2)
median(x$val)
}, .parallel = FALSE)
}
> benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")
# test replications elapsed relative user.self sys.self user.child sys.child
# 1 P.PLYR() 2 4.116 1.000 0.056 0.056 0.024 0.04
# 2 PLYR() 2 20.050 4.871 0.028 0.000 0.000 0.00
這里的差異并不令人驚訝。
- 3 回答
- 0 關(guān)注
- 806 瀏覽
添加回答
舉報