将OpenCL代码嵌入到可执行文件中

时间:2011-11-23 20:39:05

标签: c++ visual-studio-2010 opencl

这是Using #include to load OpenCL code

的后续内容

我注意到当你使用grrussel描述的方法(并在Bullet Physics中使用)时,创建的字符串会删除所有换行符(注释似乎也被剥离了,但我也不是担心这一点)。现在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,那么这很好,但如果有代码将无法使用OpenCL编译器进行编译。

有没有办法让#include保留换行符,或者有更好的方法将opencl代码嵌入到我的可执行文件中(除了将字符串复制到cpp文件中并加上引号一切)?

我在Visual Studio 2010中对此进行了测试,我不确定其他编译器是否表现出相同的行为。我更喜欢一种不需要任何外部工具并与各种编译器/平台配合使用的方法。

从其他答案中复制代码:

在C ++ / C源代码

#define MSTRINGIFY(A) #A
char* stringifiedSourceCL = 
#include "VectorAddKernels.cl"

在OpenCL源代码中

MSTRINGIFY(
   __kernel void VectorAdd(__global float8* c)
   {
    // snipped out OpenCL code...
    return;
   }
);

2 个答案:

答案 0 :(得分:1)

很棒的问题!

在Windows上运行的一件事是将OpenCL C文件视为Windows资源。然后源代码内置到您的可执行文件中。在您的reasource(.rc)文件中,您可以添加如下内容:

IDR_OPENCL_FILE_1            OPENCL_SOURCE           "mydir\\myfile.cl"

然后,在主机源中,像这样:

// Load the resource memory
HRSRC resource = FindResource(NULL, L"IDR_OPENCL_FILE_1", L"OPENCL_SOURCE");
HGLOBAL resMem = LoadResource(NULL, resource);
char* source = (char*)LockResource(resMem);
// Build a STL string out of it
DWORD resSize = SizeofResource(NULL, resource);
std::string cl_source = string(source, resSize);

在Linux上,objcopy会让你做类似的事情。您可以将源文件导出为符号来构建精灵.o。对不起,我现在没有方便的代码片段。

我希望有更好的平台无关答案。如果你碰到它,请告诉我。

答案 1 :(得分:1)

我会编写一个小工具,使用文本文件中的常量字符串生成一个cpp,然后将其与其他内容一起编译。

这就是Qt的资源编译器moc所做的事情(以及更多,因为它周围有一个完整的API),还有Windows资源工具包的选项(参见下面的this answer)。

无论如何,一个小型构建工具可以在dir中遍历文件并从中构建cpp应该足够了,并且可以在15分钟内完成一些内容(给定合适的脚本技能)。

更新:根据Henry的评论,在Linux上(或使用Msys / Cygwin),您可以将xxd与-i(即xxd -i)标志一起使用,读取文件并生成一个c-include文件,其中包含正确定义的内容。