【发布时间】:2014-05-29 14:23:27
【问题描述】:
我希望以编译器在指令重新调度后生成的相同顺序查看反汇编代码。顺便说一句,我正在使用 GDB,当我给出一个命令说 disas /m FunctionName 时,它会按照源代码的顺序给我反汇编代码。我正在尝试查看我的编译器(GCC 4.1)重新调度指令的有效性,并希望了解如何重新调度指令。
谢谢!
///////////////编辑////////////////////////// /////////
看了一行代码的反汇编代码后:
double w_n = (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]) ;
我可以看到它的 83 字节指令。但在展开 2 次迭代后:
double w_n[2] = { (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]), (A_n_2[2] * x[0] + A_n_2[5] * y + A_n_2[8] * z + A_n_2[11]) };
代码块为 226 字节。并且指令数量大幅增加。谁能告诉我为什么会这样?我还可以从 VTune 中看到,展开后退出的指令增加了。 我能想到的可能原因:编译器通过增加块大小获得了足够的机会来生成简单指令,从而最大限度地提高指令预取和解码器单元的吞吐量。
非常感谢任何帮助。谢谢!!
【问题讨论】:
-
使用 clang 和 llvm 会更容易,因为您可以应用您感兴趣的通行证并生成 x86 或任何代码
标签: c++ debugging gdb computer-architecture intel-vtune