作者:婉婷雅铃43 | 来源:互联网 | 2023-09-16 10:37
我是搞图形图像的,经常使用OpenCV,初学OpenCL的目标也是应用到OpenCV里面(一种开放机器视觉库)然而发现几个问题:1)我看了几本OpenCL的书(OpenCV实战、编程指南、异构
我是搞图形图像的,经常使用OpenCV,初学OpenCL的目标也是应用到OpenCV里面(一种开放机器视觉库)
然而发现几个问题:
1)我看了几本OpenCL的书(OpenCV实战、编程指南、异构计算(第2版)),感觉里面的程序都是玩具程序,基本不能作为任何实用项目,只能作为理论学习;
2)如果应用到OpenCV里面,但是OpenCV3.0已经集成了OpenCL模块,你只要一行命令开启OpenCL模式,所有函数自动重载OpenCL版本,这样看来,学OpenCL就我来说意义不大了;
3)另外,成熟的视觉算法,例如SURF边缘检测算法,OpenCV也有专门的OpenCL的.cl版本,我看了下就被震住了,几百行的代码,看都看不懂,就知道如果真的自己写.cl文件,自己还是差的太远……
不知各位前辈怎么看?
自己还有一种感觉是,不应用与项目,很难理解OpenCL的精华吧,比如,有本书能结合SIFT算法(一种经典的边缘检测算法)来介绍OpenCL,就容易理解了吧——但是可惜目前的书籍都是从架构写起,缺乏实用性,有一本2015年10月份出的OpenCL教程看起来结合实际,叫《FPGA异构计算——基于OpenCL的开发方法》,也可惜自己不用FPGA……
3 个解决方案
你说的有一定道理, 很多上层的库已经集成了对 OpenCL及GPU的支持, 如 OpenCV 的很多算法,clBlas 库 等. 但 OpenCV和clBlas分别只限定于其特定的领域 (CV和矩阵运算), 很多其它领域,并没有现成的可用的库,需要用户自己写 OpenCL代码, 如在 深度神经网络学习中,各种 Activation 函数。 另一方面, 从 OpenCL 生态系统的角度, 当然是希望 各个领域的 OpenCL 应用库越多越好,开发者越方便, 但即使这些库有了,从性能优化的角度,这些库的实现未必是最佳的,很多时候仍然需要了解 OpenCL 才能进行定制和优化。还有一方面, clBlas, OpenCV 中的 OpenCL 使用并没考虑多个 GPU, 而在很多性能相关的情况, 利用多个 GPU 进行水平性能 scale 是很必要的。
另外,OpenCL 的学习真的很容易, 在 Host 端,其代码就是一个 C/C++ 的 API, 在设备端,其代码就是 C/C++ 的一变种。 我总结
OpenCL 编程用如下结果关键概括:
1) C/C++. 语言的语法就是 C/C++, 在kernel上增加了一些向量数据类型和操作.
2) Parallelism by SIMD or SIMT. 即不同的 kernel work items 执行的是相同的指令流,但访问的是不同的数据.
3) Lock-step 执行。 即一个计算单元内若干个 work items 是按完全同步的方式执行的, 它们在同一时刻执行相同的指令(不同的数据),这让 GPU 上线程的调度和CPU上不一样, 也让GPU单个ALU的逻辑更简单,所以能容纳更多的ALU, 实现更大的并行性。
4)硬件体系结构的支持。 如 GPU上可以用 Local Memory 实现以 group of work items 为逻辑单位的代码.
5) GPU是CPU的从属设备。 操作系统及应用的逻辑都是运行在 CPU 上, GPU最多是被 CPU上的应用控制流调用,以完成单个的算法或操作。