java cuda gpgpu opencl

¿El mejor enfoque para GPGPU/CUDA/OpenCL en Java?



(8)

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.

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:

  • ¿Todavía se puede usar OpenCL desde Java en Windows / Mac?
  • ¿Cuáles son las formas de las bibliotecas para interactuar con OpenCL / CUDA?
  • ¿Usar JNA directamente es una opción?
  • ¿Estoy olvidando algo?

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


AFAIK, JavaCL / OpenCL4Java es el único enlace OpenCL disponible en todas las plataformas en este momento (incluidos MacOS X, FreeBSD, Linux, Windows, Solaris, todo en Intel 32, 64 bits y variantes de ppc, gracias a su uso de JNA ).

Tiene demostraciones que realmente funcionan bien desde Java Web Start, al menos en Mac y Windows (para evitar bloqueos aleatorios en Linux, consulte esta página wiki , como esta Demo de Partículas) .

También viene con algunas utilidades (generación de números aleatorios GPGPU, reducción paralela básica, álgebra lineal) y un DSL de Scala .

Finalmente, son los enlaces más antiguos disponibles (desde junio de 2009) y tiene una comunidad de usuarios activa .

(Descargo de responsabilidad: soy el autor de JavaCL :-))


Bueno CUDA es una modificación de C, para escribir kernel CUDA tienes que 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étera etcétera..).

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/ .


He estado usando JOCL y estoy muy contento con eso.

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.



Sé que es tarde, pero eche 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 u OpenCL Java Language Bindings. 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.


Siguiendo los últimos logros de Google, supongo que tensorflow es el mejor enfoque para la computación en GPU, no solo OpenCL. Tensorflow admite cálculos de OpenCL y CUDA con la misma API.


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

La divulgación completa. Soy el desarrollador de Aparapi.


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