2012-12-09 271 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,不寻常的操作码,支持也许有更好的运行时库等