web-dev-qa-db-fra.com

Comment faire en sorte que R utilise tous les processeurs?

J'ai un ordinateur portable quad-core sous Windows XP, mais le gestionnaire de tâches R ne semble utiliser qu'un processeur à la fois. Comment faire en sorte que R utilise les quatre processeurs et accélère mes programmes R?

30
David Smith

J'ai un système de base que j'utilise où je parallélise mes programmes sur les boucles "pour". Cette méthode est simple une fois que vous avez compris ce qui doit être fait. Cela ne fonctionne que pour l'informatique locale, mais cela semble être ce que vous recherchez.

Vous aurez besoin de ces bibliothèques installées:

library("parallel")
library("foreach")
library("doParallel")

Vous devez d’abord créer votre cluster informatique. Je fais habituellement d'autres choses en exécutant des programmes parallèles, alors j'aime en laisser un ouvert. La fonction "detectCores" retournera le nombre de cœurs de votre ordinateur.

cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)

Ensuite, appelez votre boucle for avec la commande "foreach", avec l'opérateur% dopar%. J'utilise toujours un wrapper "try" pour m'assurer que toutes les itérations où les opérations échouent sont ignorées, et ne perturbent pas les données sinon bonnes. Vous devrez spécifier le paramètre ".combine" et transmettre les packages nécessaires à la boucle. Notez que "i" est défini avec un signe égal, pas un opérateur "in"!

data = foreach(i = 1:length(filenames), .packages = c("ncdf","chron","stats"),
               .combine = rbind) %dopar% {
  try({
       # your operations; line 1...
       # your operations; line 2...
       # your output
     })
}

Une fois que vous avez terminé, nettoyez avec:

stopCluster(cl)
42
hangmanwa7id

La vue des tâches CRAN sur le calcul haute performance avec R répertorie plusieurs options. XP est une restriction, mais vous obtenez toujours quelque chose comme snow pour utiliser des sockets en quelques minutes.

29
Dirk Eddelbuettel

À partir de la version 2.15, R prend désormais en charge les calculs multi-cœur de manière native. Il suffit de charger le paquet parallèle

library("parallel")

et consultez la vignette associée

vignette("parallel")
15
csgillespie

J'entends dire que REvolution R prend en charge un meilleur multi-threading que la version CRAN typique de R et que REvolution prend également en charge la version 64 bits R dans Windows. J'envisageais d'acheter un exemplaire, mais je trouvais leur prix opaque. Il n'y a pas de liste de prix sur leur site web. Très étrange. 

7
JD Long

Je crois que le paquetage multicore fonctionne sous XP. Il offre une capacité de base multi-processus, notamment en proposant un remplacement immédiat pour lapply() et un moyen simple d'évaluer une expression dans un nouveau thread (mcparallel()).

6
Peter M

Sous Windows, je pense que la meilleure façon de procéder serait probablement de foreach et de la neige, comme l’a dit David Smith.

Cependant, les systèmes Unix/Linux peuvent effectuer des calculs en utilisant plusieurs processus avec le paquetage «multicœurs». Il fournit une fonction de haut niveau, "mclapply", qui effectue une compréhension de liste sur plusieurs cœurs. Un avantage du paquetage «multicœur» est que chaque processeur reçoit une copie privée de l'environnement global qu'il peut modifier. Initialement, cette copie est juste un pointeur sur l'environnement global, ce qui rend le partage de variable extrêmement rapide si l'environnement global est traité en lecture seule.

Rmpi nécessite que les données soient explicitement transférées entre les processus R au lieu de fonctionner avec l'approche de fermeture «multicœur».

- Dan

2
ephpostfacto

Si vous effectuez de nombreuses opérations de matrice et que vous utilisez Windows, vous pouvez installer revolutionanalytics.com/revolution-r-open gratuitement, et celui-ci est livré avec les bibliothèques intel MKL qui vous permettent d'effectuer des opérations de matrice multithread. Sous Windows, si vous prenez les fichiers libiomp5md.dll, Rblas.dll et Rlapack.dll de cette installation et que vous écrasez ceux de la version R que vous souhaitez utiliser, vous obtiendrez des opérations matricielles multithread pour les opérations matricielles). Ou vous pouvez utiliser le fichier Atlas Rblas.dll de prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 , qui fonctionne également sur 64 bits R et est presque aussi rapide que celui de MKL. J'ai trouvé que c'était la meilleure chose à faire pour augmenter considérablement les performances de R sur les systèmes Windows. Vous ne savez pas pourquoi elles ne sont pas standard en fait sur les installations R Windows. 

Sous Windows, le multithreading n’est malheureusement pas bien pris en charge dans R (à moins que vous utilisiez OpenMP via Rcpp ) et la parallélisation disponible sur SOCKET sur les systèmes Windows, par exemple. via package parallel, est très inefficace. Sur les systèmes POSIX, les choses vont mieux car vous pouvez utiliser le bifurcage. (package multicore il y a je crois le plus efficace). Vous pouvez également essayer d'utiliser le package Rdsm pour le multithreading dans un modèle de mémoire partagée - j'ai une version sur mon github qui comporte un indicateur non flagged -unix et qui devrait également fonctionner sous Windows (Windows antérieur n'était pas pris en charge en tant que dépendance bigmemory fonctionne pas sur Windows, mais maintenant il semble que ça marche):

library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)
0
Tom Wenseleers