一、什么是Kernel
最近因项目需要,简单了解并学习了下OpenCL开发,但是发现网上资料有一些,但是算不上丰富。
还是先简单捋一下流程,想要执行一段复杂的计算,我们应该如何做?
通常在CPU上,是通过循环来完成的,即串行执行,自然效率较低,而GPU具有天然的高效率并行执行优势,如果我们可以让GPU来完成这段计算,那么必定速度嗖嗖的。
了解OpenCL的人,应该对kernel不陌生,说白了就是一段跑在GPU上的代码,一般是使用C编写,也可使用C++。但是似乎NVIDIA和intel平台,不支持C++,AMD平台可以支持,一般用C编写一定没问题。
kernel一般以*.cl的文件形式存在,并通过OpenCL的API加载和编译,以及执行。没错,这玩意是在你的宿主程序运行时期编译的。
二、需要解决什么问题
当使用C编写一个kernel时,一般就是调用clBuildProgram函数来对*.cl进行编译,你要编译一次kernel时,就只能启动一次宿主程序,如果你的宿主程序很大,那么每编译一次kernel一定很费劲。
然后,就希望有一个独立的编译器,可以直接编译我的kernel,以验证我写的kernel是否可以编译通过。但是,我在网上似乎没找到kernel的编译器,有的只是一个API函数。
三、自己动手造轮子
于是乎,没有轮子,我就自己造一个,我称之为OpenCL Kernel Compiler,基于Qt开发。
尝试写了一个kernel,编译,自动提示报错,再回头修改kernel代码,再继续编译,如此几个来回,kernel代码已经写好了,并且编译通过,果真舒服。
编译成功,运行效果如下:
比如,我故意写入错误的代码,编译报错,效果如下:
使用帮助:
- 先选择平台和设备,表示后续编译kernel会为该设备生成可执行文件;
- 再选择kernel文件*.cl,编译选项为可选,一般为空即可;
- 最后选择Build编译,即可在Build log窗口中看到编译结果,如果报错会提示报错信息。
目前只实现了对单个kernel文件的编译,不支持多文件。
可执行文件下载地址:
https://pan.baidu.com/s/1iygiGtx4p4p_lc2J2WjJaw 提取码: tqxx
注意,该可执行程序非静态编译,需要Qt 5.12.3运行库。
源码地址:
https://gitee.com/bailiyang/cdemo/tree/master/Qt/64OpenCLKernelCompiler/OpenCLKernelCompiler
编译时,使用AMD提供的OpenCL开发包,AMD APP SDK,可参考《在Windows下搭建OpenCL环境》。
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。