【问题标题】:Optimization for specific processor针对特定处理器的优化
【发布时间】:2014-04-02 19:43:34
【问题描述】:

我是优化新手,需要一些解释...

例如我有下一个程序:

int main() {
    for (int i = 0; i < 2000000; i++) {
        __asm {
                push esi
                push edi

                inc ebx
                inc eax
                mov ebx, 0xffffffff
                mov eax, 0xaaaaaaaa

                pop edi
                pop esi
        }
    }

    return 0;
}

所以当我在 vtune 测试中进行 - “高级热点分析”时。我在函数 main 中知道这总是一些热点:

Address Source Line Assembly    CPU Time: Total by Utilization  CPU Time: Self by Utilization   Instructions Retired: Total Instructions Retired: Self  Overhead and Spin Time: Total   Overhead and Spin Time: Self    Wait Time: Total    Wait Time: Self Inactive Time: Total    Inactive Time: Self
0x401000        Block 1:            0.0%        0.0%        0.0%        0.0%    
0x401000    1   push ebx            0.0%        0.0%        0.0%        0.0%    
0x401001    1   push esi            0.0%        0.0%        0.0%        0.0%    
0x401002    1   push edi            0.0%        0.0%        0.0%        0.0%    
0x401003    3   mov ecx, 0x1e8480           0.0%        0.0%        0.0%        0.0%    
0x401008        Block 2:            0.0%        0.0%        0.0%        0.0%    
0x401008    5   push esi    0ms 0ms 62.3%   14,956,555  0.0%    0ms 0.0%    0ms 0.0%    0ms
0x401009    6   push edi    0.872ms 0.872ms 0.5%    116,752 0.0%    0ms 0.0%    0ms 0.0%    0ms
0x40100a    8   inc ebx         0.0%        0.0%        0.0%        0.0%    
0x40100b    9   inc eax         0.0%        0.0%        0.0%        0.0%    
0x40100c    10  mov ebx, 0xffffffff         0.0%        0.0%        0.0%        0.0%    
0x401011    11  mov eax, 0xaaaaaaaa         0.0%        0.0%        0.0%        0.0%    
0x401016    13  pop edi         0.0%        0.0%        0.0%        0.0%    
0x401017    14  pop esi 2.923ms 2.923ms 20.6%   4,950,489   0.0%    0ms 8.5%    0.007ms 0.0%    0ms
0x401018    4   dec ecx 0.872ms 0.872ms 6.7%    1,613,429   0.0%    0ms 0.0%    0ms 0.0%    0ms
0x401019    4   jnz 0x401008 <Block 2>          0.0%        0.0%        0.0%        0.0%    
0x40101b        Block 3:            0.0%        0.0%        0.0%        0.0%    
0x40101b    19  pop edi         0.0%        0.0%        0.0%        0.0%    
0x40101c    19  pop esi         0.0%        0.0%        0.0%        0.0%    
0x40101d    19  xor eax, eax            0.0%        0.0%        0.0%        0.0%    
0x40101f    19  pop ebx         0.0%        0.0%        0.0%        0.0%    
0x401020    19  ret             0.0%        0.0%        0.0%        0.0%    

据我了解,所有指令都是配对的,这对 push/pop 指令的解码没有任何问题... 那么为什么会出现热点并且可以为某些特定的处理器(f.e. i7)删除它们?

感谢您的帮助。

【问题讨论】:

  • 插入任意的、毫无意义的内存访问会对你造成影响:)
  • 明显的优化是去掉所有的空操作,留下int main() { return 0; }
  • 我添加内联只是为了测试...

标签: c optimization assembly


【解决方案1】:

在此级别上,热点分析可能无法指向对给定基本块造成大部分性能影响的确切指令。由于开始耗尽许多指令的资源耗尽,一条指令可能会停顿很长时间。例如,由于movs 导致eaxebx 的重命名寄存器的旧副本比理想时间更长,您可能会用完加载缓冲区,这反过来又会导致@987654324 停滞不前@es 和pops。或者它可能与前面 jnz 的分支预测中的管道气泡有关。

不过,这些都是猜测。选择暴露前端和后端停顿的 VTune 分析类型可能会有所帮助。就像 twalberg 所说,这种分析以及任何进一步的分析对于完成实际工作的代码会更有意义。

如果您的最终目标是提高总运行时间,那么您可以应用许多其他技术。特别是,您在编译时就知道循环将执行多少次,并且可以肯定地说迭代之间没有依赖关系。在这些情况下,展开和矢量化是微不足道的。将您在此处获得的输出与编译带有“-O3 -mtune=corei7”之类标志的类似 C 代码时使用的指令进行比较。您可能根本看不到循环体,因为直到最后一次迭代被抛出,所有工作都在进行,但是如果您对其进行足够的调整以诱使编译器认为它需要为每次生成代码,您仍然可能会看到更有效的指令正在使用。

【讨论】:

    【解决方案2】:

    这听起来很像过早优化。现实情况是,优化并不是要完全消除热点,而是要减少某些关键代码路径热点的影响。在这个特定的示例中,无法避免每个 asm 指令将执行一定次数的事实,而现实情况是,某些指令,就其所做的性质而言,自然需要更长的时间来执行某些平台。 PUSH / POP 指令写入和读取内存并更新寄存器,以及某些边界检查等。 INC 和 MOV 指令只是更新一个寄存器(一旦你已经通过循环一次,MOV指令的立即操作数位于指令缓存中,并且循环足够小,它们不会被驱逐,因此所有指令的指令获取/解码开销不是主要因素)。 PUSH/POP 操作的缓存和内存周期意味着它们执行 INC/MOV 操作需要更长的时间,因此似乎会占用大部分执行时间。

    如果您想避免 PUSH/POP 指令所花费的执行时间,您可以 1) 消除 PUSH/POP 指令,因为它们无论如何都不会完成任何事情,但是其他指令似乎会占据大部分执行时间,或者 2) 引入“分散负载”的其他指令,或者 3) 尝试优化一些真实的东西,而不是一个真正什么都不做的小例子。

    【讨论】:

    • 感谢您的回答。但是我从真实代码中寻找另一个函数,它看起来通常编译器会生成好的代码......
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2011-03-22
    • 2021-01-30
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多