我正在开发一个使用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文件运行程序?我应该去哪个方向?
答案 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);