Optimization 汇编语言与优化

Optimization 汇编语言与优化,optimization,assembly,Optimization,Assembly,汇编编程如何帮助实现优化这些天来,你必须非常擅长汇编才能打败编译器 我可以在一周中的任何一天做这件事,但只能先查看编译器的输出 然后,如果它获得超过几个百分点,我会感到惊讶 现在,我只在做编译器不能做的事情时才在汇编中编程。通常你不会在汇编中编程。您可以用C编写程序,然后查看生成的程序集,以了解C编译器自动进行了哪些优化(或未进行优化)。调整C代码(例如,允许更好的矢量化)将允许编译器更好地重新排列代码,这将为您提供优化的程序集。在程序集中编程本身不会优化代码。关于汇编的主要内容是,它允许您具有

汇编编程如何帮助实现优化这些天来,你必须非常擅长汇编才能打败编译器

我可以在一周中的任何一天做这件事,但只能先查看编译器的输出

然后,如果它获得超过几个百分点,我会感到惊讶


现在,我只在做编译器不能做的事情时才在汇编中编程。

通常你不会在汇编中编程。您可以用C编写程序,然后查看生成的程序集,以了解C编译器自动进行了哪些优化(或未进行优化)。调整C代码(例如,允许更好的矢量化)将允许编译器更好地重新排列代码,这将为您提供优化的程序集。在程序集中编程本身不会优化代码。关于汇编的主要内容是,它允许您具有非常低级的访问权限,并可以选择处理器执行的指令


因为您不会有编译器为您生成程序集,所以您可以在自己编写程序时执行代码优化,如果您知道如何操作的话。

那么,您认为您比
gcc
优化编译器更聪明吗?
如果没有,那么就继续学习(为了更好地优化而学习组装)。这类似于为了更好地使用递归而学习
Scheme
语言:)

汇编编程最有可能改进代码的方式是通过改进您:教您更多关于低级别发生的事情,以及获得优化规则可以帮助您在更高级别上做出正确的决策语言

就实际帮助一个项目而言:正如其他人所指出的,这几乎不值得。您可以将其用作一种高级的概要文件驱动优化:尝试多种变体,直到找到最适合您特定问题的变体

开始:用C或C++编写程序或任何通常使用的编译语言,启动调试器,并分解一个小但不重要的函数,并考虑编译器为什么做它所做的事情。然后试着自己写一点内联汇编程序。在现代系统中,汇编大多很容易嵌入到C中,而不是从头开始


或者,买一台像PIC这样的小机器,让它闪烁一个LED…

比在编写汇编代码时击败编译器更有可能。了解典型任务如何转换为汇编语言可能有助于编写更好的高级语言代码

通常,您不会为了优化目的而求助于组装。如果这是可能的,通常有人已经提供了基本代码供您调用,例如以线性代数库的形式


同样,汇编提供了对处理器的直接访问(例如原子性、时间测量、I/O),但重要的访问已经可以通过您的高级语言访问。

原则上,您可以在汇编中编写高度优化的代码,因为编译器仅限于特定的,通用优化应该适用于许多程序,而您可以创造性地使用您对这个特定程序的知识

举一个简单的例子,当我刚接触这项业务时,编译器优化寄存器使用的能力非常有限。您知道,要执行任何类型的算术或逻辑操作,CPU通常必须将其中一个值加载到寄存器中,然后对另一个值执行操作,然后保存结果?我想把两个数字加在一起——这里我将使用一个伪汇编程序,因为我不知道你们知道什么汇编语言,而且我自己也忘记了大部分细节——你们可以这样写:

LOAD A,value1
ADD A,value2
STORE a,destination
用于为每个操作生成加载的编译器。如果你的C程序说:

 x=x+y;
 z=z+x;
编译器将生成如下内容:

LOAD A,x
ADD A,y
STORE A,x
LOAD A,z
ADD A,x
STORE A,z
add r0,r4 addc r1,r5 addc r2,r6 addc r3,r7 但是人类可以观察到,当我们到达第二个语句时,寄存器a已经包含x,加法是可交换的,所以我们可以优化它:

LOAD A,x
ADD A,y
STORE A,x
ADD A,z
STORE A,z
等等。人们可以通过这样的各种微小的微观优化。当我年轻的时候,世界是绿色的,我总是这样做

但是这些年来,编译器变得更加智能,CPU也变得更加强大,因此微优化就不再那么重要了

因此,我大概有15年没有写过汇编语言代码了。我曾经在调试时阅读编译器生成的程序集,有时它会给一个微妙的问题提供线索,但我也已经多年没有这样做了

我认为编译器甚至不再是用汇编语言编写的了。相反,你在另一台计算机上用高级语言编写编译器的初稿,也就是说,你编写一个交叉编译器是为了让自己起步

我怀疑今天组装的唯一真正用途是用于极度受限的环境、嵌入式系统和诸如此类的东西;对于那些必须与硬件密切相关的程序,比如设备驱动程序


我很想听听这个论坛上是否有汇编程序员愿意告诉我们为什么他们是汇编程序员。

编译器在生成汇编程序方面做得很好

然而,手工编写的汇编程序速度更快有一个不好的原因。因为它更难写,所以你写得更少


如果程序员能够约束自己,用最少的代码完成同样的工作,而不考虑语言,那就太好了。

在编写汇编程序时,甚至在编写汇编程序输出的直接原始字节时,您可以编写使用计算机硬件特定功能的程序,或者编写其他非常仔细指定的程序

如果您的程序执行优化部分的频率远远高于执行其他任何操作,那么可能会有很大的好处。始终建立基准