如何将CPP应用程序与OpenCL代码集成

时间:2015-06-24 13:03:46

标签: opencl

我正在开发Linux& CPP(使用Eclipse SDK)。 我是OpenCL(GPU编程)的新手 我想在GPU上执行我的一些代码(用openCL重写一些函数并在GPU上运行它们)。

我有点迷惑 - 如果我要编写一些代码(.cl文件),我怎样才能从我的cpp应用程序中调用它们? 我没有看到任何这种需要的例子。

1 个答案:

答案 0 :(得分:1)

如果你想使用opencl,有两部分代码。

一个。内核代码。 由1到多个内核函数组成,用于在设备上执行计算。

B中。主机代码 普通的c / c ++代码。这里发生了什么:

  1. 选择要在其上计算内核的设备(gpu / cpu / igpu / xeon phi / ...) 在opencl中,你有一组可以包含几个不同设备的平台。所以你选择一个平台和一个设备。 例: 平台:intel cpu + gpu opencl 1.2 device:cpu OR IGPU

  2. 构建你的内核

    const char * code = load_program_source(“kernel.cl”); cl_program program = clCreateProgramWithSource(context,1,(const char **)& code,NULL,& err); errWrapper(“clCreateProgramWithSource”,错误);

  3. 为内存传输到设备创建缓冲区:

    cl_mem devInput1 = clCreateBuffer(context,CL_MEM_READ_ONLY,variable1 * sizeof(int),NULL,& err);

  4. 转移到设备

    errWrapper(“setKernel”,clSetKernelArg(countKeyCardinality,0,sizeof(cl_mem),& devInput1));

  5. 启动内核

    errWrapper(“clEnqueueNDRangeKernel”,clEnqueueNDRangeKernel(command_queue,kernel_function1,1,NULL,&taskize,NULL,0,NULL,NULL));

  6. 等待终止 clFinish(command_queue)

  7. 从设备中获取结果 使用

    clEnqueueReadBuffer

  8. 使用opencl计算创建的结果继续执行c ++代码。

  9. 这就是在代码中使用opencl的基本思路。 最好开始做一个完整的opencl教程。 (只是google它,你将被淹没在opencl教程中)

    你应该熟悉的概念: opencl host api 命令队列 内核参数。 工作组 当地规模 本地记忆 全球记忆 cl_mem对象

    调试opencl是可能的,但很痛苦。我建议用NORMAL C Code进行调试,如果有效的话,将它移植到opencl。

    所有命令的主要来源是官方API文档,可在此处找到:opencl 1.2 api

    编辑:您不需要特殊的IDE来编写opencl代码。