java可以调用cuda程序吗

Python017

java可以调用cuda程序吗,第1张

由于CUDA不支持Java下直接调用,因此,想在Java程序中把计算量密集的一部分(for循环)移植到GPU上使用CUDA来做比较麻烦。虽然现在有些lib(JCuda,JCUDA等)通过封装来隐藏Java调用CUDA程序之间的繁琐,但是如果理解了如何去在Java中实现调用,那么自己就可以动手解决,甚至可以自己动手写个lib或者简单的compiler来实现操作。 CUDA是基于C的,而Java提供了调用C函数的API----JNI(Java Native Interface),因此,最简单通用的方法就是通过JNI来调用写好的CUDA程序,或者调用CUDA Driver/Runtime API 去执行编译好的CUDA kernel(cubin 或者ptx)。下面介绍通过JNI调用CUDA 程序的方法。 先介绍基本的Java调用JNI步骤。首先,编写带有native声明的方法的java 类。例如方法loadFile,这里只需要声明方法,不需要实现,具体的实现在C中实现: class ReadFile { //Native method declaration native byte[] loadFile(String name)//Load the library static { System.loadLibrary("nativelib") } 其次,利用javac命令编译所写的java类。 Javac ReadFile.java 第三,利用javah 命令来编译生成.h的头文件,以便导入到C程序中。 Javah –jni ReadFile 第四,实现C的本地方法,即编写CUDA kernel程序,在程序中导入生成的.h文件,并把c程序保存在以.cu为后缀名的文件中。 最后,将包含CUDA程序的.cu文件编译生成动态链接库,windows下为dll,Linux下为.so。Linux下的编译命令为: nvcc -arch sm_20 --compiler-options '-fPIC' -o libhelper.so --shared jniHelper.cu -I./GPU_TLS -I/usr/java/jdk1.6.0_20/include -I/usr/java/jdk1.6.0_20/include/linux 注意,这里要使用nvcc而不是gcc进行编译,在要生成的.so文件名称前添加lib。-shared命令生成动态链接库,不要忘记添加-fPIC选项,--compiler-options(或者-Xcompiler)来将其传送给底层的gcc编译器。最后要把JNI需要的一些头文件路径(系统的jdk路径)添加进去。 这样,简单的Java调用CUDA程序就OK了

Java9 可能会支持AMD/NVIDIA 图形卡加速,当然底层是PTX和HSAIL

cuda 的java binding

Java bindings for CUDA3.

只能说对C++的支持比OpenCL好,也支持类、模板的部分特性。具体参见CUDA Toolkit Documentation