目前正在实现一个gpgpu分类器使用webgl通过渲染到纹理。虽然我有一个工作的分类器,但我很难比较它的执行时间,特别是比较它和默认的js排序。
我有三个主要的gpu排序功能:
initGpu(..)
-设置纹理、缓冲区、帧缓冲区、etc.sortGpu(..)
-设置制服并运行着色程序对输入纹理进行排序以绘制到framebuffer+texturereadFB(..)
--使用readPixels
转储给定帧缓冲区的内容。
对于时间cpu排序,我简单地将调用包装在一个时间差上,即
const a = [1, ..., 100];
const then = performance.now();
a.sort();
console.log(`${performance.now() - then}ms`)
以类似的方式包装sortGpu(..)
似乎会导致相同的毫秒数(~0.005),而不考虑增加输入数组的大小,直到绘制调用所需的时间超过允许的最大值,并且gl实例丢失为止。我会理解值在一定程度上是相同的,但我的GPU有~1000个库达核,所以它肯定会放慢速度,长度超过这个值。
根据我的理解,对gl的调用在js中是完全连续的,下面的内容意味着在完成绘图之后,x被显式地修改了,这是使批处理绘图更高效的部分原因。
gl.drawArrays(...);
x += 10;
readFB(..)
(因此我假设是readPixels(..)
)需要这种顺序,因为否则它输出的数组就不可靠。知道了这一点,我意识到应该可以使用前面的方法准确地记录sortGpu(..); readFB(..)
的时间,但这会增加我不感兴趣的开销;我打算将输出保留为GPGPU其他地方使用的纹理。
发布于 2022-08-18 03:50:09
根据我的理解,对gl的调用在js中完全是连续的。
好吧..。是和不是。通常,GPU将对CPU异步执行其计算。CPU只会在必要时停止并等待GPU,以保持顺序一致性的错觉。正如您所观察到的,从GPU读取数据是一个需要CPU等待的操作。但是,有一个可能有用的函数: glFinish (在WebGL中可以作为gl.finish()访问)。
根据OpenGL ES 2.0参考(这是WebGL 1.0的基础):
5.1
命令
空终(空);
强制所有先前的GL命令完成。直到以前对GL客户端和服务器状态以及框架缓冲区发出的命令的所有效果都完全实现后,Finish才会返回。
假设您的浏览器尊重这个请求(而不仅仅是忽略它),您应该能够在gl.finish()调用之后插入一个a.sort()调用,以获得更精确的时间。
https://stackoverflow.com/questions/73307199
复制相似问题