我正在写类似于OpenCL中的粒子系统的东西。所有粒子都有一个位置和一个颜色,该位置和颜色是即时计算的。在所有计算的最后,我想在屏幕上显示所有粒子。为此,我想将所有粒子值(许多粒子值)添加到2D直方图中,因此直方图很大(例如1920 * 1080)。
当前,我为此简单地使用由uint4(或float4)组成的缓冲区,这在我的应用程序中是一个(巨大的)瓶颈,因为它是对全局内存的分散/聚集操作:
//Obviously hugely simplified for your reading pleasure
for (int i = 0; i < 1000; i++) {
float calculatedYPixel = random() * 1080;
float calculatedXPixel = random() * 1920;
uint4 calculatedColour = (uint4) (0,27,244,55); //something random as well
histogram[(int) calculatedYPixel * histogramSize.x + (int) calculatedXPixel] += calculatedColour;
}
有什么办法可以加快速度吗?我目前正在使用OpenCL 1.2,但我也想听听涉及OpenCL 2,CUDA或OpenGL的解决方案。
- 所有粒子都可以最终覆盖直方图的整个区域,因此,不可能进行任何类型的平铺/有组织的访问。
- 我不介意在直方图中丢失几个粒子(例如,更新相互覆盖),速度要重要得多。
我也很好奇ROP(渲染输出单元)在这里是否可以使用,因为它们的功能看起来与这种类型的计算非常相似。从某些来源看来,GPU上的渲染缓冲区似乎可以针对例如写访问进行优化。