簡體   English   中英

用C / C ++語言編寫低延遲代碼,自動處理緩存行大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM