【问题标题】:How to integrate CPP applications with OpenCL code如何将 CPP 应用程序与 OpenCL 代码集成
【发布时间】:2015-06-30 08:44:38
【问题描述】:

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

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

【问题讨论】:

  • ... I didnt saw any examples for this need. 很多例子here
  • 重复this

标签: opencl


【解决方案1】:

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

A.内核代码。 由 1 到多个内核函数组成,它们在设备上执行您的计算。

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

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

  2. 构建你的内核

    const char * code = load_program_source("kernel.cl"); cl_program 程序 = clCreateProgramWithSource(context, 1, (const char **)&code, NULL, &err); errWrapper("clCreateProgramWithSource", err);

  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, &tasksize, NULL, 0, NULL, NULL));

  6. 等待终止 clFinish(command_queue)

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

    clEnqueueReadBuffer

  8. 使用 opencl 计算创建的结果继续编写您的 c++ 代码。

这就是在代码中使用 opencl 的基本思想。 最好开始做一个完整的 opencl 教程。 (谷歌一下,你会淹没在 opencl 教程中)

您应该熟悉的概念: opencl 主机接口 命令队列 内核参数。 工作组 局部尺寸 本地内存 全局内存 cl_mem 对象

调试 opencl 是可能的,但很痛苦。我建议使用 NORMAL C 代码进行调试,如果可行,将其移植到 opencl。

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

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

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2016-09-25
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2011-07-25
    • 2015-05-08
    相关资源
    最近更新 更多