2009-09-08 10 views
30

Tengo un equipo portátil de cuatro núcleos con Windows XP, pero al mirar el Administrador de tareas R, parece que solo utiliza un procesador a la vez. ¿Cómo puedo hacer que R use los cuatro procesadores y acelere mis programas R?¿Cómo hacer que R use todos los procesadores?

+7

Basado en los comentarios a continuación y una búsqueda en linkedin de su nombre ... Estoy bastante seguro de que es una publicidad desvergonzada (https: // www .linkedin.com/in/dmsmith). Usted respondió su propia pregunta con un producto pagado en el que está involucrado en el desarrollo ... vamos ... –

Respuesta

7

Oigo decir que REvolution R es compatible con un multihilo mejor que la versión típica CRAN de R y REvolution también admite 64 bit R en Windows. He estado considerando comprar una copia, pero me pareció opaca su fijación de precios. No hay una lista de precios en su sitio web. Muy raro.

+9

Si tiene que preguntar el precio, no puede pagarlo. – Buhb

+3

El precio académico se detalla aquí: http://www.revolution-computing.com/industry/academic.php. –

+2

Ha sido comprado por Microsoft ahora, y ya no hay una versión académica gratuita. Pero puede instalar http://www.revolutionanalytics.com/revolution-r-open de forma gratuita, y también viene con las bibliotecas Intel MKL. En Windows, si toma los archivos libiomp5md.dll, Rblas.dll y Rlapack.dll de esa instalación y sobrescribe los que están en la instalación de R que desee utilizar, tendrá operaciones de matriz multiproceso (por lo general 10-20 x aceleración). O el Atlas Rblas.dll de https://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64/ als funciona y es casi igual de rápido. –

2

En Windows, creo que la mejor manera de hacerlo sería probablemente con foreach y nieve como dijo David Smith.

Sin embargo, los sistemas basados ​​en Unix/Linux pueden calcular utilizando múltiples procesos con el paquete 'multinúcleo'. Proporciona una función de alto nivel, 'mclapply', que realiza una lista de comprensión en múltiples núcleos. Una ventaja del paquete 'multinúcleo' es que cada procesador obtiene una copia privada del entorno global que puede modificar. Inicialmente, esta copia es solo un indicador del entorno global, lo que hace que el intercambio de variables sea extremadamente rápido si el entorno global se trata como de solo lectura.

Rmpi ​​requiere que los datos se transfieran explícitamente entre procesos R en lugar de trabajar con el enfoque de cierre 'multinúcleo'.

- Dan

6

creo que el paquete de multicore funciona en XP. Ofrece algunas capacidades básicas de multiprocesos, especialmente ofreciendo un reemplazo directo para lapply() y una manera simple de evaluar una expresión en un nuevo hilo (mcparallel()).

+1

la caída en reemplazo de 'lapply()' se llama 'mclapply()'. Es realmente así de simple: N procesadores son N veces más rápidos (siempre que todo el trabajo pesado esté dentro de la función que se está aplicando) –

+2

el paquete multinúcleo requiere un OS compatible con POSIX, por lo que no funciona en Win. Puede leer los requisitos aquí: http://cran.r-project.org/web/packages/multicore/index.html –

+1

'doSMP' proporciona una funcionalidad similar a' multicore' en Windows, y está [disponible en CRAN] (http://cran.r-project.org/web/packages/doSMP/index.html) –

15

A partir de la versión 2.15, R ahora viene con soporte nativo para cálculos multi-core. Sólo tiene que cargar el paquete en paralelo

library("parallel") 

y echa un vistazo a la viñeta asociado

vignette("parallel") 
+0

Bootstrapping a través del arranque del paquete también puede ser de interés y se explica en ese archivo. – MistereeDevlord

+0

@MistereeDevlord Ah gracias. No estoy seguro de cómo me perdí eso. – csgillespie

41

Tengo un sistema básico que utilizo en el que paralelizar mis programas en los bucles "for". Este método es simple una vez que comprenda lo que debe hacerse. Solo funciona para la informática local, pero parece ser lo que buscas.

Tendrá instaladas estas bibliotecas:

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

En primer lugar es necesario crear el clúster de computación. Normalmente hago otras cosas mientras ejecuto programas paralelos, así que me gusta dejar uno abierto. La función "detectarCores" devolverá la cantidad de núcleos en su computadora.

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

A continuación, llame a su bucle con el comando "foreach", junto con el operador% dopar%. Siempre utilizo un contenedor "try" para asegurarme de que las iteraciones en las que fallan las operaciones sean descartadas y no interrumpan los datos que de otra manera serían buenos. Deberá especificar el parámetro ".combine" y pasar los paquetes necesarios al ciclo. Tenga en cuenta que "i" se define con un signo igual, no con un operador "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 
    }) 
} 

Una vez que haya terminado, limpiar con:

stopCluster(cl) 
0

Si usted hace una gran cantidad de operaciones de la matriz y está utilizando Windows puede instalar revolutionanalytics.com/revolution-r-open de forma gratuita, y éste viene con el bibliotecas MKL de Intel que te permiten realizar operaciones de matriz multiproceso. En Windows, si toma los archivos libiomp5md.dll, Rblas.dll y Rlapack.dll de esa instalación y sobrescribe los de la versión R que desee usar, tendrá operaciones de matriz de subprocesos múltiples (normalmente obtendrá una aceleración de 10-20 x para operaciones de matriz). O puede utilizar el Atlas Rblas.dll desde prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 que también funciona en 64 bit R y es casi tan rápido como el MKL. Encontré que esto es lo más fácil de hacer para aumentar drásticamente el rendimiento de R en sistemas Windows. No estoy seguro de por qué no vienen como estándar en las instalaciones de R Windows.

En Windows, multihilo por desgracia no está bien apoyado en R (a menos que utilice OpenMP via Rcpp) y la disposición SOCKET-based parallelization on Windows systems, e.g. via package parallel, is very inefficient. On POSIX systems things are better as you can use forking there. (paquete de multicore Hay creo que la más eficiente). También podría intentar usar el paquete Rdsm para multihebras dentro de un modelo de memoria compartida - Tengo una versión en mi github que tiene unflagged -unix solo marca y debería funcionar también en Windows (Windows anterior no era compatible con la dependencia bigmemory supuestamente didn no funciona en Windows, pero ahora parece que sí):

library(devtools) 
devtools::install_github('tomwenseleers/Rdsm') 
library(Rdsm) 
Cuestiones relacionadas