文档章节

利用JOCL进行opencl开发之helloworld

Jack001
 Jack001
发布于 2017/09/07 15:35
字数 770
阅读 111
收藏 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
昌平
后端工程师
私信 提问
iPhone 将采用 OpenCL 并行计算技术

一周前,苹果以 320 万英镑(约合 480 万美元)入股英国图形芯片设计公司 Imagination Technologies Group(以下简称 IMG)3.6% 的股份,同时 IMG 还宣布苹果获得了该公司的 PowerVR 移动图形处理...

oschina
2008/12/31
691
1
编译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
如何基于AM57x测试OpenCL的加速性能?

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

Tronlong
2018/07/04
139
0
GPU编程--OpenCL基本概念

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

w1992wishes
2018/05/23
0
0
OpenCL 1.2正式发布,并行加速计算新标准

Khronos Group今天宣布,已经批准并公开发布了现代处理器的跨平台、并行计算编程标准“OpenCL 1.2”,当然继续开放、免版税。OpenCL 1.1发布十八个月后,在三十多家行业领先企业的共同努力下...

小卒过河
2011/11/17
2.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

sql根据日期查询,本周,本月,本年,今日相关统计

sql根据日期查询,本周,本月,本年,今日相关统计 昨天 select * from tb where datediff(day, 时间字段 ,getdate()) = 1 今天 select * from tb where datediff(day, 时间字段 ,getdate()) = ...

BraveLN
32分钟前
3
0
Delphi 折叠代码编译变量$REGION

编译变量$REGION,用于在delphi2006以后版本的折叠代码显示,非常方便。 procedure TForm1.Button1Click(Sender: TObject); var uStr: UnicodeString; begin {$REGION '显示uStr变量内容'} ......

dillonxiao
33分钟前
1
0
【更新】SyntaxEditor发布v2018.1,可共享相同代码库

SyntaxEditor最新版本下载 SyntaxEditor是一款强大的代码语法检验控件,采用了当今最前沿的代码编辑的技术,可以为你代码编辑提供强大的管理功能。最新版支持Visual Studio 2013和Windows 8...

电池盒
34分钟前
3
0
如何在基于Bytom开发过程中集成IPFS

本文介绍了基于Bytom开发过程中集成IPFS。 step1: 搭建bytom节点 比原相关资料:https://github.com/Bytom-Community/Bytom_Docs 搭建bytom节点有很多方式,然后开启RPC调用模式。这里推荐用...

比原链Bytom
38分钟前
1
0
sqlyog注册码

sqlyog注册码 1.方式一 用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417 a56ea5da-f30b-4fb1-8a05-95f346a9b20b a0fe8645-3916-45d4-9976-cb6b88fecc6c b70d7f66-dac2-4462-......

dragon_tech
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部