gpt4 book ai didi

c - 段错误 : while simulating tournament branch predictor

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

我有一个锦标赛分支预测器模拟作为作业。该程序模拟微处理器中的锦标赛分支预测器。我想我做的一切都是对的。我无法追踪问题。我陷入了段错误。

/* 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/

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