2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
填充通過(guò)將每個(gè)結(jié)構(gòu)放在自己的緩存行上來(lái)消除錯(cuò)誤共享。如果兩個(gè)變量共享一個(gè)緩存行,如果有對(duì)另一個(gè)變量的干預(yù)寫(xiě)入,則讀取未修改的變量將與讀取修改的變量一樣昂貴。
當(dāng)一個(gè)變量在多個(gè)內(nèi)核上被讀取而不被修改時(shí),緩存行由內(nèi)核共享。這使得讀取非常便宜。在任何內(nèi)核可以寫(xiě)入該緩存行的任何部分之前,它必須使其他內(nèi)核上的緩存行無(wú)效。如果任何內(nèi)核稍后從該緩存行讀取,它將發(fā)現(xiàn)緩存行無(wú)效并且必須返回共享它。當(dāng)一個(gè)變量被頻繁修改而另一個(gè)變量被頻繁讀取時(shí),這會(huì)產(chǎn)生痛苦的額外緩存一致性流量。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
它運(yùn)行得更快,因?yàn)樗恍枰i。這是 Java 中的一個(gè)實(shí)現(xiàn)(稱為 Disruptor),效果非常好,似乎是 gringo 的靈感來(lái)源。他們解釋鎖的成本,以及如何可以增加吞吐量這里。
至于padding,論文也暗示了一些原因?;旧希禾幚砥骶彺妗?a >這篇論文很好地解釋了它。通過(guò)讓處理器訪問(wèn)其 1 級(jí)緩存而不是盡可能頻繁地訪問(wèn)內(nèi)存或其外部緩存,您可以獲得巨大的性能提升。但這需要采取額外的預(yù)防措施,因?yàn)樘幚砥鲗⑼耆虞d其緩存,并在每次需要時(shí)重新加載(從內(nèi)存或 2-3 級(jí)緩存)。在并發(fā)數(shù)據(jù)結(jié)構(gòu)的情況下,正如@David Schwartz 所說(shuō),錯(cuò)誤共享將迫使處理器更頻繁地重新加載其緩存,因?yàn)橐恍?shù)據(jù)可能會(huì)加載到內(nèi)存行的其余部分中,被修改,并強(qiáng)制整個(gè)緩存再次加載。
- 2 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報(bào)