JOCL 介绍
jocl实际上就是对opencl用java语言进行了封装,许多代码都和opencl一样,这一点使得用过opencl的可以非常快的上手,可以到github查看源码
由于java没有指针,所以jocl不得不用Pointer来获取地址,这样就感觉jocl其实看起来比opencl还要复杂
JOCL 开发环境搭建
参考别人的文章https://my.oschina.net/qutterrtl/blog/1531327 完成jocl开发环境搭建
- 更新显卡驱动
- 安装opencl驱动,应该最新版本的显卡驱动都是支持opencl的,可以用 GPU Caps Viewer 来测试,如果没有,AMD的话可以到https://support.amd.com/en-us/kb-articles/Pages/OpenCL2-Driver.aspx 下载驱动
- 下载opencl sdk
- 下载安装jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,不要忘了设置环境变量
- 下载安装eclipse http://www.eclipse.org/downloads/eclipse-packages
- 下载jar包 http://www.jocl.org/downloads/downloads.html,需要提取里面的相应jar文件放到项目Referenced Libraries里面,把dll文件放到jdk安装路径/bin下
- 现在可以直接到官网 http://www.jocl.org/samples/samples.html 找sample来运行了
封装JOCL
原始的jocl就是对opencl的C语言的重写,是比较麻烦的,下面给出封装代码
PackJocl.java
1 | package jocl; |
PackageTest.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45package jocl;
import org.jocl.Pointer;
public class PackageTest {
public static void main(String args[]){
PackJocl jocl= new PackJocl();
// 初始化,第一个参数是平台index,第二个参数是驱动index
jocl.init(1,0);
// 创建内核, 第一个是内核文件名,第二个是内核函数名
jocl.createKernel("E://kernel.cl", "add");
// 获取测试数据并复制到显存
int n = 10;
float srcArrayA[] = new float[n];
float srcArrayB[] = new float[n];
float dstArray[] = new float[n];
for (int i=0; i<n; i++)
{
srcArrayA[i] = i;
srcArrayB[i] = i;
}
Pointer parameters[] = {
Pointer.to(srcArrayA),
Pointer.to(srcArrayB),
Pointer.to(dstArray)};
jocl.setParameters(parameters, n);
// 执行
jocl.execute(1,new long[]{n}, new long[]{1});
// 获取执行结果
jocl.getData(2, Pointer.to(dstArray), n);
// clear
jocl.clear();
System.out.println(dstArray[9]);
}
}
kernel.cl 我是放在E盘根目录下,所以PackageTest.java中写的jocl.createKernel(“E://kernel.cl”, “add”); 你可以改成其他的1
2
3
4
5
6__kernel void add(__global const float *a, __global const float *b, __global float *c)
{
int gid = get_global_id(0);
printf("%d\t",gid);
c[gid] = a[gid] + b[gid];
}
运行结果
第一次写文章,希望可以帮助到你