社区
OpenCL和异构编程
帖子详情
在OpenCL设备中kernel的执行
eawang
2020-04-30 01:27:25
在一个OpenCL环境中Kernel是如何运行起来的,比如接收到了怎样的命令的,对应的格式又是怎样的?
...全文
2875
回复
打赏
收藏
在OpenCL设备中kernel的执行
在一个OpenCL环境中Kernel是如何运行起来的,比如接收到了怎样的命令的,对应的格式又是怎样的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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
论文研究-一种针对异构计算平台的编译期优化方法.pdf
针对
OpenCL
(open computing language)编译时期的特有模式, 提出了一种新的针对异构计算平台的编译期优化方法。该方法根据
设备
端和主机端的各自特点, 将
设备
端的一些冗余操作提到主机端或者新的
设备
端
kernel
中
去
执行
, 以达到降低存储器读写的目的。这种方法充分利用了异构计算平台的特点, 较传统优化方法相对灵活。大多数情况下能有效提高
OpenCL
的运行速度, 测试用例
中
在应用原有编译器优化的基础上最快提高了270%。
GDB 调试 Linux C / C++
# 论 调试能力在开发程序
中
的重要性 调试是开发流程
中
一个非常重要的环境,每个程序员都应具备调试代码的能力,尤其对于从事 Linux C/C++ 开发的用户,必须具备熟练使用 GDB 调试器的能力。俗话说你有十分技能,那么其
中
包含了六分开发能力和四分调试能力。这套 GDB 入门视频教程能够做到深入浅出,让同学们能够快速学会使用 GDB 调试程序。# GDB 简介 GNU symbolic debugger,简称GDB 调试器,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端(Shell)
中
使用,它有很多选项,这是我们要重点学习的。 发展至今,GDB 调试器已经对 C、C++、Go、Objective-C、
OpenCL
、Ada 等多种编程语言提供了支持。实际场景
中
,GDB 更常用来调试 C 和 C++ 程序,虽然 Linux 平台下有很多能编写 C、C++ 代码的集成开发工具(IDE),但它们调试代码的能力往往都源自 GDB 调试器。
AMD
OpenCL
大学课程(4)
Kernel
就是在程序代码
中
的一个函数,这个函数能在
OpenCL
设备
上
执行
。一个
Kernel
对象就是
kernel
函数以及其相关的输入参数。
Kernel
对象通过程序对象以及指定的函数名字创建。注意:函数必须是程序源代码
中
存在的函数。在运行时,编译程序和创建
kernel
对象是有时间开销的,但这样比较灵活,能够适应不同的
OpenCL
硬件平台。程序动态编译一般只需一次,而
Kernel
对象在创建后,可以反复调用。创建
Kernel
后,运行
Kernel
之前,我们还要为
Kernel
对象设置参数。我们可以在
Kernel
运行后,重新设置参数再次运行。arg_index指定该参数为
Kernel
函数
中
的第几个参数(比
学习
OpenCL
与卷积神经网络 Day4——
OpenCL
内核(
Kernel
)程序构建
目录内核程序修饰符函数修饰符
kernel
修饰符地址空间修饰符全局地址空间局部地址空间常量地址空间私有地址空间对象访问修饰符主程序
中
内核创建内核对象设置内核参数
执行
内核内核函数样例 内核程序修饰符 函数修饰符 函数修饰符用来修饰
OpenCL
内核函数及一般函数的一些特性,以帮助编译器确定一些信息。
kernel
修饰符 __
kernel
修饰符声明一个函数为一个内核函数,这个内核函数将会在
OpenCL
设备
上
执行
,这也是我们最常用的修饰符。内核函数返回类型必须是void类型,且主机端可以调用这个函数。 __kerne
OpenCL和异构编程
603
社区成员
575
社区内容
发帖
与我相关
我的任务
OpenCL和异构编程
异构开发技术
复制链接
扫一扫
分享
社区描述
异构开发技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章