欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编程中,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

相关标签: 底层技术