easily-openJCL 让 Java 与显卡之间的计算变的更加容易!

easily-openJCL 让 Java 与显卡之间的计算变的更加容易!

开源技术栏

本文介绍了关于在 Java 中 easily-openJCL 的基本使用!!!

目录

文章目录

  • easily-openJCL 让 Java 与显卡之间的计算变的更加容易!
    • 目录
  • easily-openJCL
    • 什么是 easily-openJCL
    • 为什么要使用 easily-openJCL
      • 获取方式简单
      • 非常简单的使用
    • 更加详细的文档
      • 繁多的内置计算模式
        • 数组与数组的计算模式
        • 数组与数值的计算模式
      • 自定义计算模式

加粗样式

easily-openJCL

什么是 easily-openJCL

easily-openJCL 是一个轻量级的 Java 语言下的 GPU 计算库,它提供了一套简单易用的 API,让用户能够轻松实现 GPU 计算操作。

通过 Java 调用 GPU 计算的一个库,使用非常简单的API就可以轻松应付 Java 数据类型在 GPU 中的计算操作!easily-openJCL 提供了诸多中计算模式,让我们的计算组件更灵活!

为什么要使用 easily-openJCL

获取方式简单

您可以直接使用 maven 左边来讲此依赖导入到您的项目中,这是非常快速且方便有效的!下面是依赖的坐标


<dependencies><dependency><groupId>io.github.BeardedManZhao</groupId><artifactId>easily-openJCL</artifactId><version>1.0</version></dependency>
</dependencies>

非常简单的使用

您无需关注一些底层的显存调用,且内置了一些计算内核,若这些已有的计算内核能够满足您,您甚至都不需要去关心计算的实现!下面是一个简单且通用的示例,将两个数组对应元素进行乘法计算,实例中有详细的注释,应该可以让您了解如何使用 easilyOpenJCL!

值得注意的是 easilyOpenJCL.calculate 操作并不会检查您的参数是否符合要求,因为并不是所有的计算模式都必须要满足 操作数的长度相同 的前提!

import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.kernel.KernelSource;import java.util.Arrays;public class Main {public static void main(String[] args) {// 准备一个 显卡计算组件! 在其中的结尾部分加上我们要使用的计算模式final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 在这里我们要做的就是为计算器装载内核,每个内核就是一种计算模式,计算组件装载了哪种模式 它就可以使用哪种计算模式。// 计算模式的名称格式为 "第一个操作数_操作类型_第二个操作数_操作数类型"// 例如第一个就是 两个float数组进行对应元素求和KernelSource.ARRAY_ADD_ARRAY_FLOAT,// 第二个就是 float数组和float数 进行对应元素求和(注意这里不是数组,是数)KernelSource.ARRAY_ADD_NUMBER_FLOAT);// 判断是否已经释放 如果没有释放才可以继续操作if (easilyOpenJCL.isNotReleased()) {// 准备数据 前两个是操作数 第三个是结果存储容器数组float[] srcArrayA = new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};float[] srcArrayB = new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};float[] dstArray = new float[srcArrayA.length];// 开始计算 在这里我们要指定好模式!easilyOpenJCL.calculate(srcArrayA, srcArrayB, dstArray, KernelSource.ARRAY_ADD_ARRAY_FLOAT);// 计算结果System.out.println(Arrays.toString(dstArray));}// 最后释放 值得一提的是 easilyOpenJCL 在没有释放前,calculate 函数可以无限次的调用easilyOpenJCL.releaseResources();}
}

更加详细的文档

您可以在这个章节中了解到更详细的文档哦~~~ 其中介绍了计算模式,介绍了自定义实现计算内核等知识!

繁多的内置计算模式

我们提供了一些常见的内置计算模式,我们可以通过这些模式实现有效的数据计算操作,接下来的表格中详细介绍了不同的计算模式信息!

计算模式名称计算模式支持版本操作数长度规则计算组件解释
ARRAY_ADD_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行加法计算
ARRAY_SUB_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行减法计算
ARRAY_MUL_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行乘法计算
ARRAY_DIV_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行除法计算
ARRAY_LS_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行左移计算
ARRAY_RS_ARRAY_INTv1.0两个操作数一致两个 int 数组之间进行右移计算
ARRAY_ADD_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行加法计算
ARRAY_SUB_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行减法计算
ARRAY_MUL_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行乘法计算
ARRAY_DIV_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行除法计算
ARRAY_LS_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行左移计算
ARRAY_RS_ARRAY_FLOATv1.0两个操作数一致两个 float 数组之间进行右移计算
ARRAY_ADD_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行加法计算
ARRAY_SUB_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行减法计算
ARRAY_MUL_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行乘法计算
ARRAY_DIV_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行除法计算
ARRAY_LS_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行左移计算
ARRAY_RS_ARRAY_DOUBLEv1.0两个操作数一致两个 double 数组之间进行右移计算
ARRAY_ADD_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_SUB_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_MUL_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_DIV_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_LS_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_RS_NUMBER_INTv1.0第二个操作数为1个元素int 数组和 int数值 之间进行加法计算
ARRAY_ADD_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_SUB_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_MUL_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_DIV_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_LS_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_RS_NUMBER_FLOATv1.0第二个操作数为1个元素float 数组和 float数值 之间进行加法计算
ARRAY_ADD_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
ARRAY_SUB_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
ARRAY_MUL_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
ARRAY_DIV_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
ARRAY_LS_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
ARRAY_RS_NUMBER_DOUBLEv1.0第二个操作数为1个元素double 数组和 double数值 之间进行加法计算
数组与数组的计算模式
import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.kernel.KernelSource;import java.util.Arrays;public class Main {public static void main(String[] args) {// 准备一个 显卡计算组件! 在其中的结尾部分加上我们要使用的计算模式final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 计算模式 这里是 float 加法和减法KernelSource.ARRAY_ADD_ARRAY_FLOAT, KernelSource.ARRAY_SUB_ARRAY_FLOAT,// 还有 double 的乘法和除法KernelSource.ARRAY_MUL_ARRAY_DOUBLE, KernelSource.ARRAY_DIV_ARRAY_DOUBLE);// 判断是否已经释放 如果没有释放才可以继续操作if (easilyOpenJCL.isNotReleased()) {// 准备两个数组final float[] srcArrayA = new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};final float[] srcArrayB = new float[]{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};final float[] dstArray = new float[srcArrayA.length];// 直接开始 使用 ARRAY_ADD_ARRAY_FLOAT 模式计算easilyOpenJCL.calculate(srcArrayA, srcArrayB, dstArray, KernelSource.ARRAY_ADD_ARRAY_FLOAT);// 获取到结果System.out.println(Arrays.toString(dstArray));System.out.println("================");// 准备两个 double 数组final double[] srcArrayA1 = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};final double[] srcArrayB1 = new double[]{2, 4, 2, 4, 2, 4, 2, 4, 2, 4};final double[] dstArray1 = new double[srcArrayA1.length];// 直接开始 使用 ARRAY_MUL_ARRAY_DOUBLE 模式计算easilyOpenJCL.calculate(srcArrayA1, srcArrayB1, dstArray1, KernelSource.ARRAY_MUL_ARRAY_DOUBLE);// 获取到结果System.out.println(Arrays.toString(dstArray1));}// 释放组件easilyOpenJCL.releaseResources();}
}

下面是计算结果

[11.0, 22.0, 33.0, 44.0, 55.0, 66.0, 77.0, 88.0, 99.0, 110.0]
================
[2.0, 8.0, 6.0, 16.0, 10.0, 24.0, 14.0, 32.0, 18.0, 40.0]
数组与数值的计算模式
import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.kernel.KernelSource;import java.util.Arrays;public class Main {public static void main(String[] args) {// 准备一个 显卡计算组件! 在其中的结尾部分加上我们要使用的计算模式final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 计算模式 这里是 float 加法和减法KernelSource.ARRAY_ADD_NUMBER_FLOAT, KernelSource.ARRAY_SUB_NUMBER_FLOAT,// 还有 double 的乘法和除法KernelSource.ARRAY_MUL_NUMBER_DOUBLE, KernelSource.ARRAY_DIV_NUMBER_DOUBLE);// 判断是否已经释放 如果没有释放才可以继续操作if (easilyOpenJCL.isNotReleased()) {// 准备两个 float 数组 第二个整形数组只有一个元素 因为 ARRAY_ADD_NUMBER_* 模式代表的就是 数组和一个元素进行 ADD 计算// 这里代表 srcArrayA 的元素 每个都加 10final float[] srcArrayA = new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};final float[] srcArrayB = new float[]{10};final float[] dstArray = new float[srcArrayA.length];// 直接开始 使用 ARRAY_ADD_NUMBER_FLOAT 模式计算easilyOpenJCL.calculate(srcArrayA, srcArrayB, dstArray, KernelSource.ARRAY_ADD_NUMBER_FLOAT);// 获取到结果System.out.println(Arrays.toString(dstArray));System.out.println("================");// 准备两个 double 数组 第二个整形数组只有一个元素 因为 ARRAY_MUL_NUMBER_* 模式代表的就是 数组和一个元素进行 MUL 计算// 这里代表 srcArrayA1 的元素 每个都乘 2final double[] srcArrayA1 = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};final double[] srcArrayB1 = new double[]{2};final double[] dstArray1 = new double[srcArrayA1.length];// 直接开始 使用 ARRAY_MUL_NUMBER_DOUBLE 模式计算easilyOpenJCL.calculate(srcArrayA1, srcArrayB1, dstArray1, KernelSource.ARRAY_MUL_NUMBER_DOUBLE);// 获取到结果System.out.println(Arrays.toString(dstArray1));}// 释放组件easilyOpenJCL.releaseResources();}
}

下面是计算结果

[11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0]
================
[2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0]

自定义计算模式

import io.github.BeardedManZhao.easilyJopenCL.EasilyOpenJCL;
import io.github.BeardedManZhao.easilyJopenCL.kernel.KernelSource;import java.util.Arrays;public class Main {public static void main(String[] args) {// 自定义的实现一个计算模式final KernelSource kernelSourceUDF = new KernelSource(// args1[0]=数组1的引用对象  args1[1]=数组2的引用对象  args1[2]=当前计算操作位于的索引  args1[3]=结果数组的引用对象// 这里是 结果数组[0] = 数组1[i] + 数组2[i] + 1// 第二个参数代表的是该计算模式 可计算的类型为 int// 第三个参数代表的是该计算模式的名称args1 -> String.format("%s[%s] = %s[%s] + %s[%s] + 1;", args1[3], args1[2], args1[0], args1[2], args1[1], args1[2]), "int", "MyUdfModel");// 准备一个 显卡计算组件! 在其中的结尾部分加上我们要使用的计算模式final EasilyOpenJCL easilyOpenJCL = EasilyOpenJCL.initOpenCLEnvironment(// 在这里我们直接将自己实现的计算组件传递进来kernelSourceUDF);// 判断是否已经释放 如果没有释放才可以继续操作if (easilyOpenJCL.isNotReleased()) {// 这里代表 srcArrayA 和 srcArrayB 的相同索引元素相加 最后加1 实现赋值操作final int[] srcArrayA = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};final int[] srcArrayB = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 11};final int[] dstArray = new int[srcArrayA.length];// 直接开始 使用我们自己实现的 kernelSourceUDF 模式计算easilyOpenJCL.calculate(srcArrayA, srcArrayB, dstArray, kernelSourceUDF);// 获取到结果System.out.println(Arrays.toString(dstArray));}// 释放组件easilyOpenJCL.releaseResources();}
}

这是计算结果

[3, 5, 7, 9, 11, 13, 15, 17, 19, 22]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法学习笔记(8)-动态规划基础篇

目录 基础内容&#xff1a; 动态规划&#xff1a; 动态规划理解的问题引入&#xff1a; 解析&#xff1a;&#xff08;暴力回溯&#xff09; 代码示例&#xff1a; 暴力搜索&#xff1a; Dfs代码示例&#xff1a;&#xff08;搜索&#xff09; 暴力递归产生的递归树&…

matlab仿真 信道(上)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 1.加性高斯白噪声信道&#xff08;AWGN &#xff09; clear all t0:0.001:10; xsin(2*pi*t);%原始信号 snr20;%设定加性白噪…

CSS技巧:清除浏览器默认样式,让你的页面全由你做主!

莫名其妙的的问题哪里来? 你有没有过写了半天样式&#xff0c;却发现总有些与你想要的效果不同的地方&#xff1a;input带个黑框框&#xff0c;list 的小圈圈&#xff0c;锚点的文字颜色&#xff0c;莫名其妙多出来的一两个像素的距离。。 回到20年前&#xff0c;我刚刚接触…

HBuilder X 小白日记03-用css制作简单的交互动画

:hover选择器&#xff0c;用于选择鼠标指针浮动在上面的元素。 :hover选择器可用于所有元素&#xff0c;不只是链接 :link选择器 设置指向未被访问页面的链接的样式 :visited选择器 用于设置指向已被访问的页面的链接 :active选择器 用于活动链接

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

【小鸡案例】表单focus和blur事件用法

input中有2个属性&#xff0c;一个是focus获取焦点&#xff0c;一个是blur失去焦点。获取焦点就是我们点击输入框时输入框被选中&#xff1b;失去焦点即点击输入框以外的区域&#xff0c;今天就用这两种属性做一个点击输入框的动画效果。 先写个输入框&#xff0c;代码如下&am…

GitLab介绍,以及add an SSH key

GitLab GitLab 是一个用于仓库管理系统的开源项目&#xff0c;现今并在国内外大中型互联网公司广泛使用。 git,gitlab,github区别 git 是一种基于命令的版本控制系统&#xff0c;全命令操作&#xff0c;没有可视化界面&#xff1b; gitlab 是一个基于git实现的在线代码仓库…

Spring的AOP进阶。(AOP的通知类型、通知顺序、切入点表达式和连接点。)

3. AOP进阶 AOP的基础知识学习完之后&#xff0c;下面我们对AOP当中的各个细节进行详细的学习。主要分为4个部分&#xff1a; 通知类型通知顺序切入点表达式连接点 我们先来学习第一部分通知类型。 3.1 通知类型 在入门程序当中&#xff0c;我们已经使用了一种功能最为强大…

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

BP神经网络的实践经验

目录 一、BP神经网络基础知识 1.BP神经网络 2.隐含层选取 3.激活函数 4.正向传递 5.反向传播 6.不拟合与过拟合 二、BP神经网络设计流程 1.数据处理 2.网络搭建 3.网络运行过程 三、BP神经网络优缺点与改进方案 1.BP神经网络的优缺点 2.改进方案 一、BP神经网络基…

windows obdc配置

进入控制面板&#xff1a; 进入管理工具&#xff1a;

transformer网络学习

Transformer encoder-decoder模型之间共享的是Encoder最后一层输出的hidden-state。 GitHub - huggingface/transformers: &#x1f917; Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. Bert2Bert中&#xff0c;Encoder的hidden-state同…

昇思25天学习打卡营第10天|ShuffleNet图像分类

ShuffleNet网络结构 ShuffleNet是一种专为移动设备设计的、计算效率极高的卷积神经网络&#xff08;CNN&#xff09;架构。其网络结构的设计主要围绕减少计算复杂度和提高模型效率展开&#xff0c;通过引入逐点分组卷积&#xff08;Pointwise Group Convolution&#xff09;和…

AutoX.js从某音分享链接解析出视频ID

背景 从某音分享的链接中解析出数字的videoID&#xff0c;用来做评论Intent跳转 思路 基本所有的短链接都是302跳转或者js跳转&#xff0c;熟悉http协议都知道&#xff0c;当状态码为302&#xff0c;从headers中提取Location即刻获得视频的原链接 链接中就带有videoId 要注意…

【大模型LLM面试合集】大语言模型基础_Word2Vec

Word2Vec 文章来源&#xff1a;Word2Vec详解 - 知乎 (zhihu.com) 1.Word2Vec概述 Word2Vec是google在2013年推出的一个NLP工具&#xff0c;它的特点是能够将单词转化为向量来表示&#xff0c;这样词与词之间就可以定量的去度量他们之间的关系&#xff0c;挖掘词之间的联系。 …

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人&#xff0c;被誉为“Java之父”的James Gosling&#xff0c;近日在社交媒体上宣布了自己正式退休的消息。Gosling表示&#xff1a;“我终于退休了。做了这么多年的软件工程师&#xff0c;现在是时候享受人生了。”他透露&#xff0c;在亚马逊的过去7年是非…

提高LabVIEW软件通用性的方法

提高LabVIEW软件通用性的方法 在使用LabVIEW开发软件时&#xff0c;提高软件的通用性非常重要。通用性意味着软件可以在不同的应用场景中使用&#xff0c;具备高度的适应性和灵活性&#xff0c;从而提高软件的价值和用户满意度。以下从多个角度详细探讨如何提高LabVIEW软件的通…

太实用了吧?手把手教你华为eNSP模拟器桥接真实网络!

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友。 今天聊聊eNSP桥接正式网络&#xff0c;就是把eNSP桥接进真实的网络&#xff0c;利用我们的物理网卡通过实体路…

Unity Text Mesh Pro 中英文混编自动换行问题

问题描述 使用TextMeshPro 输入中英文时&#xff0c;在一行内 输入中英文&#xff0c;当英文部分超过第一行剩余位置时&#xff0c;整个英文部分都会自动换行 问题截图&#xff1a; 期待截图&#xff1a; 问题说明 因为 TextMeshPro识别中文后会带换行符。 解决方案 修改…

人员定位系统的功能,你知道多少呢?

在此前的文章中&#xff0c;说到了人员定位系统用于化工厂定位这一用途来完善工厂管理&#xff0c;但同时&#xff0c;基于人员定位系统的强大功能&#xff0c;该系统的应用范围也要宽范的多&#xff0c;那么&#xff0c;本篇文章就来为大家介绍一下吧。 人员定位系统的功能简介…