La computación 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 computación.
Me encantaría usar GPGPU para 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:
- ¿Se puede utilizar 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?
- ¿Me estoy olvidando de algo?
Se agradece cualquier experiencia / ejemplo / historia de guerra del mundo real.
Respuestas:
AFAIK, JavaCL / OpenCL4Java es el único enlace OpenCL 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 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 Demostración 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 Scala DSL .
Finalmente, es la vinculación más antigua disponible (desde junio de 2009) y tiene una comunidad de usuarios activa .
(Descargo de responsabilidad: soy el autor de JavaCL :-))
fuente
También puede considerar Aparapi . Le permite escribir su código en Java e intentará convertir el código de bytes a OpenCL en tiempo de ejecución.
La divulgación completa. Soy el desarrollador de Aparapi.
fuente
Bueno, CUDA es una modificación de C, para escribir el kernel de 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 vincularse con Java mediante JNI. Entonces, técnicamente, no puede escribir código del kernel desde Java. Existe JCUDA http://www.jcuda.de/jcuda/JCuda.html , le proporciona las apis de cuda para la gestión general de memoria / dispositivo y algunos métodos Java que se implementan en CUDA y JNI envuelto (FFT, algunos métodos de álgebra lineal .. etcétera etcétera..).
Por otro lado, OpenCL es solo una API. Los núcleos de OpenCL son cadenas simples que se pasan a la API, por lo que al usar OpenCL de Java debería poder especificar sus propios núcleos. El enlace OpenCL para Java se puede encontrar aquí http://www.jocl.org/ .
fuente
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 observar cómo funcionan esas bibliotecas (algoritmos, estrategias, etc.) es realmente muy bueno, ya que aprende mucho con él.
fuente
Sé que es tarde, pero mira 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 los enlaces de idioma, el desarrollador debe escribir el kernel de la GPU en CUDA u OpenCL. Con Rootbeer se realiza un análisis estático del código de bytes de Java (utilizando Soot) y se genera automáticamente el código CUDA.
fuente
También puedo recomendar JOCL de jogamp.org , funciona en Linux, Mac y Windows. CONRAD , por ejemplo, usa mucho OpenCL en combinación con JOCL.
fuente
Si desea realizar algún procesamiento de imágenes u operaciones geométricas, es posible que desee una biblioteca de álgebra lineal con soporte para gpu (con CUDA, por ejemplo). Te sugiero que ND4J sea el álgrebra lineal con soporte de GPU CUDA en el que se construye DeepLearning4J. Con eso no tiene que lidiar con CUDA directamente y tiene que codificar de bajo nivel en c. Además, si desea hacer más cosas con imágenes con DL4J, tendrá acceso a operaciones específicas de procesamiento de imágenes, como la convolución.
fuente
Puedes echar un vistazo a la API CUDA4J
http://sett.com/gpgpu/the-cuda4j-api
fuente