两部分问题:
我正在开展一个学校项目,使用生命游戏作为实验 gpgpu 的工具。我使用 OpenCL 和 OpenGL 进行实时可视化,目标是让这个东西尽可能大、更快。经过分析,我发现帧时间主要由 CL 获取和释放 GL 缓冲区决定,并且时间成本与缓冲区的实际大小成正比。
1)这正常吗?为什么会这样呢?据我所知,缓冲区永远不会离开设备内存,并且 CL 获取/释放就像互斥锁一样。 OpenCL 是否单独锁定/解锁每个字节或其他什么?
为了解决这个问题,我从 24 位 RGBA 颜色模式(据我所知,OpenGL 的首选颜色模式?)缩减为 8 位 RGB 颜色。这导致了显着的加速,但是在调整我的内核之后,传输时间再次占据主导地位。
由于没有任何关于如何完全消除传输时间的想法(除了将我的内核从 OpenCL 移植到 GLSL 之外,这将超出项目的原始范围),我现在认为我最好的选择是写入位图( (与我当前使用的 8 位像素图相反),然后使用该位图和颜色索引来对四边形进行纹理处理。
2)我可以直接使用位图对四边形进行纹理化吗?我考虑过使用 glBitmap 绘制到辅助缓冲区,然后使用该缓冲区来纹理我的四边形,但如果可用,我更愿意使用更直接的路线。
CL/GL 互操作获取和释放调用背后的设计意图是让它们只是所有权转移。然而,在许多早期的实现中,这些都是从 CL 到 GL 来回复制图像。
除非您使用 OpenCL 1.1 中的同步对象扩展,否则您需要在释放之前执行 clFinish,在获取之前执行 glFinish;你will看到这里花费了大量时间,因为所有排队的工作都必须在这些调用继续之前完成。有些平台您可以使用 clFlush 而不是 clFinish;检查供应商提供的 OpenCL 文档。
通过在或多或少最新的硬件上安装最新的 NVIDIA 和 AMD 驱动程序,我发现高清视频大小的图像的获取和释放调用速度非常快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)