2013-03-06 134 views
0

當我在OpenCL中有一個內存緩衝區時,我知道我需要將其中的數據與16字節的邊界對齊。

但是,如果我的整個數據(不是數據結構,實際的數據收集)例如只有15個字節大,我該怎麼辦?
我應該把它放進一個16字節的大緩衝區或15字節的嗎?
是否有性能差異?OpenCL緩衝區大小填充

+0

那麼,你正在運行一個只有15字節輸入的內核?這是一個壞榜樣。如果您運行的X * 16 + Y字節不是16的倍數,那麼更合理。 – DarkZeros 2013-12-18 10:13:11

+0

是的,數據大於15個字節。但不是16的倍數。 – Tara 2013-12-18 12:15:44

回答

0

如果您打算使用許多15字節的數據結構並且您打算使用本地內存,我建議保留15字節的結構並一次加載其中的16個倍數。我認爲「很多」在你的工作組中至少會有幾kb的數據。原因是因爲當你犧牲每15個額外的字節時,你增加了6%的傳輸開銷。將數據寫回內存(本地和全局內存)時,將大小保持爲15還可以幫助避免銀行衝突。

More info about bank conflicts.

+1

一個15字節的結構數組可能不會對齊,並且會產生昂貴的訪問時間。我建議將它保持在16位(特別是因爲包括GPU在內的大多數設備的自然對齊是16字節)。當然這是性能/內存的折衷。我也看不出結構的大小與銀行衝突有什麼關係,如果有任何事情因未對齊的加載/存儲而變得更糟。 – Thomas 2013-03-07 02:53:12

+0

讓我澄清一下:在我的例子中,沒有15字節的數據結構(我從來沒有說過任何關於結構的東西)。整數數據大小爲15個字節。它不一定只有15個字節大。它可以是任何不是16的倍數的數字。 – Tara 2013-03-07 07:35:27