繁体   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