WebGL GPGPU排序计时与调用顺序问题咨询
WebGL GPGPU排序器的计时问题
我通过渲染到纹理的方式,用WebGL实现了一个GPGPU排序器。排序器功能正常,但无法准确统计其执行时间,尤其没法和JS原生sort方法的耗时做对比。
GPU排序包含三个核心函数:
initGpu(..):初始化纹理、缓冲区、帧缓冲等资源sortGpu(..):设置uniform变量并运行着色器程序,将输入纹理排序后绘制到帧缓冲绑定的纹理上readFB(..):通过readPixels导出指定帧缓冲的内容
统计CPU排序耗时的方法很直接,用performance.now()计算时间差:
const a = [1, ..., 100]; const then = performance.now(); a.sort(); console.log(`${performance.now() - then}ms`)
但用同样方式包裹sortGpu(..)计时时,无论输入数组大小增加多少,耗时都维持在约0.005毫秒,直到绘制调用耗时超过上限导致GL实例丢失。我的GPU有约1000个CUDA核心,数组规模超过这个数值后理应变慢,这让我困惑。
我了解JS中GL调用是完全顺序执行的,比如以下代码中,x会在绘制完成后才被修改,这也是批量绘制更高效的原因之一:
gl.drawArrays(...); x += 10;
readFB(..)(以及readPixels(..))必须遵循这种顺序性,否则输出数组不可靠。我知道可以通过计时sortGpu(..); readFB(..)来获取准确时间,但这会引入不需要的额外开销——我希望将输出保留为纹理,用于其他GPGPU操作。
内容的提问来源于stack exchange,提问作者josh-stackexchange
相关产品推荐
相关产品推荐

