多核心與同步
像「long cnt[8];」這樣排列每個執行緒的計數器陣列,發生了偽共享。下列何者是最適當的對策?
- A把計數器的型別從long改為int,縮小陣列
- B在各計數器之間加入填充或進行對齊,使它們放在不同的快取列
- C增加執行緒的數量,分散等待時間
查看答案與解析
正確答案:B. 在各計數器之間加入填充或進行對齊,使它們放在不同的快取列
若long為8位元組,8個計數器就會收進64位元組的一條快取列,所有執行緒都會爭奪同一條快取列。只要加入填充使各計數器每隔64位元組放置,或將結構對齊到快取列的大小,每個執行緒就能使用各自不同的快取列。此外,讓各執行緒以區域變數計數,最後只加總到共用位置一次,也是有效的方法。
- A. 縮小之後反而會被塞進同一條快取列。
- B. 正確。把快取列分開,就不會來回移動了。
- C. 執行緒增加的話,來回移動反而會增加。