OpenCL用于多核CPU运算

wcblem4ak 2013-03-19 01:46:07
这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单线程串行运算时2.3秒滤波一次,用opencl给多核cpu进行并行计算,0.16秒滤波一次。i5-3470只有4核4线程啊。。。如何得到14倍左右的性能提升的?算法我也比较过代码了,基本上是一样的,只是一个写成了并行的kernel,一个是串行的for循环,没有相差太多

望高手能分析下原因,拯救我一下,寝食难安啊,万分感谢
...全文
775 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonebroken 2013-04-20
  • 打赏
  • 举报
回复
如果你的单核单线程是没有使用SIMD,而4核4线程用SIMD加速,理论上有4*4=16的加速比
卞亚涛 2013-04-03
  • 打赏
  • 举报
回复
引用 7 楼 wcblem4ak 的回复:
引用 6 楼 bianjunlan 的回复:引用 5 楼 wcblem4ak 的回复:引用 4 楼 bianjunlan 的回复:引用 楼主 wcblem4ak 的回复:这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单……
嘿嘿,多多交流。
wcblem4ak 2013-04-02
  • 打赏
  • 举报
回复
引用 6 楼 bianjunlan 的回复:
引用 5 楼 wcblem4ak 的回复:引用 4 楼 bianjunlan 的回复:引用 楼主 wcblem4ak 的回复:这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单线程串行运算时2.3秒滤波一次,用openc……
谢谢,我去找一下这本书看一下,我也觉得应该是单核运算过程中,计算以外的开销占用了时钟,导致计算效率的降低
卞亚涛 2013-04-01
  • 打赏
  • 举报
回复
引用 5 楼 wcblem4ak 的回复:
引用 4 楼 bianjunlan 的回复:引用 楼主 wcblem4ak 的回复:这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单线程串行运算时2.3秒滤波一次,用opencl给多核cpu进行并行计算,0.16秒滤波……
你说的有道理。 我觉得这可能是由于不同情况下调用开销的问题,CPU情况下,有很多逻辑运算单元参与循环操作,opencl情况下,可能有些逻辑工作已经蕴涵于kernel的设计之中。 另外, opencl在cpu上实现时,还会精心处理关于内存的使用,以减少内存冲突的几率。 以上只是我的猜测,具体可以参见《Heterogeneous computing with OpenCl》第六章关于opencl在cpu上的实现部分。
wcblem4ak 2013-04-01
  • 打赏
  • 举报
回复
引用 4 楼 bianjunlan 的回复:
引用 楼主 wcblem4ak 的回复:这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单线程串行运算时2.3秒滤波一次,用opencl给多核cpu进行并行计算,0.16秒滤波一次。i5-3470只有4核4线程啊。。。如……
谢谢你的回复,我确实在做opencl,以前做cuda开发的,最近转投到了opencl上,就是因为要做arm下的GPGPU 但是,我个人觉得,4核心cpu,单核计算能力和4核计算能力,最多只有4倍的差距,我不管opencl内部如何划分他的运算结构,硬件性能上的瓶颈理论上应该是无法跨越的,我只是想知道,到底是什么原因造成这个性能飞跃
卞亚涛 2013-03-30
  • 打赏
  • 举报
回复
引用 楼主 wcblem4ak 的回复:
这两天把OpenCL用在了多核cpu上,我用的i5-3470,开始跑了下nvidia提供的opencl样例程序“中值滤波”,我把代码更改了下,用i5的多核cpu跑了起来,测了一下,滤波一次,用cpu单核单线程串行运算时2.3秒滤波一次,用opencl给多核cpu进行并行计算,0.16秒滤波一次。i5-3470只有4核4线程啊。。。如何得到14倍左右的性能提升的?算法我也比……


lz,这个是opencl把cpu也映射成了它的计算设备,opencl能将cpu,gpu,fpga等计算设备统一映射到它的平台上。虽然你的cpu只有四核,但是在opencl平台模型中,它可以有更多的compute uint,每个compute可以有一个以上的work group。下面这张图是我在自己电脑上查询opencl设备时候的结果,我的电脑cpu也是4核(伪8核),你可以看看映射的资源数目。



建议你学习一下opencl,感觉将来尤其有用,尤其是很多嵌入式厂商也开始支持opencl。
FancyMouse 2013-03-29
  • 打赏
  • 举报
回复
你确定没有显卡参与计算?
FancyMouse 2013-03-29
  • 打赏
  • 举报
回复
那就可能是测时代码有问题。上代码。
wcblem4ak 2013-03-29
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
你确定没有显卡参与计算?
没有啊,opencl获取平台的时候,选用的就是intel的平台,获取device id的时候,使用的是CL_DEVICE_TYPE_CPU,显卡应该不会参与运算吧 又或者,intel在制作多核cpu opencl驱动时,把使自带的核心显卡也加入到运算中了?
这是一个基于Delphi XE2的OpenCL控件。其中使用到了Khronos Group Inc.的CL.pas单元。 OpenCL的设计思路和OpenGL类似,对于大部分Delphi的设计者来说,非常不习惯,而且使用起来并不十分方便 设计这个TOpenCL控件的目的不是替代OpenCL的原生使用方式,而是为了开发者能够快速对OpenCL进行应用并且可以 用来测试性能和功能。 使用TOpenCL控件,可以象使用数据库控件那样方便的去调用OpenCL程序,不需要太多代码就可以运行一个OpenCL 的Kernel。这对于学习和深入研究OpenCL的性能有一个很好的铺垫。 使用OpenCL做并行计算的一个主要因素就是提高大数据量计算的速度,这和通常的业务处理类程序大不相同,因 此提升OpenCL的运行效率是至关重要的,本控件附带的Demo程序中,是对两个长度分别为8192和32的float数组,进行 一维卷积计算的。在选择不同的数据传递方式(如使用显存还是Host内存、使用只读方式还是可读写或者只写方式), 或者不同的Device(如在多核CPU上和GPU上运行Kernel程序)上运行,其效率相差是非常大的。 Demo程序中缺省的使用不显示获取结果的方式运行,缺省的数据传输是使用显存(CPU作为Device的时候,其实还 是系统内存)并Copy数据的方式,因此显示结果始终是0。当输出的参数传递方式改为直接使用系统内存指针的方式时, 不使用显示获取计算结果则是可以得到运算结果的。这些参数之间的差异,读者自行测试并仔细体会,通过调整,相信 可以得到最佳的运行方式。 Demo中包含了四个Kernel函数,分别是Convolution_Kernel_With_Barrier。这是一个带有同步函数Barrier的卷积 过程,并在卷积完成后,等待所有单元计算完毕,然后对结果进行微分(差商)处理,实际情况表明Barrier函数对GPU 的影响甚微,但如果使用CPU作为Device计算,则效率影响非常大,其耗时几乎和单核计算不相上下,估计是同步函数 在等候的过程中,引起了CPU对Catch竞争访问的结果吧。对这种情况,反倒不如拆分成两个Kernel进行单独计算,其累 积的计算时间基本上为两个独立Kernel耗时只和。 Differ_Kernel是单独进行微分计算的,是为了验证上面计算耗时结果的。 Convolution_Kernel是只进行卷积计算的,可以认为和Differ_Kernel前后执行,其结果应该和Convolution_Kerne- l_With_Barrier单独执行是一样的。 Convolution则是一个简单的计算过程,用来测试启动Kernel、等候数据等操作会占用的时间情况的。 OpenCL其实并不是想象中那么美妙,也不是想象中的那么复杂,但要使用好OpenCL,就必须认真的对待每个细节, 甚至到每一个函数调用或者if控制等,大家可以参考“http://hi.baidu.com/fsword73”,上面涉及到的很多方面,都是 可以提升Kernel运行效率的。 目前这个TOpenCL控件只是作者为了测试OpenCL运行效率编写的一个小的工具,作为一个测试工具或者技术积累阶段 的工具足矣,但在实际工程中,希望还是能够尽可能使用原生的调用方式,控件模式势必会带来一定的性能损失的,这是 无法克服的是一个实际情况,对于某些流式数据处理的计算而言,多次重复使用同一个Kernel对流式数据进行处理的,则 使用本控件应该不会造成太大的性能影响。 目前TOpenCL不支持多个Device同时工作,可以选择CPU、GPU或者APU作为首选设备, X86下运行正常,X64下运行仍有 问题,疑和cl.pas中对context等处理的方式不支持X64或者其他原因。 目前支持的OpenCL版本为1.2。控件没有考虑OpenCL和OpenGL协同工作的情况,需要做这方面应用或者测试的读者,请 自行处理。 一下是控件几个主要类的引用关系图。供参考。 由于时间的关系,不可能提供详细的使用说明,往谅解,有问题可邮件与作者联系或者QQ联系。 Mail:18909181984@189.cn QQ:57440981 TOpenCL --| | |--TclKernels --| |--- TclKernel --| | |-- TclK

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧