1

我正在学习汇编并在我的 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:有人能否提供一些 SSE SSE2 和较新 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

谢谢你。

电脑:奔腾-M 2GHz,Windows XP-32 位

4

4 回答 4

1

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

于 2012-07-28T15:56:24.997 回答
1

“超标量”停顿是调度指令的一个附加问题。现代处理器不仅可以乱序执行指令,还可以使用并行执行单元一次执行 3-4 条简单指令。

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

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

于 2012-07-29T12:26:48.743 回答
1

对于问题 #1,我强烈推荐Computer Architecture: A Quantitative Approach。它很好地解释了上下文中的概念,因此您可以看到全局。这些示例对于对优化代码感兴趣的人也非常有用,因为它们始终专注于优化和改进瓶颈。

于 2012-10-24T19:31:49.100 回答