2009-09-12 57 views
6

我已经看到很久以前使用hlsl/glsl着色器代码完成此操作 - 在源代码文件上使用#include,该代码将代码粘贴到char*中,以便在运行时不会发生文件IO。使用#include加载OpenCL代码

如果我是它表示为伪代码,它看起来有点像这样:

#define CLSourceToString(filename) " #include "filename" " 
const char* kernel = CLSourceToString("kernel.cl"); 

现在当然是#define是行不通的,因为它只会尝试使用这些引号来启动字符串。

+0

这里没有问题。 – dajobe 2009-09-12 16:42:19

回答

12

查看子弹物理引擎使用OpenCL for how将其做到kernel

在C++/C++源

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

在OpenCL的源

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

如果你的.cl文件包含逗号不包含在圆括号之间,如“int x,y;”,它会在“int x”后结束你的字符串。 – 2016-01-12 16:16:42

4

根据this,这是不可能的,但您可以使用xxd -i实现相同的效果。