在编写OpenCL代码时,为了方便起见,我们更喜欢将kernel源代码放在单独的文件中(一般为*.cl)。这各做的缺点在于,程序需要在运行时动态读入文件中的代码为字符串,然后再传递给OpenCL的RT编译、执行。因此,在可执行文件之外,我们还需要单独分发*.cl文件。
下面,我们介绍一种简单的技巧,将*.cl文件在编译时静态的包含在可执行文件中。
- 首先,将所有源代码由”STRINGFY()”括起来。
文件samefile.cl
中
STRINGIFY(
... // Lots of OpenCL code
)
- 然后,在C/C++文件中,定义第一步用到的宏“STRINGFY()”,通过”include” 预编译命令将cl文件做为字符串(可能会很长)导入。
在文件 somefile.cpp
中
#define STRINGIFY(src) #src
inline const char* Kernels() {
static const