如何将 CPP 应用程序与 OpenCL 代码集成
How to integrate CPP applications with OpenCL code
我正在开发 Linux 和 CPP(使用 Eclipse SDK)。
我是 OpenCL(GPU 编程)的新手
我想在 GPU 上执行我的一些代码(用 openCL 重写一些函数并 运行 它们在 GPU 上)。
我有点困惑 - 如果我要编写一些代码(.cl 文件),我如何从我的 cpp 应用程序中调用它们?
我没有看到任何这种需求的例子。
如果要使用opencl,有两部分代码。
一个。内核代码。
由在设备上执行计算的 1 到多个内核函数组成。
乙。主机代码
正常 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 program = clCreateProgramWithSource(context, 1, (const char **)&code, NULL, &err); errWrapper("clCreateProgramWithSource", 错误);
为内存传输到设备创建缓冲区:
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 教程。 (只是 google 它,你会淹没在 opencl 教程中)
您应该熟悉的概念:
opencl 主机 api
命令队列
内核参数。
工作组
局部尺寸
本地内存
全局内存
cl_mem 对象
调试 opencl 是可能的,但很痛苦。我建议使用 NORMAL C 代码进行调试,如果可以的话将其移植到 opencl。
所有命令的主要来源是官方 API 文档,可在此处找到:opencl 1.2 api
编辑:您不需要特殊的 IDE 来编写 opencl。
我正在开发 Linux 和 CPP(使用 Eclipse SDK)。 我是 OpenCL(GPU 编程)的新手 我想在 GPU 上执行我的一些代码(用 openCL 重写一些函数并 运行 它们在 GPU 上)。
我有点困惑 - 如果我要编写一些代码(.cl 文件),我如何从我的 cpp 应用程序中调用它们? 我没有看到任何这种需求的例子。
如果要使用opencl,有两部分代码。
一个。内核代码。 由在设备上执行计算的 1 到多个内核函数组成。
乙。主机代码 正常 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 program = clCreateProgramWithSource(context, 1, (const char **)&code, NULL, &err); errWrapper("clCreateProgramWithSource", 错误);
为内存传输到设备创建缓冲区:
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 教程。 (只是 google 它,你会淹没在 opencl 教程中)
您应该熟悉的概念: opencl 主机 api 命令队列 内核参数。 工作组 局部尺寸 本地内存 全局内存 cl_mem 对象
调试 opencl 是可能的,但很痛苦。我建议使用 NORMAL C 代码进行调试,如果可以的话将其移植到 opencl。
所有命令的主要来源是官方 API 文档,可在此处找到:opencl 1.2 api
编辑:您不需要特殊的 IDE 来编写 opencl。