——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相关推荐

  1. java.util接口_函数接口– Java 8中java.util.function包中的函数接口

    java.util接口 我以前写过有关功能接口及其用法的文章. 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Su ...

  2. java一维数组正序输出,java将一个数组逆序输出-java将一个数组逆序输出的方法-吾爱编程网...

    今天吾爱编程为大家分享一下Java的经典实例之一:java将一个数组逆序输出,有需要的小伙伴可以参考: 1.题目要求: 使用Java编程一个程序,将一个数组逆序输出 2.程序代码:public sta ...

  3. Java中测长函数_Core Java测试题

    } 问:类Person和类Student的关系是( B ). A.包含关系 B.继承关系 C.关联关系 D.无关系,上述类定义有语法错误 9.设有下面的两个类定义: class AA { void S ...

  4. java 文件的修改_使用java来修改文件内容

    我需要就地修改文件的特定内容. 我不想创建一个新文件并重写旧文件.文件也很小,每个最大只有几MB. 对于那些想知道的人(虽然我不确定这是否与OP有关),我需要修改属于版本控制的文件并需要修改只读版本. ...

  5. java整型数组转置输出,Java实现数组转置

    public class DayE2 { public static void main(String[] args) { int [] datas=new int[]{1,2,3,4,5,6}; i ...

  6. java使用jna修改桌面_java - Java JNA获取桌面项目位置 - 堆栈内存溢出

    问题是com.sun.jna.Native.getNativeSize(Class)不是在这种情况下使用的正确函数. 使用32位JVM时,问题是可见的(64位虚拟机不可见). 对于结构,上面提到的函数 ...

  7. java为什么监听器里没有输出,JAVA Web开发技术应用——监听器

    额,代码竟然不显示 我再贴一下public class FirstListener implements ServletRequestListener { // Public constructor  ...

  8. java实现pdf修改,或者在Java中使用iText pdf更改pdf页面的颜色

    小编典典 虽然该问题的答案中给出的建议有效,但这并不是您可以获得的最佳建议.如果我早些时候看过您的原始问题,我将以不同的方式回答.我会建议您使用页面事件,如PageBackgrounds示例中那样. ...

  9. java 字符串输出字符_输出java字符串

    1-1 字符串排序 用Java编写一个能对一组字符串按字典序升序排序的程序 输入为N和N行字符串,需要按行输出字符串升序排序的结果 如输入 3 Abc Abe Abd 输出: Abc Abd Abe ...

最新文章

  1. 谷歌开源NLP模型可视化工具LIT,模型训练不再「黑箱」
  2. 程序员最喜爱的12个Android应用开发框架二(转)
  3. OpenGL硬件加速指南
  4. 关于 Deployer 部署结构
  5. linux换源 最最简单
  6. 无法找到脚本库错误解决过程
  7. 结构化查询语言(Structured Query Language)
  8. Gargari and Permutations CodeForces - 463D(建图+记忆化搜索)
  9. quartz.net 执行后台任务
  10. 操作系统设计与实现 读笔(2)
  11. 用 Python 写一个 Kaggle 比赛排行榜的爬虫
  12. 支付宝架构到底有多牛逼?看完这篇你就明白了!
  13. 从C#程序中调用非受管DLLs
  14. java stream, LIST ,ArrayList常用操作
  15. 怎样背英语单词才高效?
  16. 基于elementui的年月日周时间控件
  17. ipad 在线打代码 code-server
  18. Vue项目实战05:18n实现多语言自动切换-浏览器语言设置
  19. 手机抠图怎么变透明底?这个抠图方法快收藏起来
  20. webpack常见面试题

热门文章

  1. 就在刚刚!吴恩达的这门新课程终于开放注册了
  2. SqlDataAdapter隐式打开关闭connection
  3. Delphi 与 C/C++ 数据类型对照表
  4. go语言游戏编程初识--`Ebiten`
  5. 使用FFmpeg实现抽取多媒体文件的音频并按照AAC格式进行保存--附源码
  6. 23种设计模式C++实现
  7. 结构体成员赋值-标记化结构体初始化语法-结构体成员前面加小数点
  8. (char*)malloc(sizeof(char))有什么用,为什么要这么写——简单介绍指针
  9. Hybrid app 学习资料收集
  10. Struts2学习总结一