每指令週期數(CPI)
/ CPI: see-pee-eye /
想像一條工廠生產線,時鐘每秒跳一次,每跳一次每個工作站就往前走一小步。有些產品很簡單,一跳就完成;有些很麻煩,每個要四五跳。如果你想知道一整天的生產要花多久,光數產品數量不夠——你得知道平均每個產品吃掉幾跳。那個平均值,正是每指令週期數要衡量的:平均而言,處理器每條指令要花幾個時脈週期?
CPI 是效能鐵律的中間項。CPU 時間 = 指令數乘以 CPI 乘以時脈週期時間。它的算法是總時脈週期數除以執行的總指令數。一個簡單的非管線化設計每條指令可能要好幾個週期;理想的管線目標是 CPI 接近 1(每個週期完成一條指令);一台每週期完成數條指令的超純量機器,CPI 可以低於 1,這時人們常把它倒過來、改報 IPC,也就是每週期指令數。不同指令類型的貢獻不同:若 25% 的指令是要 5 個週期的載入、其餘要 1 個週期,平均 CPI 就是 0.25 乘 5 加上 0.75 乘 1,等於 2。
CPI 是微架構大顯身手的地方,而它之所以誠實,正是因為它把各項關注點分開。指令集和編譯器大致決定了指令數;時脈週期時間大致由製程技術和電路設計決定;而 CPI 才是管線、快取、分支預測、亂序執行通通現身的地方。一次快取未命中會加上停頓週期、把 CPI 撐大;好的分支預測會把它壓低。這就是為什麼兩顆時脈頻率相同、跑同一個程式的晶片速度可以差很多:它們的 CPI 不同,而 CPI 是效能鐵律三項因子中最具架構趣味的那一項。
一個程式跑 1,000,000,000 條指令、花 2,000,000,000 個時脈週期,所以 CPI = 2e9 / 1e9 = 2.0。在 2 GHz 時脈(週期時間 0.5 奈秒)下,CPU 時間 = 1e9 條指令 乘以 2.0 CPI 乘以 0.5 奈秒 = 1 秒。把 CPI 砍半到 1.0(更好的管線或快取)就能把它降到 0.5 秒。
CPI 是總週期數除以總指令數——微架構最能撼動的那一項效能鐵律因子。
CPI 是整個程式的平均,不是每條指令固定的代價;同一條指令依快取是否命中、是否遇到危障、預測是否準確,花的週期可能不同。IPC 就是 1/CPI,當機器每週期完成超過一條指令時會用它。