目前,我已经实现了一个GLSL光线跟踪器,它使用缓冲区纹理来访问用于光线跟踪的加速结构。
我正在使用while循环遍历纹理,并且它非常昂贵,但我认为有希望让它更快。但似乎有一堵墙,我打算用,似乎无法修复。缓冲区纹理的大小有限,在我的GPU上它大约是200mb,我完全忘记它是什么。
我需要的数据结构大约为1GB。
有人向我推荐OpenCL解决问题,所以我研究了OpenCL,现在我对API很熟悉。但是,我发现OpenCL也存在类似的最大缓冲区大小问题。大多数GPU只允许您在单个缓冲区中访问总vram的1/4。大多数GPU都有1或2 gbs的vram,因此为我的结构创建1个缓冲区将无效。
似乎在GPU上获取我的数据结构的唯一方法是将其分解为多个缓冲区。我的问题是,最有效和快速的方法是什么,并且继续使用OpenCL或GLSL是明智的。我知道分支缓冲区/纹理读取可能代价高昂,而且看起来这就是我将其拆分的必要条件。你可以避免使用分支,如果你以某种方式将缓冲区读入数组并以某种方式索引缓冲区,但是,我经历过使用GLSL的索引非常慢,即使它只是索引本地数组(为什么会这样?)。我想知道如果你将缓冲区分组到内核中的数组中会发生同样的缓慢,如果可能的话。
答案 0 :(得分:1)
具有更新驱动程序的当前设备可以访问更多。 AMD有一个envvar可以让你设置得更高。
OpenCL可能是一个很好的解决方案。
此外,OpenGL 4.3增加了Compute Shaders,它非常类似OpenCL,非常适合具有OpenGL经验和现有OpenGL应用程序的人。
关于性能,由于工作组差异,内核中的循环可能是一个问题,如果您没有激活许多工作项,则可以减少设备占用。