【问题标题】:embedding OpenCL code into executable将 OpenCL 代码嵌入到可执行文件中
【发布时间】:2018-02-03 22:10:56
【问题描述】:

这是Using #include to load OpenCL code的后续行动

我注意到,当您使用 grrussel 描述的方法(并在 Bullet Physics 中使用)时,创建的字符串会删除所有换行符(cmets 似乎也被删除了,但我不太担心) .现在在大多数情况下,如果包含的 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;
   }
);

【问题讨论】:

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


    【解决方案1】:

    我会编写一个小工具,它可以从文本文件中生成带有常量字符串的 cpp,然后您可以将其与其他内容一起编译。

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

    无论如何,一个小型构建工具可以遍历目录中的文件并从中构建 cpp 就足够了,而且您可以在 15 分钟内完成一些工作(如果有合适的脚本技能)。

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

    【讨论】:

    • @HenryGomersall: xxd 在 Windows 上不容易使用,或者?
    • 我不知道 ;) 我认为它可以通过 msys 或 cygwin 获得。我发布评论是因为我花了一点时间才找到 xxd 解决方案首先遇到了你的答案,所以在 linux 下它肯定是一个很好的解决方案。
    • 当然。我会把它包含在答案中。
    【解决方案2】:

    很好的问题!

    适用于 Windows 的一件事是将 OpenCL C 文件视为 Windows 资源。然后将源代码内置到您的可执行文件中。在您的资源 (.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 可以让你做类似的事情。您可以使用导出为符号的源文件构建 elf .o。抱歉,我现在没有方便的代码 sn-p。

    我希望有一个更好的独立于平台的答案。如果你遇到了,请告诉我。

    【讨论】:

    • 一个独立于平台的解决方案是 Qt 的 moc 或 xxd 通过 cygwin/msys 或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多