JavaCL是一个封装了OpenCL的Java类库,提供了更多的基于openCL的实现,能够快速进行异构开发。
JavaCL项目地址
http://code.google.com/p/javacl/
API接口地址如下
http://nativelibs4java.sourceforge.net/sites/javacl/apidocs/
基于AMD显卡的环境配置:
1)首先需要安装AMD APP,配置好openCL开发环境
2)在运行->cmd中键入clinfo,查看环境是否配置完成
3)在java中编写代码,并调用JavaCL库,即可进行快速开发。
以下为一个简单的FFT范例(来自JavaCL范例)
int n = 1024; // power-of-two
float[] complexInput = new float[2 * n]; // interleaved real and imag values
for (int i = 0; i < n; i++) {
complexInput[i * 2] = i; // pure-real input
}
//初始化环境
CLContext context = JavaCL.createBestContext(); // use createBestContext(DoubleSupport) for doubles
CLQueue queue = context.createDefaultQueue();
FloatFFTPow2 fft = new FloatFFTPow2(context); // use default OpenCL context
//傅立叶变换
float[] transformed = fft.transform(queue, complexInput, false);
//傅立叶逆变换
float[] transformedBack = fft.transform(queue, transformed, true);
以下为调用自己编写的kernel函数进行异构开发
Kernel函数(myKernel.cl):
__kernel void myKernel(__global const float* input, __global float* output, float multFactor) {
int i = get_global_id(0);
output[i] = input[i] * multFactor;
}
//Java中生成并编译kernel
String source = IOUtils.readText(sample.class.getResource("myKernel.cl"));
program = context.createProgram(source);
myKernel= program.createKernel("myKernel");
//调用kernel
synchronized (kernel) {
// setArgs will throw an exception at runtime if the types / sizes of the arguments are incorrect
myKernel.setArgs(input, output, multFactor);
// Ask for 1-dimensional execution of length dataSize, with auto choice of local workgroup size :
kernelCompletion = myKernel.enqueueNDRange(queue, new int[] { dataSize }, null);
}
这样就完成了kernel的调用。
非常简单,值得一试