Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 填充指令有什么真正的好处吗_Performance_Assembly_X86_Padding - Fatal编程技术网

Performance 填充指令有什么真正的好处吗

Performance 填充指令有什么真正的好处吗,performance,assembly,x86,padding,Performance,Assembly,X86,Padding,我知道现在英特尔和AMD处理器主要以其本机字长64位获取指令,于是我问了我弟弟这件事,他说为了让处理器更高效地运行,如果下一条指令的字节长度超过4或8个字节,一些汇编程序员会使用NOP将其指令填充到32位: xor ax, ax ; 2 bytes nop ; 1 nop ; 1 这样做有什么好处吗?在您的示例中没有理由使用nop指令。通常,指令对齐的唯一用途是最大化在控制流分支的目标(例如函数调用)获取的指令数。现代x86获取和解码单元针对x86编码的可变长度特性进行了优化。像这样的填充只会

我知道现在英特尔和AMD处理器主要以其本机字长64位获取指令,于是我问了我弟弟这件事,他说为了让处理器更高效地运行,如果下一条指令的字节长度超过4或8个字节,一些汇编程序员会使用NOP将其指令填充到32位:

xor ax, ax ; 2 bytes
nop ; 1
nop ; 1

这样做有什么好处吗?

在您的示例中没有理由使用nop指令。通常,指令对齐的唯一用途是最大化在控制流分支的目标(例如函数调用)获取的指令数。现代x86获取和解码单元针对x86编码的可变长度特性进行了优化。像这样的填充只会减慢速度


扫描“英特尔第4卷优化手册”(可能已过期几年)没有提供任何填充指令的理由。

在您的示例中,没有理由使用nop指令。通常,指令对齐的唯一用途是最大化在控制流分支的目标(例如函数调用)获取的指令数。现代x86获取和解码单元针对x86编码的可变长度特性进行了优化。像这样的填充只会减慢速度


扫描可能已过期几年的《英特尔第4卷优化手册》并没有提供任何填充指令的理由。

是的,它可以显著提高AMD推土机和英特尔Atom的性能,并在较小程度上提高英特尔Core 2&Nehalem的性能。对于推土铲和核心2,在16字节边界上对齐,对于Atom,在8字节边界上对齐。然而,最好使用附加前缀或更长的指令形式,而不是NOP。请注意,仅当需要一半以上的峰值IPC时,对齐指令才有意义。

是的,它可以显著提高AMD推土机和Intel Atom的性能,并在较小程度上提高Intel Core 2&Nehalem的性能。对于推土铲和核心2,在16字节边界上对齐,对于Atom,在8字节边界上对齐。然而,最好使用附加前缀或更长的指令形式,而不是NOP。请注意,只有在386处理器上需要一半以上的峰值IPC时,对齐指令才有意义。

?大概今天可疑。这些天的获取大小是16或32字节。在某些情况下,填充有一些好处,与此最相关的情况是,当Core2上的16字节块中有7条指令时,预编码器将在下一个周期中保留第7条指令,并且在下一个周期中只预编码一条指令。在这种情况下,用nops填充是没有帮助的,你应该用前缀填充。我不记得我们在386上做过什么。我记不起预回迁队列有多大,但就是记不起曾经有过填充有什么帮助的情况。在386处理器上?大概今天可疑。这些天的获取大小是16或32字节。在某些情况下,填充有一些好处,与此最相关的情况是,当Core2上的16字节块中有7条指令时,预编码器将在下一个周期中保留第7条指令,并且在下一个周期中只预编码一条指令。在这种情况下,用nops填充是没有帮助的,你应该用前缀填充。我不记得我们在386上做过什么。不记得预回迁队列有多大,只是不记得曾经有过填充有什么帮助的情况。你是说除了控制流更改的目标之外,对齐很重要?OP的示例是针对直通代码的。是的,例如,这里摘录自《英特尔优化手册》中有关原子优化的内容:指令长度和对齐方式会影响解码吞吐量。前端内部的预取缓冲区施加吞吐量限制,如果在任何7周期窗口中解码的字节数超过48字节,前端将经历等待缓冲区的延迟。此外,每次指令对跨越16字节边界时,它要求前端缓冲区至少再保持一个周期。因此,跨越16字节边界的指令对齐问题非常严重。很好的发现!这篇文章是专门针对Atom的,但它是有意义的。在优化前端一节中,我看不到适用于英特尔其他内核的如此有力的陈述。查看Agner Fog的微体系结构描述,了解其他微体系结构的详细信息。你是说除了控制流更改的目标之外,对齐更重要?OP的示例是针对直通代码的。是的,例如,这里摘录自《英特尔优化手册》中有关原子优化的内容:指令长度和对齐方式会影响解码吞吐量。前端内部的预取缓冲区施加吞吐量限制,如果在任何7周期窗口中解码的字节数超过48字节,前端将经历等待延迟
作为缓冲。此外,每次指令对跨越16字节边界时,它要求前端缓冲区至少再保持一个周期。因此,跨越16字节边界的指令对齐问题非常严重。很好的发现!这篇文章是专门针对Atom的,但它是有意义的。在优化前端一节中,我没有看到像英特尔其他内核那样有力的陈述。请查看Agner Fog的微体系结构描述,了解其他微体系结构的详细信息。