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

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