是否有可能通过充分理解现代 pc 体系结构来获得比编译器更好的性能?
Is it possible to get better performance than a compiler by fully comprehending modern pc architecture?
我知道现在很多编译器都非常擅长优化代码。但是,如果一个人完全理解现代 pc 体系结构,是否有可能使代码比编译器更快?
比如,如果他用 100% 的汇编编写代码,专注于架构怎么办?如果它确实有所作为,是否值得?
有时人类可以生成更好的代码,如果满足以下某些要求:
- 人类需要有关目标架构的特定知识。
- 人类知道编译器的所有技巧,例如(左移而不是乘法)。
- 此外,人类需要了解很多关于 assembly/processors 的信息,例如管道停顿、缓存未命中……
- 人类将需要大量时间来完成重要的程序。
Like, what if he write the code with 100% assembly, focusing on the architecture?
这个程序在这个 CPU 上会非常快,但你必须为每个 cpu 从头开始重写它。 (就像你用更快的 shr
指令为 Processor-1 写的一样,但是 Processor-2 有更快的 div
指令。)
此外,开发时间将显着延长(高达 20 倍)==>更高的成本
And if it does make a difference, is it worthwhile?
仅在一小部分应用程序中,例如为微控制器编写代码,或者如果您确实需要纯性能(数据的数据处理,GPU 无法完成)。
更多信息:
When is assembly faster than C?
但是:
首先使用其他算法,例如使用 Coppersmith–Winograd 算法而不是用于矩阵乘法的朴素算法。只有在使用所有其他可能性时,才使用汇编,否则你很快就会陷入维护噩梦。
是的! 有经验的开发人员 可以在特定任务 上明显击败编译器(给定相对较长的时间)。
一个原因是 开发人员可以获得比编译器更多的关于给定任务的信息(开发人员可以试验算法,获得有关数据大小、可能的输入、执行的信息程序的上下文)。另一个原因是 编译器并不完美(他们使用启发式算法)并且经常无法进行高级代码转换。
但是,通常只需向编译器提供提示、调整编译参数、插入内联汇编或内置调用就足够了,而不是用汇编编写完整的程序。
这方面的一个很好的例子是使用低级处理器指令,例如 non-temporal instructions or SIMD instructions as well as bit-wise instructions. These instructions can often be generated from compilers with enough hints. In the case of the register allocation,目标硬件的专家有可能设计出更好的汇编代码(在这种情况下,编译器提示是不够)。
是的,使用汇编程序编写代码的人类可以击败编译器。但总的来说,你最好把宝贵的时间花在更高层次的优化上。
为什么人类可以打败编译器?
因为编译器是由了解目标体系结构的人设计的。因此,在知识水平相同的情况下,人类可以编写出至少与编译结果一样高效的汇编代码。
它可能会更好,因为人类开发人员可以针对给定任务进行优化,而编译器只能应用通用优化。
为什么这是个坏主意?
都是开发成本。
使用汇编程序进行开发比使用高级语言需要 多得多 的时间,并且降低了可读性和可维护性。
在大多数情况下,您最好将相同的开发时间投入到高级优化中,例如更好的算法、局部优化,所有这些都基于对应用程序的全面分析以找到真正的瓶颈。
有了组装解决方案所需的预算,您甚至可以让两个或三个独立的、相互竞争的团队开发他们的高级解决方案,然后让他们将他们最好的想法组合成最终版本,并且仍然有预算来进一步优化那个。
我知道现在很多编译器都非常擅长优化代码。但是,如果一个人完全理解现代 pc 体系结构,是否有可能使代码比编译器更快? 比如,如果他用 100% 的汇编编写代码,专注于架构怎么办?如果它确实有所作为,是否值得?
有时人类可以生成更好的代码,如果满足以下某些要求:
- 人类需要有关目标架构的特定知识。
- 人类知道编译器的所有技巧,例如(左移而不是乘法)。
- 此外,人类需要了解很多关于 assembly/processors 的信息,例如管道停顿、缓存未命中……
- 人类将需要大量时间来完成重要的程序。
Like, what if he write the code with 100% assembly, focusing on the architecture?
这个程序在这个 CPU 上会非常快,但你必须为每个 cpu 从头开始重写它。 (就像你用更快的 shr
指令为 Processor-1 写的一样,但是 Processor-2 有更快的 div
指令。)
此外,开发时间将显着延长(高达 20 倍)==>更高的成本
And if it does make a difference, is it worthwhile?
仅在一小部分应用程序中,例如为微控制器编写代码,或者如果您确实需要纯性能(数据的数据处理,GPU 无法完成)。
更多信息: When is assembly faster than C?
但是: 首先使用其他算法,例如使用 Coppersmith–Winograd 算法而不是用于矩阵乘法的朴素算法。只有在使用所有其他可能性时,才使用汇编,否则你很快就会陷入维护噩梦。
是的! 有经验的开发人员 可以在特定任务 上明显击败编译器(给定相对较长的时间)。
一个原因是 开发人员可以获得比编译器更多的关于给定任务的信息(开发人员可以试验算法,获得有关数据大小、可能的输入、执行的信息程序的上下文)。另一个原因是 编译器并不完美(他们使用启发式算法)并且经常无法进行高级代码转换。
但是,通常只需向编译器提供提示、调整编译参数、插入内联汇编或内置调用就足够了,而不是用汇编编写完整的程序。
这方面的一个很好的例子是使用低级处理器指令,例如 non-temporal instructions or SIMD instructions as well as bit-wise instructions. These instructions can often be generated from compilers with enough hints. In the case of the register allocation,目标硬件的专家有可能设计出更好的汇编代码(在这种情况下,编译器提示是不够)。
是的,使用汇编程序编写代码的人类可以击败编译器。但总的来说,你最好把宝贵的时间花在更高层次的优化上。
为什么人类可以打败编译器?
因为编译器是由了解目标体系结构的人设计的。因此,在知识水平相同的情况下,人类可以编写出至少与编译结果一样高效的汇编代码。
它可能会更好,因为人类开发人员可以针对给定任务进行优化,而编译器只能应用通用优化。
为什么这是个坏主意?
都是开发成本。
使用汇编程序进行开发比使用高级语言需要 多得多 的时间,并且降低了可读性和可维护性。
在大多数情况下,您最好将相同的开发时间投入到高级优化中,例如更好的算法、局部优化,所有这些都基于对应用程序的全面分析以找到真正的瓶颈。
有了组装解决方案所需的预算,您甚至可以让两个或三个独立的、相互竞争的团队开发他们的高级解决方案,然后让他们将他们最好的想法组合成最终版本,并且仍然有预算来进一步优化那个。