2010-04-13 17 views
85

La informática de propósito general en unidades de procesamiento de gráficos (GPGPU) es un concepto muy atractivo para aprovechar la potencia de la GPU para cualquier tipo de informática.¿El mejor enfoque para GPGPU/CUDA/OpenCL en Java?

Me encantaría usar GPGPU para el procesamiento de imágenes, partículas y operaciones geométricas rápidas.

En este momento, parece que los dos contendientes en este espacio son CUDA y OpenCL. Me gustaría saber:

  • ¿Es OpenCL utilizable desde Java en Windows/Mac?
  • ¿Cuáles son las formas de bibliotecas para interactuar con OpenCL/CUDA?
  • ¿Está usando directamente JNA una opción?
  • ¿Estoy olvidando algo?

Cualquier experiencia del mundo real/ejemplos/historias de guerra son apreciadas.

+1

Me imagino que programar GPU en Java sería difícil, teniendo en cuenta cuánto uso los punteros en la programación de cuda. No sé si hubiera mucho beneficio al usar Java en la programación de dispositivos, ya que es poco probable que tenga implementadas características/bibliotecas completas de Java que diferencien Java de C++ – Anycorn

+2

. He visto algunas demostraciones Java impresionantes que usaron GLSL y probablemente CUDA. entonces es ciertamente posible. – Frederik

+1

¿Marcó jcuda.org y jocl.org? – bakkal

Respuesta

56

yo sepa, JavaCL/OpenCL4Java es la única OpenCL vinculante que está disponible en todas las plataformas en este momento (incluyendo MacOS X, FreeBSD, Linux, Windows, Solaris, todo en Intel 32, 64 bits y variantes ppc, gracias a su uso de JNA)

Tiene demos que en realidad funcionan bien desde Java Web Start al menos en Mac y Windows (para evitar bloqueos aleatorios en Linux, consulte this wiki page, como este Particles Demo.

También viene con algunas empresas de servicios públicos (. GPGPU generación de números aleatorios, reducción paralela básica, álgebra lineal) y una Scala DSL

Por último, es los enlaces más antiguos disponibles (desde junio de 2009) y it has an active user community

(Negación:. estoy JavaCL 's autor: -))

+0

Oh, estaba tan emocionado por el JNLP, pero aparentemente no me gusta mi macbook. Tanto para plataforma cruzada. – Karl

+4

@Karl Oh, lo siento, rompí el JNLP (el JAR recientemente cambió los nombres)! Ahora está arreglado, espero que lo intentes de nuevo ... (y en varias plataformas: se rompió constantemente en todas las plataformas ;-)) – zOlive

+3

El reciente ajuste en la seguridad de Java 7 hace que Particle Demo Web Start falle con una excepción. –

11

Bien CUDA es una modificación de C, para escribir kernel CUDA debe codificar en C, y luego compilar en forma ejecutable con el compilador CUDA de nvidia. El código nativo producido podría entonces vincularse con Java utilizando JNI. Entonces, técnicamente no puedes escribir el código del kernel desde Java. Hay JCUDA http://www.jcuda.de/jcuda/JCuda.html, que le proporciona apis de cuda para la memoria general/menagement de dispositivos y algunos métodos de Java que se implementan en CUDA y JNI wrap (FFT, algunos métodos de álgebra lineal ... etc., etc.).

Por otro lado, OpenCL es solo una API. Los kernels OpenCL son cadenas simples pasadas a la API, por lo que con OpenCL desde Java deberías poder especificar tus propios núcleos. El enlace OpenCL para java se puede encontrar aquí http://www.jocl.org/.

+2

si JNA (http://jna.dev.java.net) es compatible con su plataforma, lo haría utilízalo para invocar el código nativo, ya que es mucho menos esfuerzo que codificar una biblioteca JNI. – mdma

11

He estado usando JOCL y estoy muy contento con él.

La principal desventaja de OpenCL sobre CUDA (al menos para mí) es la falta de bibliotecas disponibles (Thrust, CUDPP, etc.). Sin embargo, CUDA se puede portar fácilmente a OpenCL, y al observar cómo funcionan esas bibliotecas (algoritmos, estrategias, etc.) es realmente muy bueno, ya que se aprende mucho con él.

32

También puede considerar Aparapi. Le permite escribir su código en Java e intentará convertir bytecode a OpenCL en tiempo de ejecución.

Descripción completa. Soy el desarrollador de Aparapi.

+0

¿Aún se conserva el aparapi? –

+0

@MrJedi: Creo que sí, la última confirmación en github tiene algunos días: https://github.com/aparapi/aparapi –

+0

"se mantiene algo";) Soy un mantenedor. – barneypitt

7

Sé que es tarde, pero echar un vistazo a esto: https://github.com/pcpratts/rootbeer1

No he trabajado con él, pero parece mucho más fácil de usar que otras soluciones.

Desde la página del proyecto:

Rootbeer es más avanzado que CUDA OpenCL o del lenguaje Java Enlaces. Con enlaces, el desarrollador debe serializar gráficos complejos de objetos en matrices de tipos primitivos. Con Rootbeer esto se hace automáticamente. También con enlaces de lenguaje, el desarrollador debe escribir el kernel GPU en CUDA o OpenCL. Con Rootbeer se realiza un análisis estático del código de bytes de Java (usando hollín) y se genera automáticamente el código CUDA.

2

También puedo recomendar JOCL by jogamp.org, funciona en Linux, Mac y Windows. CONRAD, por ejemplo, usa mucho OpenCL en combinación con JOCL.

-2

Después de los últimos logros de Google, supongo que el tensorflow es el mejor enfoque para el cálculo en la GPU en absoluto, no sólo OpenCL. Tensorflow admite cálculos de OpenCL y CUDA con la misma API.

Cuestiones relacionadas