- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个锦标赛分支预测器模拟作为作业。该程序模拟微处理器中的锦标赛分支预测器。我想我做的一切都是对的。我无法追踪问题。我陷入了段错误。
/* Shreyas Kale Computer Architecture Homework 3 Problem 1 */
/*
* for global index, at first considered not taken, gi[0] --> MSB
* 0 --> not taken
* 1 --> taken
*
*/
#include<stdio.h>
#include<unistd.h>
#include<strings.h>
struct tables{
char msb;
char lsb;
}local[10],global[64],selector[10];
//6 bits = 64
struct global_index{
unsigned int i : 6; //bitfield, to index global predictor
}gi = {0};
int pc = 0, correct = 0;
//here I mean instruction address
char localdec, globaldec, selected;
void initialise()
{
int i,res;
for(i=0;i<10;i++)
{
local[i].lsb = 'n';
selector[i].lsb = 'n';
local[i].msb = 'n';
selector[i].msb = 'n';
}
for(i=0;i<64;i++)
{
global[i].lsb = 'n';
global[i].msb = 'n';
}
}
void main()
{
char *sbs, *sbo, *myfile;
FILE *fd_sbs, *fd_sbo, *fd_myfile;
char *seq_in, *fout; // for input and output to file
int g = 0;
int k = 0, res;
sbs = "sample_branch_sequence.txt"; //sample branch sequence filename
sbo = "sample_branch_output.txt"; //sample branch output filename
myfile = "myout.txt"; // my output filename
initialise();
fd_sbs = fopen(sbs,"r");
fd_sbo = fopen(sbo,"r");
fd_myfile = fopen(myfile,"a+");
/* Check whether files are opened */
if((fd_sbs == NULL) || (fd_sbo == NULL) || (fd_myfile == NULL))
{
printf("\n files are not opened properly, bye bye!");
return;
}
/*Actual algorithm*/
for(k=0;k<10000;k++)
{
fgets(seq_in,4,fd_sbs);
//printf("%s\n",seq_in);
pc = atoi(seq_in[0]);
//now branch
//look up local
if(local[pc].msb == 'n')
localdec = 'n';
else if(local[pc].msb == 't')
localdec = 't';
//lookup global
g = (int)gi.i;
if(global[g].msb == 'n')
globaldec = 'n';
else if(global[g].msb == 't')
globaldec = 't';
//look up selector
if(selector[pc].msb == 'n')
selected = 'g';
else if(selector[pc].msb == 't')
selected = 'l';
// final decision and program direction updation of output string
fout[0] = seq_in[0];
fout[1] = localdec;
fout[2] = globaldec;
fout[3] = selected;
fout[4] = ((selected == 'g') ? globaldec : localdec);
fout[5] = seq_in[1];
fout[6] = '\n';
fout[7] = '\0';
//put it in file
//calculate correct predictions
if(fout[4] == seq_in[1])
correct += 1;
res = fputs(fout,fd_myfile);
if(res == EOF){
printf("Something erroneous!!");
}
//update global counter
if(seq_in[1] == 't')
{
gi.i = gi.i << 1; //pust a 0 from left
gi.i += 1; //add 1 now so, lsb becomes 1
}
else if(seq_in[1] == 'n')
{
gi.i = gi.i <<1; //push a 0 from left
}
//NOW UPDATION OF THE PREDICTORS
if(fout[4] == seq_in[1])
{
//decision correct update selector accordingly
if(selected == 'g')
{
// decrement slector
if((selector[pc].lsb == 't')&&(selector[pc].msb == 't'))
selector[pc].lsb = 'n';
else if((selector[pc].lsb == 'n')&&(selector[pc].msb == 't'))
{
selector[pc].msb = 'n';
selector[pc].lsb = 't';
}
else if((selector[pc].lsb == 't')&&(selector[pc].msb == 'n'))
selector[pc].lsb = 'n';
else if((selector[pc].msb == 'n')&&(selector[pc].lsb == 'n')) //cant be deremented
return;
}
else if(selected == 'l')
{
//increment selector
if((selector[pc].lsb == 'n')&&(selector[pc].msb == 'n'))
selector[pc].lsb = 't';
else if((selector[pc].lsb == 't')&&(selector[pc].msb == 'n'))
{
selector[pc].msb = 't';
selector[pc].lsb = 'n';
}
else if((selector[pc].lsb == 'n')&&(selector[pc].msb == 't'))
selector[pc].lsb = 't';
else if((selector[pc].msb == 't')&&(selector[pc].lsb == 't')) //cant increment
return;
}
//now update other tables : local first increment
if((local[pc].lsb == 'n')&&(local[pc].msb == 'n'))
local[pc].lsb = 't';
else if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
{
local[pc].msb = 't';
local[pc].lsb = 'n';
}
else if((local[pc].lsb == 'n')&&(local[pc].msb == 't'))
local[pc].lsb = 't';
else if((local[pc].msb == 't')&&(local[pc].lsb == 't')) //cant increment
return;
//now update global : increment
if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 'n'))
global[gi.i].lsb = 't';
else if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
{
global[gi.i].msb = 't';
global[gi.i].lsb = 'n';
}
else if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 't'))
global[gi.i].lsb = 't';
else if((global[gi.i].msb == 't')&&(global[gi.i].lsb == 't')) //cant increment
return;
}
else if(fout[4] != seq_in[1]) //wrong decision
{
//decrement local and global
if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
local[pc].lsb = 'n';
else if((local[pc].lsb == 'n')&&(local[pc].msb == 't'))
{
local[pc].msb = 'n';
local[pc].lsb = 't';
}
else if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
local[pc].lsb = 'n';
else if((local[pc].msb == 'n')&&(local[pc].lsb == 'n')) //cant decremet
return;
//now update global : decrement
if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
global[gi.i].lsb = 'n';
else if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 't'))
{
global[gi.i].msb = 'n';
global[gi.i].lsb = 't';
}
else if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
global[gi.i].lsb = 'n';
else if((global[gi.i].msb == 'n')&&(global[gi.i].lsb == 'n')) //cant decrement
return;
}
}
}
</code></pre>
最佳答案
你有seq_in作为
char * seq_in;
稍后在 fgets 调用中使用。您的变量必须正确分配内存,否则您的程序将引发段错误。你可以解决这个问题:
char seq_in[200]; /* or the size you want */
或者
char * seq_in = malloc (200, sizeof(char)); /* or the size you want */
同样的问题发生在你的 fout 变量上。
关于c - 段错误 : while simulating tournament branch predictor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618839/
在http://llvm.org/svn/llvm-project/libcxx/trunk/test/re/re.alg/re.alg.match/ecma.pass.cpp ,存在以下测试:
这个问题在这里已经有了答案: Finding sum of Absolute Difference of Every pair of integer from an array (8 个答案) 关闭
我知道我们可以在 N+log(N)-2 中找到大小为 N 的数组中的 2 最大元素,使用一场“锦标赛”algorithm .现在我想知道我们是否可以使用类似的“锦标赛”找到第 k 个 最大的元素。 我
为了测试不真实锦标赛(1999或2004版)ctf游戏类型的行为规则,我想用java制作一个完全可控的机器人。 没有人工智能,只有一系列的命令,比如跳跃,跑向这一点,等等。一种实时进化算法,进化出一系
我有一个锦标赛分支预测器模拟作为作业。该程序模拟微处理器中的锦标赛分支预测器。我想我做的一切都是对的。我无法追踪问题。我陷入了段错误。 /* Shreyas Kale Computer Archite
我在理解如何在我的遗传算法中实现 Langermann 函数和锦标赛选择时遇到了一些困难。我有 this作为 Langermann 函数的引用,但我不明白 C 值从何而来,因为我只有 X 和 Y。C
我有一个数组,例如长度为 10: Population = {1,3,4,2,7,-2,0,8,9,5}. 我生成两个 0-9 之间的随机数(例如 4 和 6)。然后我检查第四个和第六个元素 (7,
哪种方法最适合尝试在 Switch double 循环赛中平均分配对手,即每轮更换伙伴。 例如,在 8 人锦标赛中,您将进行 7 轮比赛,与每位玩家对战 3 或 4 次,并与每位玩家对战一次。当使用“
我想将 Unreal Tournament 环境用作使用 C# 开发 AI 机器人的 Playground 。我在这里找到了一个很好的起点 Creating NET bots for UT , 但是这
我是一名优秀的程序员,十分优秀!