最近のGPUには、いくつかのピット上のステップ上記の整列とパディングで物事を達成するために駆動し、
それらはパッドの問題の16バイト(のfloat4)倍数を作ることができることが保証されているとき、それはデータ構造の設計では、より少ないステップピットをしようとした場合、結論で始まりますそれほど大変。
ここではいくつかの点のリスト、明確な文書は(持っているかもしれませんが、従来の文書を見ていない)が存在しません
- 整列操作を行うことを強制する場合、GPUがリソースを読んで、データが非16バイトのエラーになります
struct InstData
{
vec4 pos;
vec3 scale;
};
//使用InstData的const buffer,在每个instance读取的时候,地址会align(16 byte),导致数据读取错误;
//这样会好:
struct InstData
{
vec4 pos;
vec3 scale;
float padding;
};
- パディングとC ++シェーダ異なるクラス間の違いに注意してください:CPUのGPU InstDataクラスは、データが転位パディングとして表示されます場合は、以下のデータが読み込まれます
//cpp:
struct InstData
{
u64 a;
u32 b;
}
//gpu:
struct InstData
{
UINT3 a;
}
図3に示すように、キャッシュラインを横切る非16バイト整列原因データのstructuedバッファ、性能低下をもたらす。
https://developer.nvidia.com/content/understanding-structured-buffer-performance