在对内核代码进行字符串化后更改 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);