2012-12-09 95 views
1

對於沒有CS背景的人(我的專業是應用數學),asm語言能夠獲得陡峭的學習曲線嗎?彙編語言?

通常需要多長時間才能熟悉一些高級編程語言(如C/C++等)編寫asm程序,這些程序至少可以執行一些基本的數學計算,如線性迴歸,1D正交多項式計算等。

順便說一句,做現代ASM支持一些功能,如:

  • 數學OPS與SIMD指令

  • 多線程和線程控制

而且通常是有多少通過在asm中執行此操作而不是使用一些最新優化的編譯器的C/C++來獲得性能增益?

+2

我已經看到了一些基準測試,編譯器生成的代碼實際上是_faster_比手工創建的代碼,因爲這是在CPU的優化。 –

+0

它獲得了陡峭的學習曲線嗎?編寫這些程序需要多長時間?取決於你。任何你可以用ASM做的HHL,以及好的大腦(D'oh?),所以這些功能將會在那裏。通過良好的大腦,你可以使代碼儘可能快地處理器運行它(它可以比C快上一個數量級)。相信我,學習ASM將是值得的。所以放心。 – irisjay

+0

請定義「陡峭的學習曲線」。如果你把'c'叫做高級編程語言,你不會介意彙編。手動打印不好,但有一個庫。 –

回答

4

對於大多數人來說,ASM通常被認爲相當困難。然而,它邏輯上簡單明瞭,我不認爲具有應用數學背景的人會有問題。

在彙編中,您需要了解處理器的工作原理,因爲編碼asm時,您最終會以最有趣的方式操縱處理器。

考慮一下:只要

if (val)goto next; 

平移的東西,因爲這:

mov eax, [val] 
cmp eax, 0 
je next 

從本質上說,大會需要的程序如何使用處理器做任務的理解。 EG:如何註冊(如eax)需要和使用。

通常情況下,在C中執行asm操作需要更長的時間。至於具體情況,我不知道。

一些現代化的指令集提供了新的數學運算,這可能會或可能不會成爲你以後的事情。多線程等是操作系統的角色,與處理器沒有任何關係,因此沒有任何工作要做(因爲硬件多任務存在,但很少使用,但我離題了,這不是嚴格正確的。)

通過優化的C/C++編寫ASM通常幾乎沒有什麼性能優勢,除非您編寫了一小段重複的代碼,而且您花了大量時間進行優化。

+0

謝謝,我只是希望通過用asm代碼替換一些關鍵部分的代碼來改善我的程序,因爲按照我的程序實現的速度來看,當您將它與CPU進行比較時,似乎還有相當大的改進空間額定gflops(以及我知道有很多其他因素,如內存,緩存,分支等)。 – user0002128

1

通常在asm而不是C/C++中使用一些最新優化的編譯器來做這件事情會有很多性能增益嗎?

這是更加困難和耗時寫ASM:因爲每個彙編指令是一個除HLL語句簡單,你需要更多的彙編指令來實現相同的功能。組裝書寫有其他複雜性,例如只有少量的寄存器。

此外,還有許多方法來編寫彙編來實現同樣的事情:例如,mov eax,0xor eax,eax既寫零到eax寄存器,但一個比另一個更快。而且,asm指令的順序對其運行速度有所影響:如果它們匹配以保持several CPU pipelines繁忙,則不明顯或更長的指令序列可能會更快。

編寫最佳程序集是計算密集型的:根據循環計數,計算流水線等計算各種可能性需要花費的時間。此類計算由優化編譯器完成,它可能做得更好(更快更準確地說)比你能。

http://www.amazon.com/Zen-Code-Optimization-Ultimate-Software/dp/1883577039是一個非常有趣的閱讀,但在本書的最後,它開始談論奔騰級CPU,你可以看到編寫最佳程序集變得越來越複雜。


如果你不快樂與你的編譯器的輸出,你可能會考慮得到一個更好的編譯器:例如英特爾的編譯器生成的(或至少是用於生產),比許多其他的編譯器的優化,並列入更好針對特定的CPU,不尋常的操作碼,支持也許有更好的運行時庫等