编程中,cache_align 用在哪些场合?

内核 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章