Intel核显+host多线程+OpenCL问题

之前Intel核显配置那篇时说过一个例子:

以前用AMD 560显卡时:CPU版本耗时约19s,OpenCL版本耗时约4.5s (单线程多线程均如此);我将这个例子直接移到(并没有改动)现在用的Intel skylake核显上:CPU版本耗时约17.3s(单线程多线程均是如此),单线程的OpenCL版本耗时约5s,但多线程的OpenCL版本竟然要38s~40s(但每个线程的结果有时会有数据异常,也就是结果不完全正确),有时更是会崩溃报错“double free or corruption 段错误吐核”!!!

大神告诉我几个可能的错误和建议:

(A) Kernel:你没有使用锁构成一个临界区保护kernel参数设定和启动,这个是不应当的。必须上临界区的。否则你可能导致各种莫名的错误。这是较小可能。   因为:是有些设备可以快速的接纳命令, 这样不完全的小区域, 在极短的时间内, 等于原子操作, 这样巧合的情况下可以无视锁,可以不用锁保护kernel,但有的设备也许接受命令较慢(并不一定是执行慢),这时候就需要锁了!这点是OpenCL手册强调的唯一一处host多线程不安全的地方了!让所有的host多个线程共享一个mutex(放在单例里),然后在kernel传参和启动时加上锁保护!!记住记住。这样就不再报莫名其妙的段错误或者数据异常了!但耗时却依旧要21秒左右 ?!!!!??我想要达到的效果是像以前AMD下一样单线程多线程OpenCL都是5秒。可是现在虽然不报错,但差得远?!

(B)Intel的核显,该显卡具有和其他普通显卡(A卡,N卡)不同的特性是, 它的一个EU,比A卡的一个CU能上的线程数量少的多的多。换句话说,小得多的kernel启动规模就能满载设备,不需要上12个host线程发布命令的。 建议改成2-3个线程足矣(这是为了能让你的一些操作步骤互相掩盖, 例如数据准备之类的)。请注意这不代表你的核显非常弱,反而说明了它更像CPU一点。

(C)如果代码不卡磁盘访问或者访存,请将CPU作为Device加入Context,Intel的平台这样用往往会有奇效(不一定)。 我的Intel核显有2个平台,其中平台Intel(R) OpenCL下 有2个devices:一个是GPU:Intel(R) HD Graphics  ;另一个是CPU:Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz  我如果将这些设备都利用起来,应该可以提高性能??多设备的例子我还没写过。

(D)最后。建议核显上不这样做(12个不同的buffers太多了),可以只上2-3个(刚才说过),或者还是12个, 但是将一个大buffer切分成多处(例如通过指定偏移量),这样你依然具有多个queues之间的数据操作和kernel计算的互相掩盖特性),同时还不至于在Intel的平台上造成失败之类的困难(相比A卡,N卡动辄GB级别的分配量,默认的Intel显卡只有MB级别的,稍微不注意就会失败。而切分公用,可以规避这一点)。


最终,我修改好后:

 Intel核显结果整理表(单位:秒) 
 OpenCL-host单线程耗时OpenCL-host多线程耗时(12个线程)非OpenCL版本
Intel核显单设备GPU:5单设备CPU:1.7多设备:4.2无论怎么选设备,最低耗时都要:15.817.3
原AMD电脑单设备AMD的gpu:4.5单设备AMD的gpu:4.519

表示很郁闷.............................................................................................................

.



/**********************************************************************/

看到一个牛人写的傅里叶变换的文章:https://news.cnblogs.com/n/209823/   超厉害!!!!!!!很佩服!!!!!!!!!!

另外还有一个人的 https://blog.csdn.net/maweifei/article/category/6131949/2  用opencv做图像处理的 也还好 可以看看。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页