java可以调用cuda程序吗

Python027

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

CUDA CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员现在可以使用C语言来为CUDA架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA的处理器上以超高性能运行。 将来还会支持其它语言,包括FORTRAN以及C++。 随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。 目前只有G80、G92、G94和GT200平台的NVidia显卡才能使用CUDA,工具集的核心是一个C语言编译器。G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。 CUDA的SDK中的编译器和开发平台支持Windows、Linux系统,可以与Visual Studio2005集成在一起。 Geforce8CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。 从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动(表2)。 开发库是基于CUDA技术所提供的应用开发库。目前CUDA的1.1版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。 运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。 由于目前存在着多种GPU版本的NVidia显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持,NVidia公司GPU运算事业部总经理Andy Keane在一次活动中表示:一个充满生命力的技术平台应该是开放的,CUDA未来也会向这个方向发展。由于CUDA的体系结构中有硬件抽象层的存在,因此今后也有可能发展成为一个通用的GPGPU标准接口,兼容不同厂商的GPU产品 CUDA 工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境。CUDA开发环境包括: · nvcc C语言编译器 · 适用于GPU(图形处理器)的CUDA FFT和BLAS库 · 分析器 · 适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版) · CUDA运行时(CUDA runtime)驱动程序(目前在标准的NVIDIA GPU驱动中也提供) · CUDA编程手册 CUDA开发者软件开发包(SDK)提供了一些范例(附有源代码),以帮助使用者开始CUDA编程。这些范例包括: · 并行双调排序 · 矩阵乘法 · 矩阵转置 · 利用计时器进行性能评价 · 并行大数组的前缀和(扫描) · 图像卷积 · 使用Haar小波的一维DWT · OpenGL和Direct3D图形互操作示例 · CUDA BLAS和FFT库的使用示例 · CPU-GPU C—和C++—代码集成 · 二项式期权定价模型 · Black-Scholes期权定价模型 · Monte-Carlo期权定价模型 · 并行Mersenne Twister(随机数生成) · 并行直方图 · 图像去噪 · Sobel边缘检测滤波器 · MathWorks MATLAB® 新的基于1.1版CUDA的SDK 范例现在也已经发布了。 技术功能 ·在GPU(图形处理器)上提供标准C编程语言 · 为在支持CUDA的NVIDIA GPU(图形处理器)上进行并行计算而提供了统一的软硬件解决方案 · CUDA兼容的GPU(图形处理器)包括很多:从低功耗的笔记本上用的GPU到高性能的,多GPU的系统。 · 支持CUDA的GPU(图形处理器)支持并行数据缓存和线程执行管理器 · 标准FFT(快速傅立叶变换)和BLAS(基本线性代数子程序)数值程序库 · 针对计算的专用CUDA驱动 · 经过优化的,从中央处理器(CPU)到支持CUDA的GPU(图形处理器)的直接上传、下载通道 · CUDA驱动可与OpenGL和DirectX图形驱动程序实现互操作 · 支持Linux 32位/64位以及Windows XP 32位/64位 操作系统 · 为了研究以及开发语言的目的,CUDA提供对驱动程序的直接访问,以及汇编语言级的访问 NVIDIA进军高性能计算领域,推出了Tesla&CUDA高性能计算系列解决方案,CUDA技术,一种基于NVIDIA图形处理器(GPU)上全新的并行计算体系架构,让科学家、工程师和其他专业技术人员能够解决以前无法解决的问题,作为一个专用高性能GPU计算解决方案,NVIDIA把超级计算能够带给任何工作站或服务器,以及标准、基于CPU的服务器集群 CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。 由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域。目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言。可广泛的应用在图形动画、科学计算、地质、生物、物理模拟等领域。 2008年NVIDIA推出CUDA SDK2.0版本,大幅提升了CUDA的使用范围。使得CUDA技术愈发成熟 目前,支持CUDA的GPU销量已逾1亿,数以千计的软件开发人员正在使用免费的CUDA软件开发工具来解决各种专业以及家用应用程序中的问题。这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。 目前市面上已经部署了超过一亿颗支持CUDA的GPU,数以千计的软件开发人员正在使用免费的CUDA软件工具来为各种应用程序加速。 CUDA 的核心有三个重要抽象概念: 线程组层次结构、共享存储器、屏蔽同步( barrier synchronization),可轻松将其作为C 语言的最小扩展级公开给程序员。 CUDA 软件堆栈由几层组成,一个硬件驱动程序,一个应用程序编程接口(API) 和它的Runtime, 还有二个高级的通用数学库,CUFFT 和CUBLAS。硬件被设计成支持轻 量级的驱动和Runtime 层面,因而提高性能。