文档章节

利用JOCL进行opencl开发之helloworld

Jack001
 Jack001
发布于 2017/09/07 15:35
字数 770
阅读 81
收藏 0

JOCL(Java bindings for OpenCL)提供的API保持与OpenCL的原始API尽可能的相近。功能全部采用静态方法实现,语义和这些方法的签名与原来的库函数保持一致。除了一些Java语言的特殊限制。

之所以选JOCL 

1 本人java开发,不懂C++ 

2 本人笔记本上只有AMD渣显卡

之前选过aparapi但没成功一直报错,可能是显卡原因.

本地显卡是AMD Radeon HD 7600M系列 驱动程序版本15.200.1062.1004  本地CPU是i7 3740QM 

首先 安装好正确的驱动 然后安装AMD提供的AMD APP SDK 2.9 目前版本是2.9  这俩自行去官网下载.

http://support.amd.com/en-us/kb-articles/Pages/OpenCL2-Driver.aspx

成功后cmd下执行clinfo -v  能出来结果说明安装ok了

然后下载jocl

http://www.jocl.org/downloads/downloads.html

具体参考

https://jogamp.org/jocl/doc/HowToBuild.html

如果不想自己编译源码  直接用archive 下载地址

http://jogamp.org/deployment/jogamp-current/archive/

下载这个最大的文件后解压

取\jogamp-all-platforms\jar下面的gluegen-rt.jar  gluegen-rt-natives-windows-amd64.jar  jocl.jar  jocl-natives-windows-amd64.jar这四个jar到自己项目的lib中

然后写个demo 用下面的代码

import com.jogamp.opencl.CLBuffer;
import com.jogamp.opencl.CLCommandQueue;
import com.jogamp.opencl.CLContext;
import com.jogamp.opencl.CLDevice;
import com.jogamp.opencl.CLKernel;
import com.jogamp.opencl.CLProgram;

import java.io.IOException;
import java.nio.FloatBuffer;
import java.util.Random;

import static java.lang.System.*;
import static com.jogamp.opencl.CLMemory.Mem.*;
import static java.lang.Math.*;

/**
 * Hello Java OpenCL example. Adds all elements of buffer A to buffer B
 * and stores the result in buffer C.<br/>
 * Sample was inspired by the Nvidia VectorAdd example written in C/C++
 * which is bundled in the Nvidia OpenCL SDK.
 *
 * @author Michael Bien
 */
public class HelloJOCL {

    public static void main(String[] args) throws IOException {

        // set up (uses default CLPlatform and creates context for all devices)
        CLContext context = CLContext.create();
        out.println("created "+context);

        // always make sure to release the context under all circumstances
        // not needed for this particular sample but recommented
        try{

            // select fastest device
            CLDevice device = null;
            device = context.getMaxFlopsDevice(CLDevice.Type.GPU);
            //device = context.getMaxFlopsDevice(CLDevice.Type.CPU);
            out.println("using "+device);

            // create command queue on device.
            CLCommandQueue queue = device.createCommandQueue();

            int elementCount = 59449477;                                  // Length of arrays to process
            int localWorkSize = min(device.getMaxWorkGroupSize(), 256);  // Local work size dimensions
            int globalWorkSize = roundUp(localWorkSize, elementCount);   // rounded up to the nearest multiple of the localWorkSize

            // load sources, create and build program
            CLProgram program = context.createProgram(HelloJOCL.class.getResourceAsStream("VectorAdd.cl")).build();

            // A, B are input buffers, C is for the result
            CLBuffer<FloatBuffer> clBufferA = context.createFloatBuffer(globalWorkSize, READ_ONLY);
            CLBuffer<FloatBuffer> clBufferB = context.createFloatBuffer(globalWorkSize, READ_ONLY);
            CLBuffer<FloatBuffer> clBufferC = context.createFloatBuffer(globalWorkSize, WRITE_ONLY);

            out.println("used device memory: "
                    + (clBufferA.getCLSize()+clBufferB.getCLSize()+clBufferC.getCLSize())/1000000 +"MB");

            // fill input buffers with random numbers
            // (just to have test data; seed is fixed -> results will not change between runs).
            fillBuffer(clBufferA.getBuffer(), 12345);
            fillBuffer(clBufferB.getBuffer(), 67890);

            // get a reference to the kernel function with the name 'VectorAdd'
            // and map the buffers to its input parameters.
            CLKernel kernel = program.createCLKernel("VectorAdd");
            kernel.putArgs(clBufferA, clBufferB, clBufferC).putArg(elementCount);

            // asynchronous write of data to GPU device,
            // followed by blocking read to get the computed results back.
            long time = nanoTime();
            queue.putWriteBuffer(clBufferA, false)
                    .putWriteBuffer(clBufferB, false)
                    .put1DRangeKernel(kernel, 0, globalWorkSize, localWorkSize)
                    .putReadBuffer(clBufferC, true);
            time = nanoTime() - time;

            // print first few elements of the resulting buffer to the console.
            out.println("a+b=c results snapshot: ");
            for(int i = 0; i < 10; i++)
                out.print(clBufferC.getBuffer().get() + ", ");
            out.println("...; " + clBufferC.getBuffer().remaining() + " more");

            out.println("computation took: "+(time/1000000)+"ms");

        }finally{
            // cleanup all resources associated with this context.
            context.release();
        }

    }

    private static void fillBuffer(FloatBuffer buffer, int seed) {
        Random rnd = new Random(seed);
        while(buffer.remaining() != 0)
            buffer.put(rnd.nextFloat()*100);
        buffer.rewind();
    }

    private static int roundUp(int groupSize, int globalSize) {
        int r = globalSize % groupSize;
        if (r == 0) {
            return globalSize;
        } else {
            return globalSize + groupSize - r;
        }
    }

}

这个程序大概算5000万次加法运算吧 

device = context.getMaxFlopsDevice(CLDevice.Type.GPU);

这里可以指定用CPU还是GPU

测试后如图

,没优化代码情况下, 这个显卡还没我CPU算的快

还有其它的demo 自己看官网文档即可

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
Jack001
粉丝 10
博文 10
码字总数 3937
作品 0
北京
后端工程师
如何基于AM57x测试OpenCL的加速性能?

1 实验说明 本例程测试功能:读取指定的图像数据,然后对图像进行灰度转换和Canny算法处理,计算处理过程所耗的时间,并将处理后的图像保存到当前目录下。 本例程主要是测试OpenCL是否对这两...

Tronlong
07/04
0
0
编译ffmpeg“ERROR: opencl not found”问题

编译ffmpeg“ERROR: opencl not found”问题。 ffmpeg在2.x版本支持opencl,可以利用硬件对转码进行加速,故进行编译尝试。 /tmp/ffconf.UNWNaz4r.c:1:23: error: OpenCL/cl.h: No such fil...

张旭0512
2014/05/10
0
1
GPU编程--OpenCL基本概念

本篇结构: 背景 OpenCL是什么 框架组成 基本概念 编写OpenCL程序的基本步骤 参考博文 一、背景 在过去利用GPU对图像渲染进行加速的技术非常成熟,因为GPU是典型的单指令多数据(SIMD)的体系...

w1992wishes
05/23
0
0
苹果弃用 OpenCL 和 OpenGL ,OpenCL 或遭全面淘汰

随着昨天 MacOS 10.14 Mojave 的发布,苹果悄然证实,他们已弃用 OpenGL 和 OpenCL 。 在 MacOS 10.14 的更新文档中,苹果表示使用 OpenGL 和 OpenCL 构建的应用可以继续在 macOS 10.14 中运...

王练
06/06
0
15
ffmpeg2.x开始支持opencl,编译测试

ffmpeg2.x开始支持opencl了,可以对编解码进行加速。 版本:ffmpeg2.2 1. 编译ffmpeg 在configure命令行中增加--enable-opencl, 运行报错了。 错误信息是:"ERROR: opencl not found" 好吧,...

张旭0512
2014/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之PrintStreamWriter

* A <code>PrintStream</code> adds functionality to another output stream, * namely the ability to print representations of various data values * conveniently. Two other fea......

老韭菜
51分钟前
0
0
qduoj~前端~二次开发~笔记

青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker。安装环境是Ubuntu14-64bit 1.安装一大...

虚拟世界的懒猫
55分钟前
6
0
ConcurrentHashMap源码解读

部分内容转自:http://jiabinyuan.xyz/#/app/archive/detail/25 内部结构 内部采用了segment结构,每一个segment相当于一个hashtable。看下面的结构图: 从图的结构我们可以了解到,Concurr...

edwardGe
今天
1
0
Ubuntu终端Tab键自动补全

打开 /etc/bash.bashrc,找到下列代码,取消注释。 #enable bash completion in interactive shells#if ! shopt -oq posix; then# if [-f /usr/share/bash-completion/bash_compl......

大熊猫
今天
0
0
polipo socks5代理转http代理

天朝的网络,哎~ 装个 yarn 都时而会卡 假设在SSlocal 已经装好运行的前提下,来安装设置 polipo sudo apt-get install polipo sudo vim /etc/polipo/config 追加下列配置内容,并保存 socksP...

纯洁徐
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部