【发布时间】:2015-06-30 08:44:38
【问题描述】:
我正在开发 Linux 和 CPP(使用 Eclipse SDK)。 我是 OpenCL 的新手(GPU 编程) 我想在 GPU 上执行我的一些代码(用 openCL 重写一些函数并在 GPU 上运行它们)。
我有点困惑 - 如果我要编写一些代码(.cl 文件),我如何从我的 cpp 应用程序中调用它们? 我没有看到任何满足这种需求的例子。
【问题讨论】:
标签: opencl
我正在开发 Linux 和 CPP(使用 Eclipse SDK)。 我是 OpenCL 的新手(GPU 编程) 我想在 GPU 上执行我的一些代码(用 openCL 重写一些函数并在 GPU 上运行它们)。
我有点困惑 - 如果我要编写一些代码(.cl 文件),我如何从我的 cpp 应用程序中调用它们? 我没有看到任何满足这种需求的例子。
【问题讨论】:
标签: opencl
如果要使用opencl,有两部分代码。
A.内核代码。 由 1 到多个内核函数组成,它们在设备上执行您的计算。
B.主机代码 普通的 c/c++ 代码。这里发生了什么:
为要计算的内核选择一个设备 (gpu/cpu/igpu/xeon phi/...) 在 opencl 中,您有一组平台,其中可以包含多个不同的设备。所以你选择一个平台和一个设备。 例子: 平台:intel cpu+gpu opencl 1.2 设备:cpu 或 IGPU
构建你的内核
const char * code = load_program_source("kernel.cl"); cl_program 程序 = clCreateProgramWithSource(context, 1, (const char **)&code, NULL, &err); errWrapper("clCreateProgramWithSource", err);
为内存传输创建缓冲区:
cl_mem devInput1 = clCreateBuffer(context, CL_MEM_READ_ONLY, variable1* sizeof(int), NULL, &err);
传输到设备
errWrapper("setKernel", clSetKernelArg(countKeyCardinality, 0, sizeof (cl_mem), &devInput1));
启动内核
errWrapper("clEnqueueNDRangeKernel", clEnqueueNDRangeKernel(command_queue, kernel_function1, 1, NULL, &tasksize, NULL, 0, NULL, NULL));
等待终止 clFinish(command_queue)
从设备中获取您的结果 使用
clEnqueueReadBuffer
使用 opencl 计算创建的结果继续编写您的 c++ 代码。
这就是在代码中使用 opencl 的基本思想。 最好开始做一个完整的 opencl 教程。 (谷歌一下,你会淹没在 opencl 教程中)
您应该熟悉的概念: opencl 主机接口 命令队列 内核参数。 工作组 局部尺寸 本地内存 全局内存 cl_mem 对象
调试 opencl 是可能的,但很痛苦。我建议使用 NORMAL C 代码进行调试,如果可行,将其移植到 opencl。
所有命令的主要来源是官方 API 文档,可以在这里找到:opencl 1.2 api
编辑:您不需要特殊的 IDE 来编写 opencl 代码。
【讨论】: