計算機執行一條指令要多長時間?
1.這個問題的完整表述(限於標題篇幅)是計算機執行一條指令要多長時間,從內存中取一個word要多長時間(包括緩存命中和未命中的情況),從磁碟上讀取連續的數據要多長時間,定位到磁碟上的新位置又要多長時間?
2.問題出自《用十年時間學習編程》,作者給出了答案,但是並沒有說如何得出的這些答案,這裡給出一篇博客的鏈接用十年學習編程 / Teach Yourself Programming in Ten Years3.下面是作者給出的答案:在典型PC機上各種操作的近似時間: 執行典型指令 1/1,000,000,000秒=1納秒從一級緩存中讀取數據 0.5納秒
分支預測錯誤 5納秒 從二級緩存中讀取數據 7納秒 互斥鎖定/解鎖 25納秒 從主存儲器中讀取數據 100納秒 在 1Gbps 的網路中發送2KB 數據 20,000納秒 從內存中讀取1MB 數據 250,000納秒 從新的磁碟位置讀取數據(尋軌) 8,000,000納秒 從磁碟中讀取1MB 數據 20,000,000納秒 在美國向歐洲發包並返回 150毫秒=150,000,000納秒4.我是一名大三計算機系學生,我想問的是:如何理解這些問題及如何測試自己機器上的這些指數,最好能從原理上講的明白一些,非常感謝!
Intel 手冊裡面有各個指令佔多少時鐘的吧
計算機執行一條指令要多長時間
看設備,看指令類型,對於intel來說,看這篇文檔:Intel? 64 and IA-32 Architectures Optimization Reference Manual
從內存中取一個word要多長時間(包括緩存命中和未命中的情況)
實際上沒辦法給出準確的時間,因為cache分幾級,每一級的時間開銷也不一樣。甚至有極端情況比如word不對齊怎麼辦?
從磁碟上讀取連續的數據要多長時間,定位到磁碟上的新位置又要多長時間?
看你用什麼樣的硬碟,看你讀什麼樣的數據,機械硬碟和SSD速度肯定不一樣,SSD沒有尋道時間的概念但機械硬碟有。
你說的這些問題大部分都是性能相關的,跟硬體關聯度很大,你說有書上給出了一個答案但我敢打包票說這個答案沒有適用性,也沒有實際意義,因為不同設備,不同測試樣例的差異很大。
甚至,你在十年前的設備上跑和在十年後的設備上跑,結果差別也很大。
執行典型指令 1/1,000,000,000秒=1納秒
從一級緩存中讀取數據 0.5納秒
分支預測錯誤 5納秒從二級緩存中讀取數據 7納秒互斥鎖定/解鎖 25納秒從主存儲器中讀取數據 100納秒
以上的內容應該就是十年前的數據,現在台式機的速度普遍比這個都要快的多,況且現在已經有三級緩存了,CPU的結構也複雜的多。
在 1Gbps 的網路中發送2KB 數據 20,000納秒
這個數據顯然不包括軟體層面上的開銷
從內存中讀取1MB 數據 250,000納秒
從新的磁碟位置讀取數據(尋軌) 8,000,000納秒從磁碟中讀取1MB 數據 20,000,000納秒
新設備應該比這都快
在美國向歐洲發包並返回 150毫秒=150,000,000納秒
基本上只是傳輸開銷,沒算協議棧開銷。
題主是一個大三計算機的學生,對這些數字,看看就可以了,學好計算機組成原理,了解一下基本原理就夠了,對於細節問題(比如CPU時鐘周期)可以不要太在意,除非確定自己將來要做這個方向。
手冊上能一下查到的,不算技術(比如指令開銷);手冊上查完需要理解分析一下的,才是技術(比如段頁式操作)。前者更像是研究茴字有幾種寫法一樣。
你問的這些東西,有些可以查手冊得到,不要太深挖,意義不是很大。打好編程基礎,用C+彙編寫一個簡易的操作系統,會讓你掌握更多的技能,遠比你了解這些東西要重要。一些是算出來,一些是估計出來的,其實只有量級有指導意義,比如說一條普通指令,現在的CPU遠遠用不了一納秒了,得益於睿頻、多發射等技術的幫助。但是有的指令可能就比較慢,比如一般乘法會比加法慢,除法比乘法慢。其他的可以查手冊。了解這個量級主要是為了讓你理解什麼樣的程序是效率高的程序,什麼樣的程序是效率低的,尤其是涉及到外存和網路IO的時候。比如說,隨機讀取一次磁碟內容的時間可以執行八百萬條指令。
Agner Fog維護著一個不同CPU的instruction latency table: http://www.agner.org/optimize/instruction_tables.pdf 可以看看。 就跟所有reference一樣,大致翻一下就好,需要再查。如果希望了解為什麼不同的指令latency不一樣,可以學習一下體系結構。
除非是給定了場景(cpu架構,指令組)讓你算執行時間,否則關注單條指令的執行時間並沒有太大價值啊。幾級pipeline,幾級cache,cache命中情況,指令集設計,前後指令的相互依賴引入的control hazard和data hazard,FU和HDU的設計,會讓不同場景下的相同指令有不同的執行時間。
除非專門針對一種型號優化,衡量指令耗時的正確指標應當是「xx個時鐘周期」。廠商通常使用"least xx cycles"來聲明。
考慮到多發射、超標量、超流水線、亂序執行、追蹤緩存等設計越來越複雜,僅評價單條指令耗時比過去要困難。更有意義的指標是經過統計分析的CPI、MIPS數據。
CPI (cycles per instruction)IPS (instructions per second)MIPS (millions of instructions per second)延伸閱讀:
Instruction_latencies_and_throughput_for_AMD_and_Intel_x86_processors雙核1.7GHz 四核1.2GHz 哪個更強? - Eric Fu 的回答簡述PC X86處理器上的單核心性能提升歷史 - Amazing - 知乎專欄必讀書目:Intel64 and IA-32 Architectures Software Developer"s ManualSoftware Optimization Guide for AMD64 Processors
你應該把學習重心放在執行一條指令詳細的過程,精確到微程序,然後再考慮指令流水,超長指令字,並發,各種優化方案。舉例,比如符號控制位,通過在指令中添加數據類型符號,有效縮寫指令種類,或數據位,便於取一大塊數據。對於你說的時間問題,我想科學家用的應該是平均出來的。你只需知道很快就行了,因為單純執行一條指令,大概有4個周期,取指周期,間址周期,執行周期,中斷周期,每個周期大概就4個機器周期(cpu主頻的倒數),應該是這樣估算的吧,我說錯了不要打臉,這就是理論上一條的執行時間,實際肯定更快,因為各指令功能不同,對應周期數也不同。
你這種做計算機的一般不需要理解,研發CPU的,做soc的,做嵌入式編程的才會關注這種問題。
setup time可以百度這個。
推薦閱讀:
※如何做一個能被別人訪問的網站?
※免流的原理到底是什麼?
※怎麼破解無線網路?又如何防範?
※Mac升級10.9後 銳捷顯示無法找到網卡?