0

对于没有 CS 背景(我的专业是应用数学)的人来说,asm 语言的学习曲线是否陡峭?

通常,熟悉一些高级编程语言(如 C/C++ 等)的人需要多长时间才能编写至少可以进行一些基本数学计算(如线性回归、一维正交多项式计算等)的 asm 程序?

顺便说一句,现代 asm 是否支持某些功能,例如:

  • 带有 SIMD 指令的数学运算

  • 多线程和线程控制

通常通过在 asm 中而不是在 C/C++ 中使用一些最新优化的编译器来执行此操作会获得很多性能提升吗?

4

2 回答 2

4

对于大多数人来说,ASM 通常被认为是相当困难的。但是,它在逻辑上简单明了,我认为具有应用数学背景的人不会有问题。

在汇编中,您需要了解处理器的工作原理,因为在编写 asm 代码时,您最终是以最基本的方式操纵处理器。

考虑一下:

if (val)goto next;

翻译成这样的东西:

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

本质上,Assembly 需要了解程序如何使用处理器来完成任务。EG:如何需要和使用寄存器(如 eax)。

一般来说,用 asm 比 C 做事情需要更长的时间。至于具体情况,我不知道。

一些现代指令集提供了新的数学运算,可能是也可能不是你所追求的。多线程等是操作系统的作用,与处理器无关,因此与组装无关(严格来说这不是真的,因为存在硬件多任务,但很少使用,但我离题了。)

与优化的 C/C++ 相比,编写 ASM 的性能提升通常非常小,除非您编写一小段重复的代码并花费大量时间进行优化。

于 2012-12-09T10:37:17.440 回答
1

通常通过在 asm 中而不是在 C/C++ 中使用一些最新优化的编译器来执行此操作会获得很多性能提升吗?

不。

编写 asm 更加困难和耗时:因为每条 asm 指令都比 HLL 语句简单,所以您需要更多的 asm 指令来实现相同的功能。用汇编编写有额外的复杂性,例如只有少量的寄存器。

此外,有许多方法可以编写汇编来实现相同的目的:例如,将mov eax,0xor eax,eax写入eax寄存器,但一种比另一种快。此外,asm 指令的序列对其运行速度有影响:如果它匹配以保持多个 CPU 流水线繁忙,则不明显或更长的指令序列可能会更快。

编写最佳汇编是计算密集型的:根据循环计数、考虑流水线等计算各种可能性可能需要多长时间。这种计算由优化编译器完成,它可能做得更好(更快、更准确)比你能。

http://www.amazon.com/Zen-Code-Optimization-Ultimate-Software/dp/1883577039是一本非常有趣的读物,但是在本书的结尾,它开始谈论奔腾级 CPU,您可以看到编写最佳程序集变得越来越复杂。


如果您对编译器的输出不满意,您可能会考虑使用更好的编译器:例如,英特尔的编译器产生(或至少用于产生)比许多其他编译器更优化的编译器,并且包括对特定 CPU、异常操作码的更好支持,也许有更好的运行时库等。

于 2012-12-09T10:51:55.783 回答