gpt4 book ai didi

c - C 中的感知器分支预测器实现

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:00 27 4
gpt4 key购买 nike

我正在阅读论文,http://www.cs.utexas.edu/~lin/papers/hpca01.pdf , 关于感知器的动态分支预测。我想知道如果给定 1000 个 PC 地址(字地址)和记录在跟踪行中的 1000 个分支实际结果的列表,如何在 C 中实现感知器分支预测器。本质上,我想使用这些轨迹来衡量各种预测变量的准确性。跟踪文件的分支结果应用于训练您的预测器。有什么建议吗?

最佳答案

我认为它相当简单。 3.2 和 3.3 节是您真正需要了解的全部内容。

第 3.2 节说输出感知器是过去历史乘以它们的加权因子的总和:

#define SIZE_N 62 //or whatever see section 5.3
float history[n] = {0}; //Put branch history here, -1 not taken, 1 taken.
float weight[n] = {0}; //storage for weights

float percepatron(void )
{
int i;
float y=0;
for (i=0;i<SIZE_N;i++) { y+= weight[i] * history[i];}
return y;
}

然后3.3中的权重因子来自于训练,也就是简单的训练每一个过去的结果对比:

void train(float result, float y, float theta) //passed result of last branch (-1 not taken, 1 taken), and perceptron value
{
int i;
if ((y<0) != (result<0)) || (abs(y) < theta))
{
for (i=0;i<SIZE_N;i++;) {
weight[i] = weight[i] + result*history[i];
}
}
}

所以剩下的就是 theta,他们告诉你:

float theta = (1.93 * SIZE_N) + 14;

所以用法是:

y = percepatron();
//make prediction:
if (y < 0) predict_not_taken();
else predict_taken();
//get actual result
result = get_actual_branch_taken_result();//must return -1 not taken, 1 taken
//train for future predictions
train(y,result,theta);

//Then you need to shift everything down....
for (i=1;i<SIZE_N;i++)
{
history[i] = history[i-1];
//weight[i] = history[i-1]; //toggle this and see what happens :-)
}
history[0] = 1; //weighting - see section 3.2

关于c - C 中的感知器分支预测器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19648513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com