编程中,cache_align 用在哪些场合?
程序员文章站
2022-05-12 11:30:13
...
内核 per_cpu 结构里
struct X {
int x,y,z;
....
} CACHE_ALIGNED per_cpu[NR_CPUS]
这是为了各个 cpu 操作自己的 X 结构时不要影响别的 cpu 的 cache
多线程队列
Queue
{
QueueItem items_[N]
int push_ CACHE_ALIGN;
int pop_ CACHE_ALIGNED;
}
push 和 pop 通常是不同线程读写的,放入不同 cacheline 可以有效避免不必要的 cache 淘汰。
另外,如果 Queue 很复杂,成员很多,也可以考虑把 push_、pop_ 中间插入其它成员,让他们相距至少一个 cacheline 的距离。这在某些特殊场合下有用。
其它
还有一些对象,你会发现它被标记为 CACHE_ALIGNED 一般是因为这个对象会被用在另外一个数组里,那个数组会被多线程访问。这其实和 per_cpu 差不多,只不过声明 ALIGNED 的地方和使用的地方在代码上是分离的。例如:
// in file A
struct A
{
int x,y,z;
....
} CACHE_ALIGNED;
// in file B
struct Array
{
A a[THREAD_COUNT];
};
WHY
为什么要用 CACHE_ALIGNED?主要原因还是为了避免 false-sharing,(A 线程的写自己数据结构的操作,影响到 B 线程的读写自己数据结构的性能)
补充不太常见用法
一个数据结构,不会被多个线程共享,也加上了 CACHE_ALIGNED。这个有一种解释:避免这个结构跨 2 个 cacheline,在 cache 竞争比较激烈的场景下提升 cache 利用率,提升整体性能。
这个有一定道理,但是感觉场景不是很多,需要 case by case 地看。
延伸阅读
https://blog.csdn.net/zero__007/article/details/54089730