[英]Writing a Low latency code in C/ C++ language that automatically take care of cache lines size
如何編寫自動處理緩存行對齊的C / C ++代碼。
假設我們在c中編寫了一個結構並且有5個成員,我們希望將這個結構成員與不同硬件X86硬件CPU中的不同緩存行對齊。
例如,如果我有兩台X86機器Machine_1和Machine_2。 而Machine_1具有64字節高速緩存行,而Machine_2具有32字節高速緩存行。 我將如何進行編碼,以便每個變量都與Machine_1和Machine_2的不同緩存行對齊。
struct test_cache_alignment {
int a;
int b;
int c;
int d;
int e;
};
謝謝,Abhishek
這主要分為兩個不同的問題。
第一個問題是確保整個結構從高速緩存行邊界開始,這取決於結構的位置。 如果使用malloc()
為結構分配內存,則需要一個malloc()
來確保對齊。 如果將結構放在全局數據中,則編譯器和/或鏈接器必須確保對齊。 如果你有一個結構作為本地數據(在堆棧上),那么編譯器必須生成確保對齊的代碼。
這只是部分可解決的。 您可以編寫自己的malloc()
或在現有的malloc()
周圍編寫包裝器。 您可能能夠使用對齊的特殊部分(而不是使用正常的.rodata
, .data
和.bss
部分)並說服鏈接器做正確的事情。 您可能無法讓編譯器生成適當對齊的本地數據。
問題的第二部分是確保結構中成員的偏移量是緩存行大小的倍數。 這意味着如果整個結構對齊,那么結構的成員也將對齊。 這可能不是那么難做(只要你不介意“稍微不便攜”的代碼和痛苦的微觀管理)。 例如:
#define CACHE_LINE_SIZE 32
struct test_cache_alignment {
int a;
uint8_t padding1[CACHE_LINE_SIZE - sizeof(int)];
int b;
uint8_t padding2[CACHE_LINE_SIZE - sizeof(int)];
int c;
uint8_t padding3[CACHE_LINE_SIZE - sizeof(int)];
int d;
uint8_t padding4[CACHE_LINE_SIZE - sizeof(int)];
int e;
uint8_t padding5[CACHE_LINE_SIZE - sizeof(int)];
};
然而; 對於這種特殊情況(整數結構),很少想要浪費這樣的空間。 如果沒有填充,它將完全適合單個緩存行,並將其分布在許多緩存行中,這只會增加緩存未命中率並降低性能。
我能想到你唯一想要使用整個緩存行的唯一情況是減少多CPU系統中的錯誤共享(例如,避免由於不同的CPU同時修改同一結構的不同成員而導致的“緩存行反彈”時間)。 通常對於這些情況,你開始時做錯了(例如,最好是有單獨的局部變量而根本不使用結構)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.