被简单标量捕食者迷惑
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 table:
case BPred2bit:
p = &pred_dir->config.bimod.table[BIMOD_HASH(pred_dir, baddr)];
break;
但令我惊讶的是 PHT 故事永远不会更新!!!。我在任何地方都找不到代码,在 pred_update() 函数中也找不到!
你能告诉我原因吗?什么机制剂量 simplescalar 使用?
但是更新了。在 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;
}
}
table 的条目根据分支的结果递增或递减。该特定条目来自您问题中的第二个代码段。它只是一个指向 2 位计数器的指针。
现在我正在学习简单标量源代码。但我对预测模块感到困惑。这是关于双模预测器。 这是初始化:
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 table:
case BPred2bit:
p = &pred_dir->config.bimod.table[BIMOD_HASH(pred_dir, baddr)];
break;
但令我惊讶的是 PHT 故事永远不会更新!!!。我在任何地方都找不到代码,在 pred_update() 函数中也找不到! 你能告诉我原因吗?什么机制剂量 simplescalar 使用?
但是更新了。在 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;
}
}
table 的条目根据分支的结果递增或递减。该特定条目来自您问题中的第二个代码段。它只是一个指向 2 位计数器的指针。