2016-11-10 52 views
3

在32位機器中,一個存儲器讀取週期獲取數據的4個bytes
因此,爲了讀取下面的緩衝區,需要32個讀週期來讀取下面提到的的緩衝區。
std :: alignas如何優化程序的性能?

char buffer[128]; 

現在,假設如果我下面對齊,那麼請讓我知道它是如何使其更快讀取,提到這個緩衝區?

alignas(128) char buffer[128]; 

我假設內存讀取週期將只保留4個字節。

+0

過度對齊不保證通過C++標準工作。確切的處理器和編譯器需要回答這個問題。 – Yakk

+0

相關:http://stackoverflow.com/questions/381244/purpose-of-memory-alignment – NathanOliver

+0

你不能確認*在32位機器中,一個存儲器讀取週期獲取4個字節的數據*。參見SIMD說明。 –

回答

4

用於存儲器訪問的寄存器的大小隻是故事的一部分,另一部分是高速緩存行的大小。

如果緩存行是64字節,並且您的char[128]自然對齊,則CPU通常需要操作三個不同的緩存行。使用alignas(64)alignas(128),只需要觸摸兩條緩存線。

如果您正在使用內存映射文件,或者在交換條件下,下一級對齊將啓動:內存頁的大小。這將需要4096或8192字節對齊。

但是,我嚴重懷疑alignas()如果指定的對齊大於編譯器使用的自然對齊,它會產生任何顯着的積極影響:它會顯着增加內存消耗,這可能足以觸發更多的高速緩存行/內存頁面首先被觸及。只有那些需要避免的小錯位是因爲它們可能會在某些CPU上引起巨大的減速,或者可能在其他CPU上是非法的/不可能的。因此,真實只是在測量中:如果你需要所有的加速,你可以嘗試一下,測量運行時的差異,看看它是否能夠實現。

1

在32位機器中,一個存儲器讀取週期獲取4個字節的數據。

並不那麼簡單。只是術語「32位機器」已經太廣泛了,可能意味着很多事情。 32b寄存器(GP寄存器?ALU寄存器?地址寄存器?)? 32b地址總線? 32b數據總線? 32b指令字大小?

「內存讀」由誰。中央處理器?緩存? DMA芯片?

如果您有一個硬件平臺,其中內存在單週期內讀取4個字節(由4對齊)且沒有任何緩存,那麼alignas(128)將不會有差異(比alignas(4))。