2012-07-28 77 views
0

在高性能計算方面,我看到類似下面的代碼:`cache_line_align_`的作用是什麼?它有什麼好處?

typedef union 
{ 
    erts_smp_rwmtx_t rwmtx; 
    byte cache_line_align_[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(erts_smp_rwmtx_t))]; 
}erts_meta_main_tab_lock_t; 

erts_meta_main_tab_lock_t main_tab_lock[16]; 

什麼是cache_line_align_出現上面做什麼?爲什麼它有用?

+1

我們做什麼?我根本沒有看到這種情況。如果沒有看到它用來設置數組大小的宏,你根本就不能說它做了什麼。提示:它用於確保結構在緩存行上對齊。 – Chad 2012-07-28 00:45:37

回答

2

使用多線程創建程序時,程序的兩個部分可能會嘗試訪問共享內存系統中彼此緊鄰的內存中的對象/原語。

不幸的是,如果計算機硬件都在同一個高速緩存行上,那麼計算機硬件不能將一塊內存提供給一個處理器,而將另一塊計算機硬件提供給不同的處理器同時

這個陷阱被稱爲False Sharing

爲了克服這個問題,我們可以在存儲位置(變量)之間的緩衝區中添加一個空間。

該空間的緩衝區完全沒有什麼,除了在內存中分散我們期望的變量。

可能有一些非多線程程序已針對緩存性能進行了優化,您可以在其中看到一些類似的技巧,但在這種情況下,您通常需要將盡可能接近的變量儘可能靠近,以便它們都可以適合相同的緩存行。