多核心與同步

像「long cnt[8];」這樣排列每個執行緒的計數器陣列,發生了偽共享。下列何者是最適當的對策?

  1. A把計數器的型別從long改為int,縮小陣列
  2. B在各計數器之間加入填充或進行對齊,使它們放在不同的快取列
  3. C增加執行緒的數量,分散等待時間
查看答案與解析

正確答案:B. 在各計數器之間加入填充或進行對齊,使它們放在不同的快取列

若long為8位元組,8個計數器就會收進64位元組的一條快取列,所有執行緒都會爭奪同一條快取列。只要加入填充使各計數器每隔64位元組放置,或將結構對齊到快取列的大小,每個執行緒就能使用各自不同的快取列。此外,讓各執行緒以區域變數計數,最後只加總到共用位置一次,也是有效的方法。

  • A. 縮小之後反而會被塞進同一條快取列。
  • B. 正確。把快取列分開,就不會來回移動了。
  • C. 執行緒增加的話,來回移動反而會增加。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. 關於資料競爭(data race),下列說明何者正確?
  2. 以兩個執行緒同時執行上方的程式碼時,counter的最終值有時會小於200000。其原因下列何者正確?
  3. 關於原子指令(不可分割指令),下列說明何者正確?
  4. 關於原子指令CAS(比較並交換,compare-and-swap)的動作,下列何者正確?
  5. 上方的程式碼使用CAS(&p, 預期值, 新值)將共用變數counter變成2倍。CAS失敗而重做迴圈,是在什麼情況下?

這個領域的比較