OpenGL-OpenCL互操作传输时间+从位图纹理化

6

两个问题:

我正在使用生命游戏作为实验的载体,尝试使用gpgpu技术完成学校项目。我使用OpenCL和OpenGL进行实时可视化,目标是使其尽可能大且快速。在分析性能时,我发现帧时间被CL获取和释放GL缓冲区所占用,而时间成本与缓冲区的实际大小成正比。

1)这是正常的吗?为什么会这样?据我所知,缓冲区从未离开设备内存,而CL Acquire/Release的作用类似于互斥锁。OpenCL是否会逐个字节地锁定/解锁?

为了解决这个问题,我将颜色模式从24位RGBA(据我了解,这是OpenGL首选的颜色模式)缩小到8位RGB颜色。这导致速度显著提高,但在调整内核后,传输时间再次占主导地位。

如果没有任何想法可以完全消除传输时间(除非将内核从OpenCL移植到GLSL,这将超出项目的原始范围),那么我现在认为最好的办法是写入位图(而不是我当前使用的8位像素图),然后使用该位图和颜色索引来纹理化一个四边形。

2)我可以直接使用位图纹理化一个四边形吗?我考虑使用glBitmap绘制到辅助缓冲区,然后使用该缓冲区来纹理化我的四边形,但如果有更直接的方法,则更好。

1个回答

2
CL/GL互操作获取和释放调用的设计初衷是简单的所有权转移。然而,在许多早期实现中,它们会从CL复制图像到GL,然后再次返回。
在OpenCL 1.1中,除非使用同步对象扩展,否则您需要在释放之前进行clFinish,并在获取之前进行glFinish;由于所有排队的工作都必须完成才能继续这些调用,因此您将看到大量时间花费在这里。某些平台可以使用clFlush代替clFinish;请查阅您供应商提供的OpenCL文档。
通过最新的NVIDIA和AMD驱动程序以及较新硬件,我看到获取和释放调用对于高清视频大小的图像非常快。

太好了。我正在使用1.0版(由于硬件限制),很高兴知道这些问题已经得到解决。我想我真正需要的是一张新的显卡。 - evenex_code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接