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