在对内核代码进行字符串化后更改 openCL C++ 的主机端代码
Changing Host side code for openCL C++ after stringifying the kernel code
我正在开发一个使用 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++ 绑定的好教程,它展示了如何 运行 使用字符串化内核而不是来自 .cl 文件的程序?我应该往哪个方向走?
您可以使用字符串而不是文件名简单地创建一个 cl::Program
。
这就是您要做的所有事情:)
检查API。
这里真的没有问题。只是:
// 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);
我正在开发一个使用 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++ 绑定的好教程,它展示了如何 运行 使用字符串化内核而不是来自 .cl 文件的程序?我应该往哪个方向走?
您可以使用字符串而不是文件名简单地创建一个 cl::Program
。
这就是您要做的所有事情:)
检查API。
这里真的没有问题。只是:
// 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);