Посмотрите, как gcc планирует (график) инструкции на тиковом уровне - PullRequest
1 голос
/ 07 июня 2011

Как я помню, с помощью gcc для Pentium можно было просматривать расширенный дамп процесса компиляции, где gcc показывает, как он планирует (планирует) инструкции ассемблера для конвейеров U и V, а также показывает, сколько тиков (тактовых импульсов процессора) будет принять каждую инструкцию.

Можете ли вы сказать, какие версии gcc могут показывать такие дампы и какой вариант включить?

например. для 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 планирует тики для каждой итерации?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Я не совсем уверен, что вы имеете в виду, но -fsched-verbose=n (попробуйте с n = 6) сбрасывает некоторую информацию о расписании, которая выглядит как то, что вы ищете.

0 голосов
/ 09 июня 2011

.sched2 dump (можно получить через -fsched-verbose=1 или -fdump-rtl-all или -fdump-rtl-all-all) содержит необходимую информацию.Например, для gcc 4.6.0 с -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
...