簡體   English   中英

是否可以在Golang中使用CPU緩存?

[英]Is it possible to use CPU cache in Golang?

考慮一些內存和CPU密集型任務:
例如:任務塊:從內存中讀取16個字節,然后執行CPU作業。 然后寫回內存。
此任務塊可以並行化,這意味着每個核心可以運行一個任務塊。
例如:8個CPU需要8 * 16字節緩存但同時進行。

是的,就像在您的機器上運行的所有其他代碼一樣,它們都使用CPU緩存。

要告訴您如何對應用進行編碼以使其最有效地使用緩存,這是一個非常廣泛的問題。 我強烈建議設置Go Benchmarks,然后重構代碼並比較時間。 (注意,不要在虛擬機中進行基准測試 - 虛擬機和任何平台上的類型,沒有足夠准確的時鍾用於Go的基准測試。運行所有基准測試,而不是虛擬機)。

這一切都歸結為您對應用程序進行編碼以有效利用 CPU緩存的能力。 這是一個更廣泛的主題,關於如何使用變量,它們更新的頻率,堆棧上的內容或堆棧中的GC以及頻率等等。

一個很小的例子,指出你正確的方向,閱讀更多關於有效的L1和L2緩存開發......

L1緩存使用64位行。 如果要存儲4x 16位Int16,通常它們將在堆棧上分配,並且很可能全部存儲在同一行緩存中。

假設您要更新其中一個Int16? 好吧,CPU緩存無法更新行的一部分:它必須使整行無效,並使用之前的3個Int16和新的更新值分配一整行新緩存。

非常低效。

該問題的一個解決方案是使用Int64s,CPU緩存只會使1行無效,但仍保留其他3個緩存以便快速讀取。 你在做更多的推動或流行音樂嗎? 等等

同樣,它在很大程度上取決於您的使用情況:如果您使用這4個整數的大量上下文切換(例如互斥鎖),這甚至可能會減慢速度。 在這種情況下,這是一個完全不同的優化問題。

我建議閱讀堆棧和堆上的高頻縮放和內存分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM