对于没有 CS 背景(我的专业是应用数学)的人来说,asm 语言的学习曲线是否陡峭?
通常,熟悉一些高级编程语言(如 C/C++ 等)的人需要多长时间才能编写至少可以进行一些基本数学计算(如线性回归、一维正交多项式计算等)的 asm 程序?
顺便说一句,现代 asm 是否支持某些功能,例如:
带有 SIMD 指令的数学运算
多线程和线程控制
通常通过在 asm 中而不是在 C/C++ 中使用一些最新优化的编译器来执行此操作会获得很多性能提升吗?
对于没有 CS 背景(我的专业是应用数学)的人来说,asm 语言的学习曲线是否陡峭?
通常,熟悉一些高级编程语言(如 C/C++ 等)的人需要多长时间才能编写至少可以进行一些基本数学计算(如线性回归、一维正交多项式计算等)的 asm 程序?
顺便说一句,现代 asm 是否支持某些功能,例如:
带有 SIMD 指令的数学运算
多线程和线程控制
通常通过在 asm 中而不是在 C/C++ 中使用一些最新优化的编译器来执行此操作会获得很多性能提升吗?
对于大多数人来说,ASM 通常被认为是相当困难的。但是,它在逻辑上简单明了,我认为具有应用数学背景的人不会有问题。
在汇编中,您需要了解处理器的工作原理,因为在编写 asm 代码时,您最终是以最基本的方式操纵处理器。
考虑一下:
if (val)goto next;
翻译成这样的东西:
mov eax, [val]
cmp eax, 0
je next
本质上,Assembly 需要了解程序如何使用处理器来完成任务。EG:如何需要和使用寄存器(如 eax)。
一般来说,用 asm 比 C 做事情需要更长的时间。至于具体情况,我不知道。
一些现代指令集提供了新的数学运算,可能是也可能不是你所追求的。多线程等是操作系统的作用,与处理器无关,因此与组装无关(严格来说这不是真的,因为存在硬件多任务,但很少使用,但我离题了。)
与优化的 C/C++ 相比,编写 ASM 的性能提升通常非常小,除非您编写一小段重复的代码并花费大量时间进行优化。
通常通过在 asm 中而不是在 C/C++ 中使用一些最新优化的编译器来执行此操作会获得很多性能提升吗?
不。
编写 asm 更加困难和耗时:因为每条 asm 指令都比 HLL 语句简单,所以您需要更多的 asm 指令来实现相同的功能。用汇编编写有额外的复杂性,例如只有少量的寄存器。
此外,有许多方法可以编写汇编来实现相同的目的:例如,将mov eax,0
零xor eax,eax
写入eax
寄存器,但一种比另一种快。此外,asm 指令的序列对其运行速度有影响:如果它匹配以保持多个 CPU 流水线繁忙,则不明显或更长的指令序列可能会更快。
编写最佳汇编是计算密集型的:根据循环计数、考虑流水线等计算各种可能性可能需要多长时间。这种计算由优化编译器完成,它可能做得更好(更快、更准确)比你能。
http://www.amazon.com/Zen-Code-Optimization-Ultimate-Software/dp/1883577039是一本非常有趣的读物,但是在本书的结尾,它开始谈论奔腾级 CPU,您可以看到编写最佳程序集变得越来越复杂。
如果您对编译器的输出不满意,您可能会考虑使用更好的编译器:例如,英特尔的编译器产生(或至少用于产生)比许多其他编译器更优化的编译器,并且包括对特定 CPU、异常操作码的更好支持,也许有更好的运行时库等。