2010-04-13 16 views
85

Il calcolo generico su unità di elaborazione grafica (GPGPU) è un concetto molto interessante per sfruttare la potenza della GPU per qualsiasi tipo di elaborazione.Il miglior approccio per GPGPU/CUDA/OpenCL in Java?

Mi piacerebbe utilizzare GPGPU per l'elaborazione di immagini, particelle e operazioni geometriche veloci.

In questo momento, sembra che i due contendenti in questo spazio siano CUDA e OpenCL. Mi piacerebbe sapere:

  • OpenCL è ancora utilizzabile da Java su Windows/Mac?
  • Quali sono le modalità di interfaccia delle librerie per OpenCL/CUDA?
  • È possibile utilizzare direttamente JNA?
  • Sto dimenticando qualcosa?

Qualsiasi esperienza/esempi/storie di guerra reali sono apprezzati.

+1

Immagino che programmare la GPU in Java sarebbe difficile, considerando quanto uso i puntatori nella programmazione CUDA. Non so se ci sarebbe stato molto vantaggio nell'usare Java nella programmazione dei dispositivi, dal momento che è improbabile che siano implementate funzionalità/librerie Java complete che differenziano Java da C++ – Anycorn

+2

Ho visto alcune dimostrazioni di Java impressionanti che hanno utilizzato GLSL e probabilmente CUDA, quindi è certamente possibile. – Frederik

+1

Hai controllato jcuda.org e jocl.org? – bakkal

risposta

56

per quanto ne so, JavaCL/OpenCL4Java è l'unico OpenCL vincolante che è disponibile su tutte le piattaforme in questo momento (compreso MacOS X, FreeBSD, Linux, Windows, Solaris, il tutto in Intel 32, 64 bit e varianti ppc, grazie al suo uso di JNA).

Ha demo che in realtà funzionano bene da Java Web Start, almeno su Mac e Windows (per evitare crash casuali su Linux, si veda this wiki page, come questo Particles Demo.

Inoltre è dotato di un paio di utenze (. GPGPU generazione di numeri casuali, parallela riduzione di base, algebra lineare) e una Scala DSL

Infine, è le associazioni più antiche disponibili (dal giugno 2009) e it has an active user community

(Disclaimer:. sono JavaCL s' autore: -))

+0

Oh, ero così eccitato per il JNLP, ma a quanto pare non mi piace il mio macbook. Così tanto per la piattaforma incrociata. – Karl

+4

@Karl Oh scusate, ho rotto il JNLP (il JAR ha cambiato di recente i nomi)! Ora è corretto, spero che tu ci riprovi ... (e in termini di cross-platform: è stato interrotto in modo coerente su tutte le piattaforme ;-)) – zOlive

+3

Il recente restringimento della sicurezza di Java 7 causa il mancato avvio di Particle Demo Web Start con un eccezione. –

11

Bene CUDA è una modifica di C, per scrivere il kernel CUDA devi codificare in C, quindi compilare in forma eseguibile con il compilatore CUDA di nvidia. Il codice nativo prodotto potrebbe quindi essere collegato a Java utilizzando JNI. Quindi tecnicamente non puoi scrivere il codice del kernel da Java. C'è JCUDA http://www.jcuda.de/jcuda/JCuda.html, fornisce le apis di cuda per la memoria generale/gestione dei dispositivi e alcuni metodi Java implementati in CUDA e JNI avvolti (FFT, alcuni metodi di algebra lineare .. ecc. Ecc.).

D'altra parte OpenCL è solo un'API. I kernel OpenCL sono semplici stringhe passate all'API, quindi con OpenCL da Java dovresti essere in grado di specificare i tuoi kernel. Il binding OpenCL per java può essere trovato qui http://www.jocl.org/.

+2

se JNA (http://jna.dev.java.net) è supportato sulla tua piattaforma, vorrei utilizzalo per invocare il codice nativo, in quanto è molto meno impegnativo rispetto alla codifica di una libreria JNI. – mdma

11

Ho usato JOCL e sono molto soddisfatto.

Lo svantaggio principale di OpenCL su CUDA (almeno per me) è la mancanza di librerie disponibili (Thrust, CUDPP, ecc.). Tuttavia CUDA può essere facilmente portato su OpenCL, e osservando come funzionano queste librerie (algoritmi, strategie, ecc.) È davvero molto bello, dato che si impara molto con esso.

32

Si può anche considerare Aparapi. Consente di scrivere il codice in Java e tenterà di convertire bytecode in OpenCL in fase di runtime.

Informazioni complete. Sono lo sviluppatore di Aparapi.

+0

L'aparapi è ancora mantenuto? –

+0

@MrJedi: Penso di sì, l'ultimo impegno su github è solo di alcuni giorni: https://github.com/aparapi/aparapi –

+0

È "un po 'mantenuto";) Sono un manutentore. – barneypitt

7

so che è tardi, ma dare un'occhiata a questo: https://github.com/pcpratts/rootbeer1

Non ho lavorato con esso, ma sembra molto più facile da usare rispetto ad altre soluzioni.

Dalla pagina del progetto:

Rootbeer è più avanzato di CUDA o OpenCL linguaggio Java Associazioni. Con i binding lo sviluppatore deve serializzare complessi grafici di oggetti in matrici di tipi primitivi. Con Rootbeer questo viene fatto automaticamente. Anche con i binding di linguaggio, lo sviluppatore deve scrivere il kernel GPU in CUDA o OpenCL. Con Rootbeer viene eseguita un'analisi statica del Bytecode Java (utilizzando Fuliggine) e il codice CUDA viene generato automaticamente.

2

Posso anche raccomandare JOCL by jogamp.org, funziona su Linux, Mac e Windows. CONRAD, ad esempio, utilizza pesantemente OpenCL in combinazione con JOCL.

-2

In seguito agli ultimi successi di Google, suppongo che la tensorflow è l'approccio migliore per il calcolo su GPU a tutti, non solo OpenCL. Tensorflow supporta i calcoli OpenCL e CUDA con la stessa API.

Problemi correlati