程序集/__asm内联
assembly / __asm inlining
我正在学习汇编,并在我的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,我强烈推荐计算机体系结构:定量方法。它在上下文中很好地解释了概念,所以你可以看到全局。对于对优化代码感兴趣的人来说,这些示例也非常有用,因为它们总是关注优先级和改进瓶颈。
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 使用读取[EBP 4]的MSVC内联ASM移植到64位
- GCC内联ASM X86 CPU标志作为输入依赖性
- 内联 ASM:'out'的操作数类型不匹配
- C/C++内联asm操作数类型不正确
- 内联ASM将值写入内存
- 内联asm是ANSI C标准的一部分吗
- 无法在 VC++ 内联 ASM 中选择Microsoft位
- 将内联ASM转换为X64 igraph的固有
- 使用内联 ASM 获取字符串
- 内联 asm 分配给"FS:0":处理程序未注册为安全处理程序
- 内联asm:推送函数参数
- 将 64 位 int 作为输出传递到 32 位内联 asm
- 具有变量的 GCC 内联 ASM
- GCC 内联 ASM,未知的 SSE 操作码
- GCC 内联 ASM 跳转到带有交叉抛出异常的标签
- 内联 ASM 到 x64 - 理解
- GNU内联asm:哪些寄存器被__stdcall阻塞
- GCC内联ASM保证