通过JNI调用cuda程序

Java通过JNI调用CUDA矩阵乘法 ——NG 首先,新建vs2008 cuda dll工程Project4,新建java工程,代码如下: public class java1 {  static  {   System.loadLibrary("public class java1 {  stati 阅读详情

#前言
通过使用JNI(Java Native Interface)来调用cuda本地程序,实现把计算密集型任务分配到gpu中以便取得更好的性能。本文主要提供一个实例教程,方便笔者日后查看同时也方便读者学习相关知识。

#环境
本文采用cuda9.0+vs2017社区版+Intellij2016.1.3+jdk1.8+win10

#步骤
##1 建立jni调用类

package jni;

/**
 * Created by lu on 2017/10/24.
 */
public class JniTest {

    public native int printHelloWorldByGpu();


}

注意点:

  1. jni修饰符为native

##2 到该java文件目录下,执行javah jni.JniTest
这里写图片描述
产生的h文件会在执行该命令的目录中生成。
本文项目结构:
这里写图片描述
注意点:

  1. 如果带有包名,需要到包所在目录执行jni.JniTest。在本文中为java目录。如果在jni目录下执行会提示找不到类文件错误

##3 cuda项目
在此,笔者建议建立cuda模板项目。cuda模板项目可以测试cuda程序是否能正常运行,而且不需要额外的cuda配置。如果建立win32库工程,则需要加入cuda环境,配置相对复杂

###3.1 新建cuda项目
这里写图片描述

###3.2 复制头文件到项目中,并编写cuda程序
这里写图片描述

详细的cuda程序源代码:


#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <malloc.h> 
#include <stdio.h>
#include "jni_JniTest.h"
static int k = 0;
__global__ void helloFromGPU() {
	printf("Hello World from GPU! this is block (%d,%d,%d) thread (%d,%d,%d)\n",
		blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z);
}

__global__ void printMem(int * p) {
	printf("Hello World from GPU!");
	for (int i = 0; i < 10; i++) {
		printf("this is %d\n", p[i]);
	}
}
__global__ void printID() {
	printf("Hello World from GPU! this is thread %d ");
}
int printHelloWorld(void) {

	int * d_data = 0;
	int h_data[] = { 1,2,3,4,5,6,7,8,9,10 };
	cudaError_t cudaStatus = cudaMalloc((void**)&d_data, 10 * sizeof(int));
	cudaStatus = cudaMemset(&d_data, 3, 10 * sizeof(int));
	helloFromGPU << <2, 5 >> >();
	cudaDeviceReset();
	char z;
	scanf("%c", &z);
Error:
	return 0;
	return 0;
}
JNIEXPORT jint JNICALL Java_jni_JniTest_printHelloWorldByGpu
(JNIEnv *, jobject) {
	printHelloWorld();
	return 1;
}

这源代码是从《CUDA C编程权威指南》第一章程序改编过来的,详细可以参考原著。另外需要注意的是笔者在方法的最后增加了一个scanf的输入,原意为可以在程序结束前暂停来看输出。
注意点:

  1. 复制后改不改名为.cuh在本样例程序中都可以执行,但笔者认为最好还是改名字,以区分不同的项目。

###3.3 配置环境
编写好后,会发现jni.h找不到,这是由于cuda项目中默认VC环境没有配置jni库,所以要手动添加。
这里写图片描述

这里写图片描述

在红框处添加
D:\Program Files\Java\jdk1.8.0_144\include\win32
D:\Program Files\Java\jdk1.8.0_144\include\

###3.4 更改输出文件类型
由于需要的是dll文件,所以要修改项目生成的文件类型
这里写图片描述

###3.5 生成并获取dll文件
点击项目进行生成,然后到输出目录获取dll文件。复制到java项目中。
此为本文dll文件生成的目录
这里写图片描述

复制到java项目中
这里写图片描述

##4 java项目配置
方法有两种:

  1. 把dll文件作为库文件配置在libraries

这里写图片描述

这里写图片描述

  1. 在JVM中配置添加库文件路径相关配置
    这里写图片描述

笔者认为在这里采用方法1比较好,配置方便直观。

##5 测试程序
编写简单的main函数进行测试

package jni;

/**
 * Created by lu on 2017/10/24.
 */
public class JniMainTest {

    static{
        System.loadLibrary("cudaExport");
    }

    public static void main(String[] args) throws InterruptedException {
        JniTest jni = new JniTest();
        jni.printHelloWorldByGpu();
    }
}

主函数调用System.loadLibrary对cudaExport进行库加载。这里注意,是cudaExport不是cudaExport.dll
此处注意,由于cuda程序中最后有一个scanf,所以printHelloWorldByGpu输出之后会等待输入。
##6 结语
由于cuda程序是c/c++程序的扩展,所以使用jni程序也能调用。这样就可以实现构建cuda在java方面的应用。笔者认为这样在数据处理,矩阵计算等计算密集型任务可以通过以这样的方式分发到cuda,使用GPU来执行,以此可以提高设备的使用效率。
文中如有不妥之处,还望指出。
赤月幼狼,201710251117。

Java通过JNI调用CUDA ——NG     这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索。我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是不可行的。     因为cuda程序涉及一个API接口的问题,直接使 阅读详情

相关推荐

JavaGPU编程-第一节-安装配置Jcuda

JCuda的学习使用,配置教程 GPU编程

qq_56323695的博客 5129

Java通过JNI调用CUDA程序

在这里不讨论为什么不使用Jcuda,只是说明如何通过JNI(Java Native Interface)调用CUDA程序 (1)编写java程序通过native关键字声明调用接口 (2)生成调用头文件xx.h,使用javah命令生成(如果你够牛逼可以自己手写,但是这样容易出错) (3)编写CUDA程序(跟编写C/C++差不多) (4)编译生成动态链接库libxx.so文件(windows下应该是x...

心静思远 2297

企业级Java应用集成CUDA GPU加速:JNI架构实战与性能优化指南

在数据密集型计算领域,GPU凭借其大规模并行架构,为突破CPU性能瓶颈提供了全新思路。其核心原理在于利用数千个计算核心同时处理海量数据,通过CUDA等编程模型将计算任务映射到GPU硬件上执行,从而实现数十倍乃至数百倍的性能飞跃。这一技术价值在于为高并发、低延迟的实时分析、加密解密、科学计算等场景提供了硬件级加速方案。在企业级Java后端开发中,通过JNI(Java Native Interface)构建稳健的桥接层,将Java应用与CUDA内核高效、安全地连接,成为实现生产级GPU加速的关键路径。本文聚焦于

weixin_32821533的博客 295

hadoop通过JNI调用cuda程序

一、通过JNI,将C写成的cuda 1、 写一个java类,类中包含一个native的函数,导入.so动态链接库,注意,linux中,SiftGPU其实指的是libSiftGPU.so。 package nfs.sil.image.sift.main; import java.util.List; import java.lang.reflect.*; import java.util.A

moonboat0331的专栏 1730

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

本文介绍了在Ubuntu 24.04上安装和使用GDebi的方法。GDebi是DPKG的轻量级替代品,能够自动解析并安装.deb包的依赖项。文章详细说明了系统更新、安装GDebi的步骤,并演示了通过GUI和CLI两种方式安装.deb包的操作流程。此外,还提供了验证安装和卸载包的方法。GDebi虽然非必需,但为用户提供了处理依赖项的另一种选择,适合需要安装本地Debian包的用户。

山岚的运维笔记 1986

数通基础(基本网络通信原理、IP地址如何配置、DHCP、DNS域名系统、路由技术基础、静态路由 、TCP和UDP、vlan虚拟局域网、trunk、三层交换)

我们知道了1、电脑开机,通过dhcp获取ip地址2、电脑输入域名,www.baidu.com电脑把www.baidu.com发到自己的dns服务器3、dns服务器把域名解析成对应的ip地址4、电脑向百度服务器发送一个请求。

qq_53235556的博客 6481

java在主程序修改函数输出,Java通过JNI调用CUDA

——NG这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索。我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是不可行的。因为cuda程序涉及一个API接口的问题,直接使用JNI调用c/c++的方法来调用cuda是不可行的。在这上我走了不少弯路。然后我就想到能否使用cuda原生的dll支持来实现JNI调用cuda...

weixin_33472998的博客 328

CANoe LIN一致性测试之干扰测试Test moudle_LIN Disturbance Block

注意:相邻两个显隐性不同的bit不允许干扰,例如我同时选择bit6和bit7,相邻两个同显隐性的bit允许干扰,例如当我选择bit3和bit4,项,这里我选择ID:为0x2F(PID:0x6F)的frame。需按照具体测试规范实施干扰项,帧头和数据段都可以实现干扰。最近发现一个干扰测试模块,下面是一些具体使用方法。选择干扰项:PID的奇偶校验位(一致性测试干扰测试之手动测试。一个待测试frameD。

yuanyikangkang的博客 3410

Linux下,JAVA通过JNI调用CUDA程序

最近在做这一块,通过我自己的程序,简要写一些笔记。简单说来,先通过一个java类,调用C++的库中的函数 1、先写java类,写好类后,使用javac FeatureExtract.java编译 1 import java.util.List;   2import java.util.ArrayList;   4   5class FeatureExtract   6 {  7   

moonboat0331的专栏 1226

高缺失率时空数据插补实战:从随机森林到扩散模型的性能对比

数据缺失是数据分析与机器学习建模中普遍面临的挑战,尤其在时空数据领域,传感器故障、传输中断等问题常导致数据不完整。数据插补技术旨在基于已知数据的模式和关联性,合理估算缺失值,为后续分析提供可靠基础。其核心原理在于利用数据的时空相关性(如时间周期性、空间邻近性)及与外部驱动因素(如交通、气象)的关联构建预测模型。这项技术的价值在于能将不完整的数据集转化为可用于高质量分析和预测的可用资产,广泛应用于环境监测、交通流量预测、金融风控等领域。本文聚焦于一个极具挑战性的场景——PM2.5监测数据缺失率高达82%,通过

weixin_30363285的博客 544

谈谈人大金仓数据库

人大金仓数据库(Kingbase)是国产自主研发的关系型数据库管理系统,兼容主流数据库语法,支持高并发、高安全性及国产化适配。该数据库提供完整的安装部署方案,包括环境准备、初始化配置和验证流程,并配备专业的数据迁移工具(KDMS)实现从Oracle/MySQL等数据库的平滑迁移。系统提供KStudio等图形化管理工具,支持性能监控、备份恢复等运维功能,同时具备性能调优、高可用架构、分区表管理等高级特性,满足政府、金融等领域的企业级需求。

蜚鸣的博客 2099

java 调用cuda程序

【转载】 原链接地址 http://hpcbbs.it168.com/thread-6014-1-1.html   由于CUDA不支持Java下直接调用,因此,想在Java程序中把计算量密集的一部分(for循环)移植到GPU上使用CUDA来做比较麻烦。虽然现在有些lib(JCuda,JCUDA等)通过封装来隐藏Java调用CUDA程序之间的繁琐,但是如果理解了如何去在Java中实现调用,那么

amandasheng的专栏 3311

【AutoCAD中实现双击文本编辑功能】

例如:以下是官方博客例子浅析先加入相关的头文件和库文件。在AutoCAD中有一个很重要的功能,就是双击图形尺寸或文本后会出现一个文本编辑框,用户可在该编辑框中修改文字。本文介绍了如何使用AcEdInplaceTextEditor来实现该功能。实现cad的消息监听。创建一个消息监听的类并在cad中注册来实现消息监听。主要是监听键盘输入。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了的函数和方法。

我的博客 1149

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.loadLi...

weixin_36269724的博客 832

OKX 欧易 交易机器人开发基础

接口文档: https://www.okx.com/docs-v5/zh/#overview REST API 常用请求 查看账户余额 结果数据格式: 获取限价 结果格式: 获取指数行情 数据结构: 下单 结果数据: 获取未成交订单列表 返回结果: 撤单 结果结构:

Willin Wang 的全栈升级指南 2万+

SAP 标准 CDS View 到底能不能用 CDS Extension View 扩展,我们在项目里应该这样判断

文章摘要:判断SAP标准CDS视图(如A_PRODUCT)能否扩展字段,不能仅凭命名或@Metadata.allowExtensions判断,需检查DDL源码中的@AbapCatalog.viewEnhancementCategory值。#PROJECTION_LIST允许扩展字段,#NONE则禁止。聚合视图需额外包含#GROUP_BY,UNION视图需#UNION。CDS View Extension用于新增字段,Metadata Extension仅用于添加注解。在ABAP Cloud环境中还需检查AP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 100

Java/Scala 通过JNI调用包含CUDA代码的函数可能遇到的问题

Java/Scala通过JNI调用包含CUDA程序的C++/C函数可能遇到各种问题,现将我遇到的问题归纳如下 1)symbol lookup error问题,具体表现为 /usr/local/jvm/jdk1.8.0_45/bin/java: symbol lookup error: yourpath_to_shared_primary_lib.so: undefined symbol: cu

liliang199的专栏 1928

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java jni c 指针_通过JNI传递C和Java之间的指针

通过JNI传递C和Java之间的指针目前,我正在尝试创build一个使用CUDAfunction的Java应用程序。 CUDA和Java之间的连接工作正常,但我有另一个问题,并想问,如果我的想法是正确的。当我从Java调用本地函数时,我将一些数据传递给它,函数计算一些东西并返回结果。 是否有可能,让第一个函数返回一个引用(指针)这个结果,我可以传递给JNI并调用另一个函数,进一步计算结果?我的想...

weixin_32259697的博客 1533

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

GPU-CUDA编程实践(一)

图4 CUDA程序流程

laolu1573的专栏 1115

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java调用本地方法--jni简介

本篇结构: 简介 JNI实现步骤 JNI实例–简单调用 故障排除 CUDA 生成动态链接库 指令 参考博文 一、简介 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。 有时可能存在需要访问的系统特性和设备通过java平台无法实现,又或者某个部分需要非常高的性能,这时可能就要牺牲跨平台的优势,一种解决方法就是寻求系...

w1992wishes的博客 5371

如何在Java和Scala中使用JNI调用c++动态库.so

本文所用的全部样例demo已经同步上传至github(https://github.com/zhangjiaxinghust/java_call_cpp),样例在ubuntu16.04下均有一键运行脚本,可以运行感受一下,下面我们就根据这四个样例来介绍JNI的使用,方便大家后续在Java和Scala工程中直接调用外部动态链接库。 JNI介绍 众所周知,JAVA和SCALA都运行在JVM之上,具有跨...

piaoxi6587的博客 1107

java调用c指针,通过JNI在C和Java之间传递指针

At the moment, i'm trying to create a Java-application which uses CUDA-functionality. The connection between CUDA and Java works fine, but i've got another problem and wanted to ask, if my thoughts ab...

weixin_29587979的博客 385

YOLOv8是否支持Java调用?JNI封装可行性

通过JNI技术,Java应用可高效调用基于Python的YOLOv8模型,实现本地低延迟推理。该方案适用于已有Java系统集成视觉能力的场景,避免网络开销,同时需注意GIL、内存管理和跨语言异常处理等关键问题。

weixin_42601547的博客 714
上一篇: python学习笔记(四)--杂项
下一篇: git学习笔记
赤月幼狼
博客等级 码龄10年 20粉丝 20原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赤月幼狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值