False Sharing問題

在多處理器,多線程情況下,如果兩個線程分別運行在不同的CPU上,而其中某個線程修改了cache line中的元素,由於cache一致性的原因,另一個線程的cache line被宣告無效,在下一次訪問時會出現一次cache line miss,哪怕該線程根本無效改動的這個元素,因此出現了False Sharing問題【1】。

如下圖所示,thread1修改了memory灰化區域的第[2]個元素,而Thread0只需要讀取灰化區域的第[1]個元素,由於這段memory被載入了各自CPU的硬件cache中,雖然在memory的角度這兩種的訪問時隔離的,但是由於錯誤的緊湊地放在了一起,而導致了,thread1的修改,在cache一致性的要求下,宣告了運行Thread0的CPU0的cache line非法,從而出現了一次miss,導致從小從memory中讀取到cache line中,而一致性的代價付出了,但結果並不是thread0所care的,導致了效率的降低。關於實驗可以參考[2]。

因此在多核編程情況下,要特別注意False Sharing問題。

解決的方法可以是:詳細參見【1】

__declspec (align(64)) int thread1_global_variable;
__declspec (align(64)) int thread2_global_variable;

或者是


struct ThreadParams 

  // For the following 4 variables: 4*4 = 16 bytes 
  unsigned long thread_id; 
  unsigned long v; // Frequent read/write access variable 
  unsigned long start; 
  unsigned long end; 
 
  // expand to 64 bytes to avoid false-sharing  
  // (4 unsigned long variables + 12 padding)*4 = 64 
  int padding[12]; 
}; 
 
__declspec (align(64)) struct ThreadParams Array[10]; 

 

 

【1】http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/

【2】http://www.codeproject.com/KB/threads/FalseSharing.aspx

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pennyliang/archive/2010/07/27/5766541.aspx

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