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