struct Foo
{
float4 Position;
float Radius;
};
StructuredBuffer <Foo> FooBuf;
如要在shader中使用struct,那建立一個StructuredBuffer就是必須的
而很久以前開始學(xué)的時候,我有看到
NVIDIA提到對齊對於效能的提升
這篇將上述結(jié)構(gòu)修改,變成:
struct Foo
{
float4 Position;
float Radius;
float pad0;
float pad1;
float pad2;
};
StructuredBuffer <Foo> FooBuf;
內(nèi)文提到僅僅只是讓它變成16bytes的倍數(shù),就能讓效能變好
不過這已經(jīng)是2015年的文章了,已經(jīng)到了可以反問自己的時候:
「現(xiàn)在設(shè)計StructuredBuffer還有必要對齊16 bytes嗎?」
最近的Rendering Work剛好有討論到這個,老外跟我說家機上效能並不會受惠於struct padding
想想也是,畢竟對齊16 bytes也是N家提的,並不一定適用AMD的GCN架構(gòu)
裡面基本上做了海量的資料結(jié)構(gòu)讀取測試,全部跑在Compute Shader上
簡單來說,buffer大小越大,會讀得更久
那麼16 bytes規(guī)則的表現(xiàn)會如何? NV那篇認(rèn)為32效能>20 bytes
在好奇心驅(qū)使之下,我下載了並修改了這個程式
分別建立了20/32 bytes的buffer,來測試這個規(guī)則是否還能夠增加效能,結(jié)果:
登愣! 公司電腦的顯卡是RTX2070,連N卡自己都推翻了以前自己說的規(guī)則
我沒有AMD卡可以測試,但根據(jù)老外的家機開發(fā)經(jīng)驗
資料結(jié)構(gòu)是越小效能越好,不用刻意去對齊16 bytes
結(jié)論:
又學(xué)到新東西了~
我想那個16bytes規(guī)則只適用於舊硬體 (2015那個時候的硬體)
隨著硬體架構(gòu)的進步,16 bytes對齊也已經(jīng)不是那麼必要了
做軟體有時候也要考慮硬體的改變來進行最佳化