6

两部分问题:

我正在开展一个学校项目,使用生命游戏作为试验 gpgpu 的工具。我正在使用 OpenCL 和 OpenGL 进行实时可视化,目标是让这个东西尽可能大和快。在分析后,我发现帧时间由 CL 获取和释放 GL 缓冲区控制,并且时间成本与缓冲区的实际大小成正比。

1)这是正常的吗?为什么会这样?据我所知,缓冲区永远不会离开设备内存,而 CL Acquire/Release 就像互斥锁一样。OpenCL 会单独锁定/解锁每个字节还是什么?

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

在没有关于如何完全消除传输时间的任何想法(没有将我的内核从 OpenCL 移植到 GLSL,这将超出项目的原始范围),我现在认为我最好的选择是写入位图(与我当前使用的 8 位像素图相反),然后使用带有颜色索引的位图来纹理四边形。

2) 我可以直接使用位图对四边形进行纹理处理吗?我考虑过使用 glBitmap 绘制到辅助缓冲区,然后使用这个缓冲区来纹理我的四边形,但如果有可用的路线,我更愿意使用更直接的路线。

4

1 回答 1

2

CL/GL 互操作获取和释放调用背后的设计意图是让它们成为简单的所有权转移。然而,在许多早期的实现中,这些都是将图像从 CL 复制到 GL 并返回。

除非您使用 OpenCL 1.1 中的同步对象扩展,否则您需要在发布之前执行 clFinish 并在获取之前执行 glFinish;您看到这里花费了很多时间,因为所有排队的工作都必须在这些调用继续之前完成。有些平台可以使用 clFlush 代替 clFinish;检查供应商提供的 OpenCL 文档。

在或多或少最新的硬件上使用最新的 NVIDIA 和 AMD 驱动程序,我看到高清视频大小的图像的获取和发布调用非常迅速。

于 2012-12-09T19:48:31.503 回答