程序集/__asm内联

assembly / __asm inlining

本文关键字:内联 asm 程序集      更新时间:2023-10-16

我正在学习汇编,并在我的Digital Mars C++编译器中进行一些内联。我搜索了一些东西来让程序变得更好,并用这些参数来调整程序:

use better C++ compiler//thinking of GCC or intel compiler
use assembly only in critical part of program 
find better algorithm
Cache miss, cache contention.
Loop-carried dependency chain.
Instruction fetching time.
Instruction decoding time.
Instruction retirement.
Register read stalls.
Execution port throughput.
Execution unit throughput.
Suboptimal reordering and scheduling of micro-ops.
Branch misprediction.
Floating point exception.

除了"寄存器读取暂停",我什么都懂。

问:有人能告诉我这是如何在CPU和"超标量"形式的"无序执行"中发生的吗?正常的"无序"似乎是合乎逻辑的,但我找不到对"超标量"形式的合乎逻辑的解释

问题2:有人能给SSESSE2和更新CPU的一些好的指令列表吗?这些指令列表包括微操作表、端口吞吐量、单元和一些延迟计算表,以找到一段代码的真正瓶颈?

我会很高兴有这样一个小例子:

//loop carried dependency chain breaking:
__asm
{
loop_begin:
....
.... 
sub edx,05h //rather than taking i*5 in each iteration, we sub 5 each iteration
sub ecx,01h //i-- counter
...
...
jnz loop_begin//edit: sub ecx must have been after the sub edx for jnz
}
//while sub edx makes us get rid of a multiplication also makes that independent of ecx, making independent

谢谢。

计算机:Pentium-M 2GHz,Windows XP-32位

您应该看看Agner Fogs优化手册:C++中的优化软件:Windows、Linux和Mac平台的优化指南或汇编语言中的优化子例程:x86平台的优化手册。

但是,要想真正胜过现代编译器,您需要对要优化的架构有一些良好的背景知识:英特尔、AMD和VIA CPU的微体系结构:面向汇编程序员和编译器制造商的优化指南

我的两分钱:英特尔体系结构开发人员手册非常详细,还有所有SSE指令,包括操作码、指令延迟和吞吐量,以及您可能需要的所有血腥细节:)

"超标量"暂停是调度指令的一个额外问题。现代处理器不仅可以无序执行指令,还可以使用并行执行单元一次执行3-4条简单指令。

但要真正做到这一点,指令之间必须充分独立。例如,如果一条指令使用了前一条指令的结果,它必须等待该结果可用。

在实践中,这使得手工创建最佳装配程序变得极其困难。你真的必须像一台计算机(编译器)一样计算指令的最佳顺序。如果你改变了一条指令,你就必须从头开始。。。。

对于问题#1,我强烈推荐计算机体系结构:定量方法。它在上下文中很好地解释了概念,所以你可以看到全局。对于对优化代码感兴趣的人来说,这些示例也非常有用,因为它们总是关注优先级和改进瓶颈。