在编写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) #srcinline const char* Kernels() {
static const char* kernels =
#include "somefile.cl"
;
return kernels;
}
这样kernel代码就被静态的编译到可执行文件中,无需单独分必。在需要用到kernel函数进行计算时,只需要将返回的字符串(这里为”Kernels“)传递给OpenCL相应的函数进行处理即可。
当然,我们可以同时添加更多的文件,只要每个cl文件都被”STRINGFY“括起来。C++编译器会自动完成字符串的拼接。
inline const char* Kernels() {
static const char* kernels =
#include "utility_functions.cl"
#include "somefile.cl"
;
return kernels;
}
- 对于较多短的kernel代码,我们也可以直接在cpp源文件中将其字符串化。
#define STRINGIFY(src) #src
static const char*
Kernel = STRINGIFY(
// kernel definition
);
【原创|静态集成 OpenCL 的 Kernel 源代码到可执行文件】1. stackoverflow讨论
2. BoostCompute实例
推荐阅读
- 【C】题目|【C语言】题集 of ⑥
- 游戏|2022年如何学习前端前沿技术,破卷而出()
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- 机器学习|机器学习Sklearn学习总结
- Python|Python实战(使用线性回归预测房价)
- docker|Docker
- 腾讯|SaaS的收入模型有哪些(终于有人讲明白了)
- python|Python绘制冬奥吉祥物“冰墩墩”
- 大数据|【新书速递】流量运营教科书
- 编程语言|TIOBE 5月编程语言排行(Python再次挤掉Java,夺下榜二!)