静态集成 OpenCL 的 Kernel 源代码到可执行文件

原创 2015年06月23日 14:26:38

在编写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 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
);

1. stackoverflow讨论
2. BoostCompute实例

版权声明:文章仅代表个人观点,未经博主允许不得转载。 https://blog.csdn.net/JackyTintin/article/details/46593757

OpenCL编译环境配置(VS+Nvidia)

英伟达的显卡首先要下载安装CUDA开发包,可以参考这里的步骤:   VS2015编译环境下CUDA安装配置 安装好CUDA之后,OpenCL的配置就已经完成了80%了,剩下的工作就是把OpenCL的路...
  • dcrmg
  • dcrmg
  • 2017-02-16 07:17:27
  • 3075

OpenCL从文本文件构建程序对象

Opencl创建程序对象主要有两种方式:由文本文件构建和由二进制文件构建。本文主要给出从文本文件构建程序对象的方法。 从文本文件构建程序对象的API函数是:extern CL_API_ENTRY cl...
  • zhouxuguang236
  • zhouxuguang236
  • 2014-03-19 22:32:13
  • 2907

OpenCL读取内核cl文件

普遍上的OpenCL编程都分为两个部分,一个为主机端代码,一个为设备端代码。 主机端代码的作用是:主要是负责设置设备执行代码的环境,以及与设备端的通信。 设备端代码的作用是:设备上所要执行的功能函...
  • u013684730
  • u013684730
  • 2017-06-11 13:17:19
  • 529

opencl: C++ 接口(cl.hpp)创建kernel

OpenCL不仅提供了标准C接口,同时提供C++的接口(cl.hpp),其实就是基于C接口的进一步封装。有了这个C++接口,对于C++项目来说,就大大提高了使用的便利性,本人涉及的这个项目对OpenC...
  • 10km
  • 10km
  • 2016-02-27 15:21:37
  • 2660

OpenCL: OpenCL快速入门教程

OpenCL快速入门教程原文地址:http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201翻译日期:2012年6月4日星...
  • Augusdi
  • Augusdi
  • 2013-10-15 15:51:52
  • 21470

膨胀腐蚀-OpenCL加速及kernel变成二进制文件

讨论后自己写了一个腐蚀膨胀,开操作: int myopen(Mat bwsrc, Mat &dstimg2, int kernelwidth = 2) { int comparerows = bws...
  • wd1603926823
  • wd1603926823
  • 2017-08-21 16:32:16
  • 462

OpenCL程序实例

序 OpenCL作为一门开源的异构并行计算语言,设计之初就是使用一种模型来模糊各种硬件差异。作为软件开发人员,我们关注的就是它的编程模型。OpenCL程序的流程大致如下: Platform 查...
  • fly_yr
  • fly_yr
  • 2016-04-27 11:34:43
  • 2750

Opencl 在线和离线编译

OpenCL 支持在线编译和离线编译两种编译方式,主要区别是内核程序提供给主机调用方式。 在线编译:在host程序中引入的是Kernel的源代码 离线编译:Host程序中引入的是在目标器件上运行的二进...
  • u013625961
  • u013625961
  • 2016-11-24 16:09:48
  • 966

OpenCL中kernel的循环调用

kernel的循环调用主要是涉及缓冲区的创建和主机端命令同步
  • u011028771
  • u011028771
  • 2016-10-09 10:47:37
  • 1567

Altera OpenCL入门(三)编译运行第一个OpenCL程序

主要参考官方的OpenCL的白皮书,还有培训视频,如果有需要的可以关注本人微博私信我,有问题也可以问我。 我的微博 去友晶官网下载如下的向量相加的实力,主要包括主机程序和内核程序两部分。其中M...
  • Pieces_thinking
  • Pieces_thinking
  • 2016-08-14 21:09:22
  • 2900
收藏助手
不良信息举报
您举报文章:静态集成 OpenCL 的 Kernel 源代码到可执行文件
举报原因:
原因补充:

(最多只允许输入30个字)