2015-08-18 7 views
0

сейчас я изучаю исходный код simplescalar. Но меня смущает модуль прогнозирования. Речь идет о предиторе бимода. Вот инициализация:Confused by simplescalr preditor

case BPred2bit: 
    if (!l1size || (l1size & (l1size-1)) != 0) 
     fatal("2bit table size, `%d', must be non-zero and a power of two", 
     l1size); 
    pred_dir->config.bimod.size = l1size; 
    if (!(pred_dir->config.bimod.table = 
    calloc(l1size, sizeof(unsigned char)))) 
    fatal("cannot allocate 2bit storage"); 
    /* initialize counters to weakly this-or-that */ 
    flipflop = 1; 
    for (cnt = 0; cnt < l1size; cnt++) 
    { 
    pred_dir->config.bimod.table[cnt] = flipflop; 
    flipflop = 3 - flipflop; 
    } 
    break; 

Здесь мы используем PHT таблицу:

case BPred2bit: 
    p = &pred_dir->config.bimod.table[BIMOD_HASH(pred_dir, baddr)]; 
    break; 

Но что к моему удивлению это рассказ РНТ никогда не обновляется !!!. Я не нашел код нигде, ни в функции pred_update() funtion !!!. Можете ли вы рассказать мне причину? Какой механизм использовать дозу simplescalar?

ответ

1

Но он обновляется. В bpred_update() вы найдете этот код

if (dir_update_ptr->pdir1) 
    { 
     if (taken) 
    { 
     if (*dir_update_ptr->pdir1 < 3) 
     ++*dir_update_ptr->pdir1; 
    } 
     else 
    { /* not taken */ 
     if (*dir_update_ptr->pdir1 > 0) 
     --*dir_update_ptr->pdir1; 
    } 
    } 

въездной таблицы либо увеличивается или уменьшается в зависимости от результата отрасли. Эта конкретная запись поступает из второго сегмента кода в вашем вопросе. Это всего лишь указатель на 2-битный счетчик.

+0

Да, спасибо, как вы сказали, это указатель на 2-битный счетчик, а не на копию. –