gpt4 book ai didi

linux-kernel - ____cacheline_aligned_in_smp 用于 Linux 内核中的结构

转载 作者:行者123 更新时间:2023-12-04 01:08:40 27 4
gpt4 key购买 nike

在Linux内核中,为什么很多结构使用____cacheline_aligned_in_smp宏?访问结构时它是否有助于提高性能?如果是,那么如何?

最佳答案

____cacheline_aligned指示编译器在对应于 L1 缓存行开头的地址处实例化一个结构体或变量,对于特定架构,即,使其与 L1 缓存行对齐。 ____cacheline_aligned_in_smp类似,但实际上只有当内核在 SMP 配置中编译时才 L1 缓存行对齐(即,使用选项 CONFIG_SMP )。这些在文件 include/linux/cache.h 中定义

这些定义对于不是通过某些分配器动态分配的变量(和数据结构)很有用,而是全局的、编译器分配的变量(类似的效果可以通过动态内存分配器实现,可以以特定的对齐方式分配内存)。

缓存行对齐变量的原因是在 SMP 系统中通过硬件缓存一致性机制管理这些变量的缓存到缓存传输,以便在移动其他变量时不会隐式地发生它们的移动。这是针对性能关键代码,其中人们期望多个 CPU(内核)在访问变量时发生争用。在这种情况下,人们试图避免的常见问题是错误共享。

从缓存行开始处开始的变量内存是为此目的工作的一半;还需要“打包”只有应该一起移动的变量。一个例子是变量数组,其中数组的每个元素只能由一个 cpu(核心)访问:

struct my_data {
long int a;
int b;
} ____cacheline_aligned_in_smp cpu_data[ NR_CPUS ];

这种定义将要求编译器(在内核的 SMP 配置中)每个 cpu 的结构将从缓存行边界开始。编译器会隐式地在每个 cpu 的结构之后分配额外的空间,以便下一个 cpu 的结构也将从缓存行边界开始。

另一种方法是使用缓存行的虚拟、未使用字节大小填充数据结构:
struct my_data {
long int a;
int b;
char dummy[L1_CACHE_BYTES];
} cpu_data[ NR_CPUS ];

在这种情况下,由于缓存容量未命中,只有虚拟的、未使用的数据会被无意移动,而每个 cpu 实际访问的数据只会从缓存移动到内存,反之亦然。

关于linux-kernel - ____cacheline_aligned_in_smp 用于 Linux 内核中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25947962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com