我有一个计算内核,可以在网格的三角形上运行。根据分析器,查找顶点位置超过运行时间的一半:
int a = indices[idx];
int b = indices[idx+1]; // 0.7 %
int c = indices[idx+2]; // 0.1 %
Vertex v0 = vertices[ a ]; // 39.8 %
Vertex v1 = vertices[ b ]; // 7.3 %
Vertex v2 = vertices[ c ]; // 3.9 %
Vertex
如下:
struct Vertex {
packed_float3 position;
packed_float3 normal;
};
有没有办法可以改善这个?
我是否应该以渲染性能为代价切换到“三角汤”表示(无索引)?
我能以某种方式实现顶点缓存吗?
我是否应该尝试在计算内核中处理多个三角形并在索引匹配时重用顶点(我的网格将在连续三角形之间共享索引)?
更新:我觉得有趣的是,在我的个人资料中,渲染需要.9ms(网格不是那么大),这个迭代三角形的计算内核需要11ms。快速渲染性能表明我的网格的局部性没有大问题,因为渲染必须进行相同的索引。我怀疑巨大的性能差异是由于顶点缓存造成的。
更新2 :我设法忽略了以下警告:
警告:编译器无法预加载缓冲区:编译器无法在内核函数的索引0处预加载缓冲区。使用常量地址空间,结构或描述符简化内存访问模式。 (此框架中未使用此管道。)
vertices
和indices
都有警告。我不知道如何使用结构或常量地址空间,但描述符怎么样?我不确定如何在计算内核中使用描述符。