CPU與RAM的隔閡
CPU與RAM是兩個(gè)獨(dú)立的硬件,并非集成在一起。所以他們兩個(gè)之間一定會(huì)存在一個(gè)連接的橋梁
,這個(gè)橋梁的名字叫做內(nèi)存總線(xiàn)。
內(nèi)存總線(xiàn)由三部分組成:
地址總線(xiàn)(Address Bus)
用于傳輸內(nèi)存地址,也就是我們經(jīng)常看到的0X77F84FAB這種類(lèi)似的內(nèi)存地址,一根總線(xiàn)代表一個(gè)電信號(hào),一個(gè)電信號(hào)能傳遞高電平/低電平
兩種信息,用二進(jìn)制表示就是1/0。因此總線(xiàn)數(shù)量的多少?zèng)Q定了可以傳遞內(nèi)存地址的大小,比如你有32根總線(xiàn),就代表你總線(xiàn)寬度32。2^32=4294967296,等于4GB內(nèi)存,這就是32位操作系統(tǒng)只支持4G內(nèi)存的由來(lái)。
數(shù)據(jù)總線(xiàn)(Data Bus)
用于傳輸數(shù)據(jù),原理同上,一根總線(xiàn)代表1bit傳輸段位,64根總線(xiàn)就是 64bit=8byte。一次性可以傳輸8byte單位的數(shù)據(jù)。
控制總線(xiàn)(Control Bus)
用戶(hù)傳輸控制信號(hào),比如一根用來(lái)"讀信號(hào)輸出"的開(kāi)關(guān),一根"寫(xiě)信號(hào)輸出"的開(kāi)關(guān)。一根"時(shí)鐘信號(hào)"的開(kāi)關(guān)
更詳細(xì)可以參考此文:https://www.cnblogs.com/lmy5215006/p/18469027
CPU Cache
可以看到,假設(shè)CPU要讀取1kb的數(shù)據(jù),你的數(shù)據(jù)總線(xiàn)總線(xiàn)只有64根,1024/8=128,你需要來(lái)回倒騰128次,才能讀取完畢,這一來(lái)二去就加大了內(nèi)存之間的延遲,為了優(yōu)化此性能瓶頸,
CPU除了寄存器外臨時(shí)存儲(chǔ)數(shù)據(jù),還內(nèi)置了Cache來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)與指令。
游戲神U 9800x3d就是依靠96MB的"巨大L3緩存",來(lái)降低了內(nèi)存延遲,從而在游戲場(chǎng)景默秒全I(xiàn)ntel
特性 | L1緩存 | L2緩存 | L3緩存 |
---|
速度 | 1-2納秒 | 約10納秒 | 約30納秒 |
容量 | 幾十KB到幾百KB | 幾百KB到幾MB | 幾MB到幾十MB |
位置 | 集成在 CPU 核心內(nèi)部 | 每個(gè)核心獨(dú)立擁有(位于核心附近) | 多核共享(位于 CPU 芯片內(nèi)) |
緩存一致性 | 每個(gè)核心獨(dú)立,與L3主從同步 | 每個(gè)核心獨(dú)立,與L1/L3主從同步 | 多核共享 |
場(chǎng)景 | 需要立即執(zhí)行的指令與高頻訪(fǎng)問(wèn)的數(shù)據(jù) | 稍低頻但重復(fù)訪(fǎng)問(wèn)的數(shù)據(jù) | 跨核心共享數(shù)據(jù)、大吞吐量計(jì)算 |

what is CacheLine?
CacheLine是CPU緩存中最小數(shù)據(jù)單元,當(dāng)CPU從內(nèi)存中讀取數(shù)據(jù)時(shí),會(huì)一次性加載64byte的數(shù)據(jù),而不是只加載特定數(shù)據(jù),即使只想讀取1bit數(shù)據(jù),也會(huì)加載64byte數(shù)據(jù)。這么做是因?yàn)?,大多?shù)情況下,數(shù)據(jù)都是順序讀取的,因此提前加載數(shù)據(jù)有利于減少延遲。
眼見(jiàn)為實(shí)
使用Coreinfo 來(lái)觀察CPU

C#代碼如何影響CPU緩存速度?
internal class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Rows();
sw.Stop();
Console.WriteLine($"逐行賦值執(zhí)行時(shí)間:{sw.ElapsedMilliseconds}");
sw.Restart();
Columns();
sw.Stop();
Console.WriteLine($"逐列賦值執(zhí)行時(shí)間:{sw.ElapsedMilliseconds}");
}
static void Rows()
{
int[,] tab = new int[5000, 5000];
for (int i = 0; i < 5000; i++)
{
for (int j = 0; j < 5000; j++)
{
tab[i, j] = 1;
}
}
}
static void Columns()
{
{
int[,] tab = new int[5000, 5000];
for (int i = 0; i < 5000; i++)
{
for (int j = 0; j < 5000; j++)
{
tab[j, i] = 1;
}
}
}
}
}

可以看到,非線(xiàn)性的數(shù)據(jù)檢索帶來(lái)了嚴(yán)重的性能問(wèn)題,應(yīng)當(dāng)盡量避免對(duì)內(nèi)存的非順序訪(fǎng)問(wèn)。
?轉(zhuǎn)自https://www.cnblogs.com/lmy5215006/p/18916344
該文章在 2025/6/11 9:07:47 編輯過(guò)