2015-07-19 12 views
8

È possibile utilizzare OpenCL ma con codice R? Non ho ancora una buona conoscenza della programmazione di OpenCL e GPU. Ad esempio, supponiamo di avere il seguente codice R:Esempio OpenCL semplice in R con codice R?

aaa <- function(x) mean(rnorm(1000000)) 

sapply(1:10, aaa) 

mi piace che posso tipo di utilizzare mclapply come sostituto DROPIN per lapply. C'è un modo per farlo per OpenCL? O usare OpenCL come backend per mclapply? Sto indovinando questo non è possibile perché non sono stato in grado di trovare un esempio, così ho due domande:

  1. È questo possibile ed in caso affermativo si può dare un esempio completo con la mia funzione aaa sopra?
  2. Se questo non è possibile, puoi spiegare perché? Non so molto sulla programmazione della GPU. Visualizzo GPU proprio come le CPU, quindi perché non posso eseguire il codice R in parallelo?

risposta

2

Non è possibile perché le GPU funzionano in modo diverso rispetto alle CPU, il che significa che non è possibile fornire loro le stesse istruzioni fornite a una CPU.

Nvidia mette in scena uno spettacolo con this video di descrizione della differenza tra elaborazione CPU e GPU. Essenzialmente la differenza è che le GPU hanno in genere, per ordini di grandezza, più core rispetto alle CPU.

L'esempio è uno che può essere esteso al codice GPU perché è altamente parallelo.

Ecco po 'di codice per creare numeri casuali (anche se non sono distribuiti normalmente) http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html

Dopo aver creato i numeri casuali li si potrebbe rompere in pezzi e poi sommare ciascuno dei pezzi in parallelo e quindi aggiungere il somme dei pezzi per ottenere la somma complessiva Is it possible to run the sum computation in parallel in OpenCL?

Mi rendo conto che il tuo codice renderebbe il vettore numero casuale e la sua somma in serie e parallelo quell'operazione 10 volte ma con elaborazione GPU, avendo solo 10 compiti non è molto efficiente dal momento che lasceresti inutilizzati tanti core.

3

Vorrei iniziare osservando lo High Performance Computing CRAN task view, in particolare la sezione Parallel computing: GPU.

Esistono numerosi pacchetti elencati che sfruttano GPGPU per attività specifiche che si prestano a una grande parallelizzazione (ad esempio gputools, HiPLARM). Molti di questi usano CUDA di NVIDIA piuttosto che OpenCL.

C'è anche un pacchetto più generico OpenCL, ma richiede di imparare a scrivere codice OpenCL te stesso, e si limita a fornire un'interfaccia per quel codice da R.