cuda支持java吗,Java与Cuda混合编程

基本上和Java与C语言混合编程(链接)相同,就是在生成动态库的编译过程不同。

首先编写一个名为Main.java的文件,内容如下:

class NativeMethod{

public native void writefloat(int nx,int nz);

}

public class Main{

public static void main(String[] args){

System.loadLibrary("NativeMethod");

NativeMethod nm = new NativeMethod();

nm.writefloat(100,100);

}

}

编译:

javac Main.java

生成两个class文件:Main.class和NativeMethod.class文件。

用JNI编译:

java -jni NativeMethod(注意,给名称是native方法所在类)

生成:NativeMethod.h,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include /* Header for class NativeMethod */

#ifndef _Included_NativeMethod

#define _Included_NativeMethod

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: NativeMethod

* Method: writefloat

* Signature: (II)V

*/

JNIEXPORT void JNICALL Java_NativeMethod_writefloat

(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus

}

#endif

#endif这是自动生成的,无需手动编写,我们要用到的地方是标红函数。

编写动态库的代码:

#include "NativeMethod.h"

#include #include #include #include #include #include void check_gpu_error (const char *msg)

{

cudaError_t err = cudaGetLastError ();

if (cudaSuccess != err) {

printf("Cuda error: %s: %s\n", msg, cudaGetErrorString (err));

exit(0);

}

}

__global__ void fun(float *val,int nx,int nz)

{

int id=threadIdx.x+blockDim.x*blockIdx.x;

if(id

val[id] = id+1;

}

JNIEXPORT void JNICALL Java_NativeMethod_writefloat

(JNIEnv *env, jobject obj, jint nx, jint nz){

float *v,*vv;

char FN1[250]={"v.dat"};

FILE *fp;

fp=fopen(FN1,"wb");

v=(float*)malloc(nx*nz*sizeof(float));

cudaSetDevice(0); // initialize device, default device=0;

check_gpu_error("Failed to initialize device!");

cudaMalloc(&vv, nx*nz*sizeof(float));

cudaMemset(vv, 0, nx*nz*sizeof(float));

fun <<< ( nx * nz + 511 ) / 512 , 512 >>> (vv, nx, nz);

cudaMemcpy(v, vv, nx *nz *sizeof(float), cudaMemcpyDeviceToHost);

fwrite(v,sizeof(float),nx* nz, fp);

fclose(fp);

}

然后编译生成动态库:

nvcc -o libNativeMethod.so -shared -Xcompiler -fPIC NativeMethod.cu -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux

注意:生成的动态库名字以Main.java中System.loadLibrary("NativeMethod");双引号中的名字加“lib”前缀和“.so”后缀(本文例子为“libNativeMethod.so”).

然后就可以运行调用了cuda的native方法的java程序:

java -Djava.library.path=. Main

整体的编译shell:

javac Main.java

javah -jni NativeMethod

nvcc -o libNativeMethod.so -shared -Xcompiler -fPIC NativeMethod.cu -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux

java -Djava.library.path=. Main

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值