计算机组成原理老师给小明出了一道Cache映射方式相关的计算题目:
某系统的存储器为4MB,每字块为32个字,每字8位,若Cache为2MB,采用字节编址方式。问:
(1)存储器块内地址共有_____位
(2)Cache行号地址共有_____位
(3)采用全相联映射,块表中的主存标记位共有_____位
(4)采用直接映射,块表中的主存标记位共有_____位
(5)采用16路组相联映射,块表中的主存标记位共有_____位
小明想借助计算机帮忙自己算出答案,今后无论老师出何种组合,他都能一键运行答案,于是他开始了求Cache映射方式下各类地址位数的代码编写。现在他已经写出了y= l o g 2 x log_2 x log2x 的函数,编程时可以直接使用。
int log2(int x)
{
float fx;
unsigned long ix, exp;
fx = (float)x;
ix = *(unsigned long*)&fx;
exp = (ix >> 23) & 0xFF;
return exp - 127;
}
输入格式:
直接输入5个十进制正整数,中间用空格隔开,且保证这5个数的值都等于2的幂次,并符合存储器的一般约束性,如存储器容量会大于Cache容量。
这5个正整数分别代表
(1)存储器容量有多少MB(如题目中数字4);
(2)每字块多少个字(如题目中数字32);
(3)每字多少位(如题目中数字8);
(4)cache容量有多少MB(如题目中数字2);
(5)采用几路组相联(如题目中数字16)
输出格式:
见输出样例(注意输出的符号都是半角)。
输入样例:
在这里给出一组输入。例如:
4 32 8 2 16
4096 512 32 16 32
输出样例:
在这里给出相应的输出。例如:
1.存储器块内地址共有5位
2.Cache行号地址共有16位
3.采用全相联映射|块表中的主存标记位共有17位
4.采用直接映射|块表中的主存标记位共有1位
5.采用16路组相联映射|块表中的主存标记位共有5位
1.存储器块内地址共有11位
2.Cache行号地址共有13位
3.采用全相联映射|块表中的主存标记位共有21位
4.采用直接映射|块表中的主存标记位共有8位
5.采用32路组相联映射|块表中的主存标记位共有13位
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码一:
#include
int log2(int x);
int main(void)
{
int memorySize, blockwordSize, wordSize, cacheSize, wayNum;
scanf("%d %d %d %d %d", &memorySize, &blockwordSize, &wordSize, &cacheSize, &wayNum);
int blockSize = blockwordSize * wordSize >> 3;
int memoryNum = log2(memorySize) + 20;
int blockAddress = log2(blockSize);
printf("1.存储器块内地址共有%d位\n", blockAddress);
int cacheAddress = log2(cacheSize * (1 << 20) / blockSize);
printf("2.Cache行号地址共有%d位\n", cacheAddress);
int FAMicon = memoryNum - blockAddress;
printf("3.采用全相联映射|块表中的主存标记位共有%d位\n", FAMicon);
int DMicon = memoryNum - blockAddress - cacheAddress;
printf("4.采用直接映射|块表中的主存标记位共有%d位\n", DMicon);
int GAMicon = memoryNum - log2((1 << cacheAddress) / wayNum) - blockAddress;
printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位", wayNum, GAMicon);
}
int log2(int x)
{
float fx;
unsigned long ix, exp;
fx = (float) x;
ix = *(unsigned long *) & fx;
exp = (ix >> 23) & 0xFF;
return exp - 127;
}
参考代码二:
#include
int log2(int x)
{
float fx;
unsigned long ix, exp;
fx = (float)x;
ix = *(unsigned long*)&fx;
exp = (ix >> 23) & 0xFF;
return exp - 127;
}
int main()
{
int a,b,c,d,e;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
int num1=log2(b*c)-3;
int num2=log2(d)+20-num1;
int num3=log2(a)+20-num1;
int num4=log2(a)+20-num1-num2;
int num5=(log2(d)+3+20)-log2(e*b*c);
num5=num3-num5;
printf("1.存储器块内地址共有%d位\n",num1);
printf("2.Cache行号地址共有%d位\n",num2);
printf("3.采用全相联映射|块表中的主存标记位共有%d位\n",num3);
printf("4.采用直接映射|块表中的主存标记位共有%d位\n",num4);
printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位\n",e,num5);
return 0;
}