我有一个Marching Cubes的GPU实现,用于程序生成的isosurfaces作为BSc项目的一部分,在OpenFrameworks中使用OpenGL计算着色器实现。它运行,调试和以合适的帧速率工作,但我想看看我是否可以进一步优化它并消除任何潜在的瓶颈(特别是,那里有很多原子,我想找到如果这些减慢了很多)。
该算法使用6个链式计算着色器,其间存在内存障碍:
基本上我想知道的是算法在每个单独的着色器中花费了多长时间,但OpenGL的异步性质使得这很困难。我安装了强烈推荐的GDebugger,用于配置this implementation,它使用OpenCL进行计算,使用OpenGL进行渲染。不幸的是它打破了我的计划:-(独立的exe在Win7下工作正常,但试图在GDebugger中运行它会为每个着色器抛出这个:
[ error ] ofShader: checkProgramLinkStatus(): program failed to link
[ error ] ofShader: ofShader: program reports:
Compute info
------------
(0) : error C7006: no work group size specified
所以我需要另一种分析方式。我考虑过做这样的事情:
glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
glMapNamedBuffer(someBufferIJustUsed);
cout << ofGetElapsedTimef() << endl;
glUnmapNamedBuffer(someBufferIJustUsed);
希望这应该阻止,直到着色器完成写入缓冲区,并给我至少一个完成时间的球场图?但如果有人能指出这种方法存在严重缺陷或者知道更好的方法,请告诉我。