社区
OpenCL和异构编程
帖子详情
OpenCL和OpenGL内存同步的问题
so_soul1234
2017-03-03 04:10:46
现在OpenCL和OpenGL的处理用到了同一块共享内存PBO,但是OpenCL和OpenGL的处理部分放在了两个不同的线程里面在跑,利用glfinish()和clfinish()的机制会导致两个线程不通同时访问到这块共享PBO导致处理效果不理想,如何解决这个问题,能够提高处理效率?谢谢!
...全文
1700
1
打赏
收藏
OpenCL和OpenGL内存同步的问题
现在OpenCL和OpenGL的处理用到了同一块共享内存PBO,但是OpenCL和OpenGL的处理部分放在了两个不同的线程里面在跑,利用glfinish()和clfinish()的机制会导致两个线程不通同时访问到这块共享PBO导致处理效果不理想,如何解决这个问题,能够提高处理效率?谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fisherTHW
2017-04-13
打赏
举报
回复
assuming you called clEnqueueAcquireGLObjects and clEnqueueReleaseGLObjects?
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
--| | |--TclKernels --| |--- TclKernel --| | |-- TclK
OpenCL
与
OpenGL
协作方法
OpenCL
和
OpenGL
都能用于操作GPU,但是前者主要用于通用计算,而后者主要用于图像渲染。在某些情况下,我们希望能用
OpenCL
计得到算图像,然后展示在显示器上。如果直接调用
OpenGL
的现有API,则需要把计算得到的结果通过pci-e总线传回host端
内存
,再由
OpenGL
再次通过pci-e总线传回gpu端显存。这样就造成了额外的拷贝,传输开销。事实上,可以使用
OpenCL
的
OpenGL
扩
并行程序设计基础知识
OpenCL
是异构计算时代为典型的编程语言和编程模型,
OpenCL
编程需要一定的基础知识和特定的编程环境。
OpenCL
、
OpenGL
同时工作
视频处理如果能使用
OpenCL
、
OpenGL
、omap将大量提高运算速度,简单介绍
OpenCL
、
OpenGL
同时工作。
OpenCL
和
OpenGL
都能用于操作GPU,但是前者主要用于通用计算,而后者主要用于图像渲染。在某些情况下,我们希望能用
OpenCL
计得到算图像,然后展示在显示器上。如果直接调用
OpenGL
的现有API,则需要把计算得到的结果通过pci-e总线传回host端
OpenCL
、
OpenGL
同时工作。
视频处理如果能使用
OpenCL
、
OpenGL
、omap将大量提高运算速度,简单介绍
OpenCL
、
OpenGL
同时工作。
OpenCL
和
OpenGL
都能用于操作GPU,但是前者主要用于通用计算,而后者主要用于图像渲染。在某些情况下,我们希望能用
OpenCL
计得到算图像,然后展示在显示器上。如果直接调用
OpenGL
的现有API,则需要把计算得到的结果通过pci-e总线传回host端
OpenCL和异构编程
603
社区成员
575
社区内容
发帖
与我相关
我的任务
OpenCL和异构编程
异构开发技术
复制链接
扫一扫
分享
社区描述
异构开发技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章