为了防止错误共享,我想将数组的每个元素与缓存线对齐.首先我需要知道缓存线的大小,所以我给每个元素分配字节数.其次,我希望数组的开头与缓存线对齐.

我使用的是Linux和8核x86平台.首先,我如何找到高速缓存线大小.其次,如何在C中对齐到缓存行.我使用的是GCC编译器.

例如,假设缓存线大小为64,则 struct 如下.

element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191

当然,假设0-63与高速缓存线对齐,依此类推.

推荐答案

要知道大小,您需要使用处理器的文档来查找,AFAIK没有编程方法可以做到这一点.然而,从好的方面来看,大多数高速缓存线都是基于英特尔标准的标准大小.在x86高速缓存线是64字节,然而,为了防止错误共享,您需要遵循您的目标处理器的指导方针(英特尔对其基于网络突发的处理器有一些特别说明),通常您需要为此对齐到64字节(英特尔声明您还应该避免交叉16字节边界).

要在C或C++中这样做,需要使用标准aligned_alloc函数或编译器特定的指定符,如__attribute__((align(64)))__declspec(align(64)).要在 struct 中的成员之间填充以将其拆分到不同的缓存线,需要插入一个足够大的成员,使其与下一个64字节的边界对齐

C++相关问答推荐

va_arg -Linux和Windows上的不同行为

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

exit(EXIT_FAILURE):Tcl C API类似功能

如何将已分配的数组(运行时已知的大小)放入 struct 中?

难以理解Makefile隐含规则

在C中将通用字符名称转换为UTF-8

ESP32在vTaskDelay上崩溃

如何将字符串传递给函数并返回在C中更改的相同字符串?

Ruby C Api处理异常

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

为什么我不能只在内存地址中添加一个int来寻址任何数组?

函数内的局部字符指针

防止规范模式在C++中 echo 特殊字符

通过描述符查找文件路径时出现问题

在函数外部使用内联ASM时无法指定操作数

为什么WcrTomb只支持ASCII?

如何使用空元素块声明指针数组

正在try 理解C++中的`正在释放的指针未被分配‘错误

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

为什么写入关闭管道会返回成功