Ho un laptop quad-core con Windows XP, ma guardando Task Manager R sembra sempre che usi un processore alla volta. Come posso far sì che R usi tutti e quattro i processori e acceleri i miei programmi R?Come rendere R utilizzare tutti i processori?
risposta
Ho sentito dire che REvolution R supporta il multi-threading migliore quindi la versione CRAN tipica di R e REvolution supporta anche 64 bit R in Windows. Ho pensato di acquistare una copia, ma ho trovato i loro prezzi opachi. Non c'è un listino prezzi sul loro sito web. Molto strano.
Se devi chiedere il prezzo, non puoi permetterlo. – Buhb
I prezzi accademici sono elencati qui: http://www.revolution-computing.com/industry/academic.php. –
È stato acquistato da Microsoft ora e non esiste più una versione accademica gratuita. Ma puoi installare http://www.revolutionanalytics.com/revolution-r-open gratuitamente, e anche con le librerie intel MKL. Su Windows se si prelevano i file libiomp5md.dll, Rblas.dll e Rlapack.dll da quella installazione e si sovrascrivono quelli in qualsiasi installazione di R che si desidera utilizzare, si avranno operazioni con matrice multithread (tipicamente 10-20 x speedup). Oppure l'Atlas Rblas.dll di https://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64/ als funziona ed è quasi altrettanto veloce. –
Il CRAN Task View on High-Performance Compting with R elenca diverse opzioni. XP è una restrizione, ma si ottiene comunque qualcosa come snow per lavorare usando i socket in pochi minuti.
Su Windows, credo che il modo migliore per farlo sarebbe probabilmente con foreach e neve, come ha detto David Smith.
Tuttavia, i sistemi basati su Unix/Linux possono calcolare utilizzando più processi con il pacchetto "multicore". Fornisce una funzione di alto livello, 'mclapply', che esegue una comprensione delle liste su più core. Un vantaggio del pacchetto "multicore" è che ogni processore riceve una copia privata dell'ambiente globale che può modificare. Inizialmente, questa copia è solo un puntatore all'ambiente globale, rendendo estremamente rapida la condivisione della variabile se l'ambiente globale viene considerato di sola lettura.
Rmpi richiede che i dati vengano trasferiti esplicitamente tra processi R anziché funzionare con l'approccio di chiusura "multicore".
- Dan
credo che il pacchetto multicore
funziona su XP. Fornisce alcune funzionalità di multi-processo di base, in particolare offrendo una sostituzione drop-in per lapply()
e un modo semplice per valutare un'espressione in una nuova discussione (mcparallel()
).
il drop in sostituzione di 'lapply()' è chiamato 'mclapply()'. È davvero così semplice: i processori N sono N volte più veloci (purché tutto il carico pesante sia all'interno della funzione che viene applicata) –
il pacchetto multicore richiede un SO conforme a POSIX, quindi non funziona in Win. Puoi leggere i requisiti qui: http://cran.r-project.org/web/packages/multicore/index.html –
'doSMP' fornisce funzionalità simili a' multicore' su Windows, ed è [disponibile su CRAN] (http://cran.r-project.org/web/packages/doSMP/index.html) –
A partire dalla versione 2.15, ora R viene fornito con il supporto nativo per calcoli multi-core. Basta caricare il pacchetto parallelo
library("parallel")
e controllare la vignetta associata
vignette("parallel")
Bootstrap tramite l'avvio del pacchetto anche il mio interesse e viene spiegato in quel file. – MistereeDevlord
@MistereeDevlord Ah grazie. Non sono sicuro di quanto mi sia mancato. – csgillespie
Ho un sistema di base che uso dove ho parallelizzare i miei programmi sulle "per" loop. Questo metodo è semplice una volta capito cosa deve essere fatto. Funziona solo per l'informatica locale, ma sembra essere quello che cerchi.
Avrete bisogno di queste librerie installate:
library("parallel")
library("foreach")
library("doParallel")
Per prima cosa è necessario creare il cluster di calcolo. Di solito faccio altro mentre eseguo programmi paralleli, quindi mi piace lasciarne uno aperto. La funzione "detectCores" restituirà il numero di core nel tuo computer.
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)
Quindi, chiamare il ciclo for con il comando "foreach", insieme con l'operatore% dopar%. Io uso sempre un wrapper "try" per assicurarmi che tutte le iterazioni in cui le operazioni falliscono vengano scartate e non interrompano i dati altrimenti buoni. Dovrai specificare il parametro ".combine" e passare tutti i pacchetti necessari nel ciclo. Nota che "i" è definito con un segno di uguale, non con un operatore di "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 volta che hai finito, pulire con:
stopCluster(cl)
Se si fanno un sacco di operazioni con le matrici e si utilizza Windows è possibile installare revolutionanalytics.com/revolution-r-open gratuitamente, e questo viene fornito con il librerie intel MKL che consentono di eseguire operazioni con matrice multithread. Su Windows se si prendono i file libiomp5md.dll, Rblas.dll e Rlapack.dll da quella installazione e si sovrascrivono quelli in qualsiasi versione di R che si desidera utilizzare si avranno operazioni con matrice multithread (in genere si ottiene un 10-20 x speedup per operazioni con matrici). Oppure puoi utilizzare Atlas Rblas.dll dal prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 che funziona anche su 64 bit R e sono quasi veloci quanto quelli MKL. Ho trovato questa la cosa più semplice da fare per aumentare drasticamente le prestazioni di R sui sistemi Windows. Non sono sicuro del motivo per cui non vengono di serie sulle installazioni di Windows.
Su Windows, il multithreading, purtroppo, non è ben supportato in R (a meno che non si utilizza OpenMP via Rcpp) e la disposizione 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. (pacchetto multicore
c'è credo che la più efficiente). Si potrebbe anche provare a usare il pacchetto Rdsm
per il multithreading all'interno di un modello di memoria condivisa - Ho una versione sul mio github che ha un flag solo ungolato -unix e dovrebbe funzionare anche su Windows (in precedenza Windows non era supportato come dipendenza bigmemory
't funziona su Windows, ma ora sembra lo fa):
library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)
sulla base dei commenti qui sotto e una ricerca linkedin del tuo nome ... sono abbastanza sicuro che è la pubblicità spudorata (https: // www .linkedin.com/in/dmsmith). Hai risposto alla tua stessa domanda con un prodotto a pagamento in cui sei coinvolto nello sviluppo ... dai ... –