2015-08-18 29 views
0

現在我正在學習simplescalar源代碼。但是我對預測模塊感到困惑。這是關於雙模預測器。 這裏是初始化:由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; 

但是我驚喜的是PHT故事永遠不會更新!!!我發現代碼無處,無論是在pred_update()功能!!!。 你能告訴我原因嗎?什麼機制劑量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位計數器的指針而不是副本。 –