在对内核代码进行字符串化之后,更改openCL C ++的主机端代码

时间:2016-10-12 15:19:05

标签: c++ kernel opencl stringification

我正在开发一个使用openCL C ++绑定的项目。我有一个kernel.cl文件,从主机端读取并加载和执行。但现在我想将它嵌入到我的.cpp文件中,这样我就可以在没有kernel.cl文件的情况下分发二进制文件。

我应用了STRINGIFY方法,但我不知道还有什么要改变以及要更改哪些代码行?

上一个代码:

的main.cpp

// Load in kernel source, creating a program object for the context
cl::Program programGA(context, loadProgram
                               ("../src/path/kernelGA.cl"),
                              true);

// Create the kernel functor
auto kernelGA = cl::make_kernel<cl::Buffer,
                                cl::Buffer,
                                cl::Buffer,
                                cl::Buffer,
                                cl::Buffer>
                                (programGA, "kernelGA");

// CREATE THE BUFFERS.
d_buff = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
                                (Length * P_SIZE * sizeof(double)),
                                asd);
....and so on...

// Enqueue the kernel.
kernelGA(cl::EnqueueArgs(queue[iter],
                                   cl::NDRange(P_SIZE / numberOfDevices)),
                                   d_buff1,
                                   d_buff2,.. and so on..);

// Enqueue in the corresponding device.
queue[iter].finish();

现在我应用了STRINGIFY方法,但我不知道要更改代码的哪些部分以及如何更改它们。因为现在应该从stringifiedSourceCL中读取内核并根据它,我应该更改我的程序以从stringifiedSourceCL而不是从文件中读取。

绑定后:

// in main.cpp
#define STRINGIFY(src) #src
char * stringifiedSourceCL =
#include "kernelGA.cl"

我应该改变哪些其他部分?有没有人知道一个关于openCL C ++绑定的好教程,它展示了如何使用Stringified内核而不是.cl文件运行程序?我应该去哪个方向?

2 个答案:

答案 0 :(得分:1)

您只需使用字符串而不是文件名创建cl::Program即可。 这就是你所要做的一切:)

检查API

答案 1 :(得分:1)

这里真的没问题。只是:

// in main.cpp
#define STRINGIFY(src) #src
const char * stringifiedSourceCL =
#include "kernelGA.cl"

...

// Creating a program object for the context
cl::Program programGA(context, stringifiedSourceCL, true);