Je tente de "mapper" une fonction sur un tableau. Cependant, lorsque vous essayez des fonctions simples et complexes, la version parallèle est toujours plus lente que la version sérielle. Comment puis-je améliorer les performances d'un calcul parallèle dans R?Comment puis-je effectuer une opération parallèle plus rapidement que la version série?
Exemple simple parallèle:
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
L'initialisation des clusters prend du temps. Avez-vous essayé d'initialiser votre fonction? –
Ce n'est pas une comparaison équitable, mais je l'ai juste essayé. Pas de changement substantiel. Je serais surpris si l'initialisation pouvait expliquer la différence d'ordre de grandeur. – sharoz
Je n'utilise pas beaucoup ces paquets parallèles, mais littéralement à chaque fois il y a une question sur SO pourquoi la parallélisation est plus lente que la série car la surcharge de la tâche domine la complexité de la tâche elle-même. – joran