社区
OpenCL和异构编程
帖子详情
OPENCL能否同时运行多个kernel???
xzwjyd
2015-06-27 01:56:14
硬件是R9 280X 32个CU
理想是建32个Queue同时运行32个 Kernel,但实际是串行的!
OPENCL能否同时运行多个kernel???
...全文
726
1
打赏
收藏
OPENCL能否同时运行多个kernel???
硬件是R9 280X 32个CU 理想是建32个Queue同时运行32个 Kernel,但实际是串行的! OPENCL能否同时运行多个kernel???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xzwjyd
2015-06-27
打赏
举报
回复
kernel程序是相同的,每个的启动参数 globalWorkSize=64 localWorkSize=64 因为数据不同运行时间相差很大。 如果 globalWorkSize=2048 localWorkSize=64,一次性处理32组数据,总共运行时间是最慢的那组的运行时间,造成浪费。 所以想用每32个Queue,每个Queue处理一组数据各自调用。
Delphi XE2的
OpenCL
控件(可以象TQuery一样使用
OpenCL
)
这是一个基于Delphi XE2的
OpenCL
控件。其中使用到了Khronos Group Inc.的CL.pas单元。
OpenCL
的设计思路和OpenGL类似,对于大部分Delphi的设计者来说,非常不习惯,而且使用起来并不十分方便 设计这个T
OpenCL
控件的目的不是替代
OpenCL
的原生使用方式,而是为了开发者能够快速对
OpenCL
进行应用并且可以 用来测试性能和功能。 使用T
OpenCL
控件,可以象使用数据库控件那样方便的去调用
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
运行
效率的。 目前这个T
OpenCL
控件只是作者为了测试
OpenCL
运行
效率编写的一个小的工具,作为一个测试工具或者技术积累阶段 的工具足矣,但在实际工程中,希望还是能够尽可能使用原生的调用方式,控件模式势必会带来一定的性能损失的,这是 无法克服的是一个实际情况,对于某些流式数据处理的计算而言,多次重复使用同一个
Kernel
对流式数据进行处理的,则 使用本控件应该不会造成太大的性能影响。 目前T
OpenCL
不支持
多个
Device同时工作,可以选择CPU、GPU或者APU作为首选设备, X86下
运行
正常,X64下
运行
仍有 问题,疑和cl.pas中对context等处理的方式不支持X64或者其他原因。 目前支持的
OpenCL
版本为1.2。控件没有考虑
OpenCL
和OpenGL协同工作的情况,需要做这方面应用或者测试的读者,请 自行处理。 一下是控件几个主要类的引用关系图。供参考。 由于时间的关系,不可能提供详细的使用说明,往谅解,有问题可邮件与作者联系或者QQ联系。 Mail:18909181984@189.cn QQ:57440981 T
OpenCL
--| | |--Tcl
Kernel
s --| |--- Tcl
Kernel
--| | |-- TclK
OpenCL
优化小技巧:预创建所有
Kernel
最近做了一些图像处理的算法,跑在高通的开发板上,其中使用了
OpenCL
进行加速。在此过程中,也总结了几个加速的小技巧。今天就来谈其中一个不太有用的小技巧:预创建所有
Kernel
。 第一次进行
OpenCL
加速时,我注意到,创建cl_
kernel
时,会耗费几毫秒到二十几毫秒的时间。如果算法中需要创建几十个cl_
kernel
,那花费的时间也有几百毫秒了。这让人很难接受。 后来我又注意到,对于同一个K...
OpenCL
Kernel
编译工具开发
一、什么是
Kernel
最近因项目需要,简单了解并学习了下
OpenCL
开发,但是发现网上资料有一些,但是算不上丰富。 还是先简单捋一下流程,想要执行一段复杂的计算,我们应该如何做? 通常在CPU上,是通过循环来完成的,即串行执行,自然效率较低,而GPU具有天然的高效率并行执行优势,如果我们可以让GPU来完成这段计算,那么必定速度嗖嗖的。 了解
OpenCL
的人,应该对
kernel
不陌生,说白了就是一段跑在GPU上的代码,一般是使用C编写,也可使用C++。但是似乎NVIDIA和intel平台,不支持C++,AM
OpenCL
中
kernel
的循环调用
kernel
的循环调用主要是涉及缓冲区的创建和主机端命令同步
编程
OpenCL
内核
SPIR-V还允许用
OpenCL
C和C++为
OpenCL
编写的
OpenCL
内核由
OpenCL
以外的
运行
时执行,为投资于
OpenCL
内核编程的开发人员提供了更多的部署灵活性。例如,Google clspv开源编译器可以从
OpenCL
C内核源代码生成Vulkan SPIR-V着色器,Microsoft正在开发一个可以将
OpenCL
SPIR_V内核引入DX12的编译器链,并且早期已经在使用SPIR-V工具(如SPIRV Cross)将
OpenCL
SPIR-V内核引入Metal以在苹果平台上执行。
OpenCL和异构编程
602
社区成员
575
社区内容
发帖
与我相关
我的任务
OpenCL和异构编程
异构开发技术
复制链接
扫一扫
分享
社区描述
异构开发技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章