java在主程序修改函数输出,Java通过JNI调用CUDA
——NG
這段時間因為工作需要,要用到在java中調用cuda程序,但是令人蛋疼的是網上這方面的資料幾乎沒有,所以只好我自己摸索。我的想法是通過java的JNI接口調用cuda,但是很明顯正常情況下是不可行的。
因為cuda程序涉及一個API接口的問題,直接使用JNI調用c/c++的方法來調用cuda是不可行的。在這上我走了不少彎路。然后我就想到能否使用cuda原生的dll支持來實現JNI調用cuda(cuda原生的dll只支持c/c++)。
接下來我們實現一下,當然首先你要懂JNI和cuda。
1.首先是前期工作,編寫一個簡單的java主程序java1.java,如下:
public class java1 {
static
{
System.loadLibrary("cudll");
}
public native static int cuda(int i);
public static void main(String[] args)
{
java1.cuda(4);
}
}
以上java程序要實現的是對cudll.dll的調用。然后javac成java1.class,再javah成java1.h頭文件以方便接下來的調用。
2.然后就是cudll.dll的制作了。
看下圖,首先通過CUDAWinApp建立cuda的dll工程:
建好后的工程如下:
其中頭文件包括cuda的dll制作函數,源文件Project2.cpp和 stdafx.cpp是配置文件。最關鍵的是sample.cu文件和sample.def文件,一個是你要編寫的dll主文件,一個是dll生成接口。如果是c調用的話不需要修改sample.def,但是通過java調用的話就要修改了。
3.然后就是最關鍵的具體dll編寫了。首先要講之前制作的java1.h拷貝到本工程的根目錄以備調用。根據cuda官方提供的API可以編寫代碼,或者是直接根據sample的簡單例子進行改寫。
本文為簡單使用默認的sample例子。當然你要改動一些地方:
將java1.h頭文件包含到程序里面:
#include "java1.h"
然后別的代碼包括內核不要動,修改主函數,將至改為JNI提供的接口函數:
JNIEXPORT jint JNICALL Java_java1_cuda (JNIEnv *, jclass, jint q)
其中Java_java1_cuda 為函數名,必須與你的java代碼中的接口聲明一一對應,q為傳遞的變量,根據具體情況添加,但是必須有。且要與java代碼中的聲明一致。
最后就是修改sample.def了,將至改為:
LIBRARY "Project2"
EXPORTS
Java_java1_cuda
看到了把,將主函數名修改為JNI提供要求的函數名。
4.最后是dll生成了,到這里所有準備工作就做好了,debug把,將生成的sample.dll拷貝到java代碼的工程目錄,改名為cudll.dll。然后運行java1.java,就會看到經典的cuda輸出了:
CUDA initialized.
Processing time: 0.205585 (ms)
Hello CUDA!
//*
歡迎大家討論交流:QQ798618048
*//
總結
以上是生活随笔為你收集整理的java在主程序修改函数输出,Java通过JNI调用CUDA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中进制转换,php中进制转换
- 下一篇: php 根据键名分类求和,二维数组根据键