环路地址对齐如何影响Intel x86_64的速度?
我发现相同的C ++代码的性能降低了15%,这些代码编译为完全相同的机器指令但位于不同对齐的地址上。当我的微小主循环从0x415220开始时,它比在0x415250时更快。我在Intel Core2 Duo上运行它。我在x86_64 Ubuntu上使用gcc 4.4.5。
任何人都可以解释减速的原因以及如何强制gcc最佳地对齐循环?
以下是具有探查器注释的两种情况的反汇编:
415220 576 12.56%| XXXXXXXXXXXXXX 48 c1 eb 08 shr $ 0x8,%rbx
415224 110 2.40%| XX 0f b6 c3 movzbl%bl,%eax
415227 0.00%| 41 0f b6 04 00 movzbl(%r8,%rax,1),%eax
41522c 40 0.87%| 48 8b 04 c1 mov(%rcx,%rax,8),%rax
415230 806 17.58%| XXXXXXXXXXXXXXXXXXX 4c 63 f8 movslq%eax,%r15
415233 186 4.06%| XXXX 48 c1 e8 20 shr $ 0x20,%rax
415237 102 2.22%| XX 4c 01 f9 add%r15,%rcx
41523a 414 9.03%| XXXXXXXXXX a8 0f test $ 0xf,%al
41523c 680 14.83%| XXXXXXXXXXXXXXXX 74 45 je 415283 ::运行(char const *,char const *)+ 0x4b3>
41523e 0.00%| 41 89 c7 mov%eax,%r15d
415241 0.00%| 41 83 e7 01和$ 0x1,%r15d
415245 0.00%| 41 83 ff 01 cmp $ 0x1,%r15d
415249 0.00%| 41 89 c7 mov%eax,%r15d
415250 679 13.05%| XXXXXXXXXXXXXXXX 48 c1 eb 08 shr $ 0x8,%rbx
415254 124 2.38%| XX 0f b6 c3 movzbl%bl,%eax
415257 0.00%| 41 0f b6 04 00 movzbl(%r8,%rax,1),%eax
41525c 43 0.83%| X 48 8b 04 c1 mov(%rcx,%rax,8),%rax
415260 828 15.91%| XXXXXXXXXXXXXXXXXXX 4c 63 f8 movslq%eax,%r15
415263 388 7.46%| XXXXXXXXX 48 c1 e8 20 shr $ 0x20,%rax
415267 141 2.71%| XXX 4c 01 f9 add%r15,%rcx
41526a 634 12.18%| XXXXXXXXXXXXXXX a8 0f test $ 0xf,%al
41526c 749 14.39%| XXXXXXXXXXXXXXXXXX 74 45 je 4152b3 ::运行(char const *,char const *)+ 0x4c3>
41526e 0.00%| 41 89 c7 mov%eax,%r15d
415271 0.00%| 41 83 e7 01和$ 0x1,%r15d
415275 0.00%| 41 83 ff 01 cmp $ 0x1,%r15d
415279 0.00%| 41 89 c7 mov%eax,%r15d
没有找到相关结果
已邀请:
2 个回复
帆攀缺锯欧
纫合峭