我試圖將一個函數「映射」到一個數組上。但是,在嘗試簡單功能和複雜功能時,並行版本總是比串行版本慢。如何提高R中的並行計算性能?如何比串行版本更快地進行並行操作?
簡單平行例如:
library(parallel)
# Number of elements
arrayLength = 100
# Create data
input = 1:arrayLength
# A simple computation
foo = function(x, y) x^y - x^(y-1)
# Add complexity
iterations = 5 * 1000 * 1000
# Perform complex computation on each element
compute = function (x) {
y = x
for (i in 1:iterations) {
x = foo(x, y)
}
return(x)
}
# Parallelized compute
computeParallel = function(x) {
# Create a cluster with 1 fewer cores than are available.
cl <- makeCluster(detectCores() - 1) # 8-1 cores
# Send static vars & funcs to all cores
clusterExport(cl, c('foo', 'iterations'))
# Map
out = parSapply(cl, x, compute)
# Clean up
stopCluster(cl)
return(out)
}
system.time(out <- compute(input)) # 12 seconds using 25% of cpu
system.time(out <- computeParallel(input)) # 160 seconds using 100% of cpu
集羣的初始化需要時間。你有沒有嘗試初始化你的功能? –
這不是一個公平的比較,但我只是試了一下。沒有實質性變化。如果初始化可以解釋數量級差異,我會感到驚訝。 – sharoz
我並沒有太多的使用這些並行程序包,但字面上每次都有一個關於爲什麼並行化比串行化慢的問題,因爲分割任務的開銷主宰了任務本身的複雜性。 – joran