我讀過gprof(函數概要分析)和其他分析方法可以返回執行程序時發生的浮點操作的次數,因此想知道Flops如何比常規操作更昂貴?爲什麼浮點操作被認爲是昂貴的?
1
A
回答
8
我會假設你正在談論的x86,但很多的下方也同樣適用於其它架構
浮點運算是昂貴的,因爲在浮點數操作要比操作更貴整數。就這麼簡單。整數的格式使得加法和減法在硬件中實現起來非常簡單。浮點數(幾乎總是)在IEEE 754實施,其中存儲的數字作爲一個標誌,指數和尾數,允許非常大和非常小的數字的表示,但它是在運行速度爲代價。如果數字只有3位小數,則可以使用整數,最後除以3即可;精度範圍廣泛使事情複雜化。
這就是說,現代處理器的浮點數比以前更好。浮點數學最初是在一個可選的協處理器上實現的 - 特別是Intel 80387 - 它只能通過特殊指令訪問。您可以將值壓入x87堆棧,執行操作,然後將其彈回到硬件寄存器中。非常慢,因爲它必須離開處理器。更重要的是,這些特定的操作變得「有風險」使用,因爲你不能確定處理器是否存在 - 如果不存在,你的程序將工作,但它會使用模擬協處理器的軟件例程。如果你是一名遊戲開發人員,並且你不能依賴inverse square root,那麼你可以自己完成這項工作,並且你可以在所有系統上同樣快速運行 - 在某些系統上運行速度並不快,而在其他系統上速度要慢得多。
如今,處理器有special floating point operations而設計的性能,更重要的是,保證在那裏。所以它們非常快,而浮點運算不可避免地比整型運算慢,但它們通常不足以解決問題 - 尤其是以錯誤和複雜性爲代價。更重要的是,this answer表明,在大多數情況下,這是一種洗滌。
在任何情況下,性能現在已經足夠好,以至於舊的諺語在編程時間比機器時間更重要,並且您肯定會花更多時間編寫一些避免浮點數的奇特算法只會使用它們。
相關問題
- 1. 爲什麼字符串操作更昂貴?
- 2. 爲什麼Wpf的DrawingContext.DrawText如此昂貴?
- 3. 昂貴的包裝System.Numerics.VectorX - 爲什麼?
- 4. 爲什麼分配或初始化NSDateFormatter被視爲「昂貴」?
- 5. 是destroyDrawingCache()查看昂貴的操作嗎?
- 6. 爲什麼類型檢查昂貴?
- 7. 爲什麼試塊價格昂貴?
- 8. 爲什麼File.Open如此昂貴?
- 9. 爲什麼System.Drawing.Rectangle.getWidth()如此昂貴?
- 10. 爲什麼類型轉換昂貴?
- 11. SQL爲什麼會變得昂貴?
- 12. 爲什麼alpha混合如此昂貴?
- 13. OWLOntologyManager.addAxioms()操作有多昂貴?
- 14. OpenGL操作有多昂貴?
- 15. NSUserDefaults的讀取訪問是否爲「昂貴」的操作?
- 16. 是讀取操作昂貴嗎?
- 17. 什麼是GCC昂貴的優化?
- 18. 什麼更昂貴?作業或聲明?
- 19. 爲什麼浮點值如3.14在MSVC中默認被認爲是double?
- 20. 收集昂貴操作的Java同步
- 21. Python多處理爲昂貴的操作與二維陣列
- 22. 用PHP和Memcached限制昂貴操作的最佳方法是什麼?
- 23. Executors.newFixedThreadPool() - 這個操作有多昂貴
- 24. 爲什麼Elasticsearch服務提供商那麼昂貴?
- 25. 是「ConnectionMultiplexer.IsConnected」昂貴嗎?
- 26. pthread_self()是否昂貴?
- 27. 爲什麼文件處理如此昂貴的資源?
- 28. 爲什麼NHibernate的AutoFlush檢查如此昂貴?
- 29. sklearn中的矢量化似乎非常昂貴。爲什麼?
- 30. 爲什麼字符串出了名的昂貴
好的答案謝謝! – Siddhartha