我记得,使用gcc for Pentium可以查看高级转储编译过程,其中gcc显示了它如何计划(调度)U和V管道的汇编指令,还显示了多少滴答(CPU时钟)接受每条指令。
你能说,哪个版本的gcc可以显示这样的转储,以及启用此选项的选项是什么?
E.g。对于Core2,有core2.md
定义了解码器和执行端口,每个指令都有延迟。我想看看,gcc如何使用它以及在指令调度中做了什么决定。
换句话说:例如程序:
int main() {
int i; int j=0;
for(i=0;i<1000000;i++)
j+=i^((i+5)&(i>>2)&(i>>5) + (i>>2)&(i>>5))-(i+5);
return j%250;
}
我怎样才能得到gcc如何为每次迭代计划滴答?
答案 0 :(得分:2)
我不确定你的意思,但是-fsched-verbose=n
(尝试使用n = 6)会转储一些看起来像你所追求的调度信息。
答案 1 :(得分:0)
.sched2
转储(可通过-fsched-verbose=1
或-fdump-rtl-all
或-fdump-rtl-all-all
获取)包含所需信息。例如。 for gcc 4.6.0 with -Ofast -march=native -mtune=native
):
注意正确的部分:c2_decoder# - 是Core2计划的解码器; c2_p#是使用的端口数。
;; ======================================================
;; -- basic block 4 from 65 to 79 -- after reload
;; ======================================================
;; 0--> 78 {sp=bp+0x4;bp=[bp];clobber [scratc:c2_decoder0,(c2_p2+(c2_p0|c2_p1)),c2_p0|c2_p1
;; 0--> 65 xmm0=xmm4 :c2_decodern,c2_p0|c2_p1|c2_p5
;; 0--> 36 dx=0x10624dd3 :c2_decodern,c2_p0|c2_p1|c2_p5
;; 1--> 31 xmm0=xmm0 0>>0x40 :c2_decodern,c2_p1
;; 2--> 32 xmm4=xmm4+xmm0 :c2_decodern,c2_p0|c2_p5
;; 3--> 67 xmm0=xmm4 :c2_decodern,c2_p0|c2_p1|c2_p5
;; 4--> 33 xmm0=xmm0 0>>0x20 :c2_decodern,c2_p1
;; 5--> 34 xmm4=xmm4+xmm0 :c2_decodern,c2_p0|c2_p5
;; 6--> 72 cx=xmm4 :c2_decodern,c2_p0|c2_p1|c2_p5
;; 7--> 69 ax=cx :c2_decodern,c2_p0|c2_p1|c2_p5
;; 8--> 37 {dx=trn(sxn(ax)*sxn(dx) 0>>0x20);c:c2_decodern,c2_p1
;; 8--> 70 ax=cx :c2_decodern,c2_p0|c2_p1|c2_p5
;; 9--> 39 {ax=ax>>0x1f;clobber flags;} :c2_decodern,c2_p0|c2_p5
;; 11--> 38 {dx=dx>>0x4;clobber flags;} :c2_decodern,c2_p0|c2_p5
;; 12--> 40 {dx=dx-ax;clobber flags;} :c2_decodern,c2_p0|c2_p1|c2_p5
;; 13--> 41 {dx=dx*0xfa;clobber flags;} :c2_decodern,c2_p1
;; 16--> 42 {cx=cx-dx;clobber flags;} :c2_decodern,c2_p0|c2_p1|c2_p5
;; 17--> 47 ax=cx :c2_decodern,c2_p0|c2_p1|c2_p5
;; 17--> 50 use ax :nothing
;; 18--> 79 return :c2_decoder0
;; Ready list (final):
;; total time = 18