GpuDriven中的alignment

最近在实现gpu driven的事情,在alignment和padding上面踩了一些坑;
先说结论,如果是想尽量少踩坑,在设计数据结构时候都保证是能pad到16byte(float4)倍数的会让问题少非常多。

这里罗列几个要点,有一些并没有明显的文档(可能有,但是常规文档中没看到)

  1. gpu中读资源时候强制做了align操作,导致非16byte 的数据会出现错误
struct InstData
{
vec4 pos;
vec3 scale;
};
//使用InstData的const buffer,在每个instance读取的时候,地址会align(16 byte),导致数据读取错误;
//这样会好:
struct InstData
{
vec4 pos;
vec3 scale;
float padding;
};

  1. 注意c++和shader中的不同类的padding差异:如下数据如果gpu中读cpu的InstData类,数据就会因为padding出现错位
//cpp:
struct InstData
{
	u64 a;
	u32 b;
}

//gpu:
struct InstData
{
	UINT3 a;
}

3, structued buffer的非16byte align会导致数据跨cache line,导致performance降低:
https://developer.nvidia.com/content/understanding-structured-buffer-performance

发布了780 篇原创文章 · 获赞 460 · 访问量 165万+

猜你喜欢

转载自blog.csdn.net/ccanan/article/details/104288333