高速缓存模拟中的位移位
Bit Shifting in Cache Simulation
中索引位和标记位的计算公式是什么?
- 直接映射缓存 关联缓存
- 设置关联缓存
我目前使用这个公式直接映射:
#define BLOCK_SHIFT 5;
#define CACHE_SIZE 4096;
int index = (address >> BLOCK_SHIFT) & (CACHE_SIZE-1);
/* in the line above we want the "middle bits" that say where the block goes */
long tag = address >> BLOCK_SHIFT; /* the high order bits are the tag */
请告诉我在关联缓存和设置关联缓存中移位了多少位。
所以,我认为你的问题的具体答案是"零",但那只是因为你问错了问题。
正确,所以一个给定大小X的缓存,直接映射,将简单地使用地址的下部[或其他部分]来形成缓存的索引。所以index是一个介于0和(chace-size-1)之间的值。换句话说,"地址模大小"。由于缓存的大小几乎总是2n,我们利用了这样一个事实,即这两个都可以使用简单的按位"and"和(size-1)来执行,而不是使用divide。
在你的代码中,每个缓存条目(cache-line)持有一个32字节的"BLOCK",所以地址应该被块大小划分(移动)。25 = 32。对于固定缓存行大小,此移位保持不变。由于示例代码中没有其他变化,我认为您误解了应该做什么。
在集合关联缓存中,有多组缓存行可以用于同一个索引。所以我们不是简单地取地址的下半部分作为索引,而是取地址下半部分的小数部分。那么index = address_of_block & (CACHE_SIZE-1)
就变成了address_of_block & ((CACHE_SIZE-1) / ways
。由于我们再次处理2n数字,我们可以使用旧的"移位而不是除"技巧- x / y
,其中y
是2n可以由x >> n
完成。
所以,现在你只需要找出n
是多少种方法。
当然,要弄清楚在替换缓存中的内容时如何确定使用哪种方法,但这当然是一个完全不同的问题。
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- G锁定铸造到基础上会释放模拟行为
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 获取英特尔 Kaby Lake 架构上最后一级高速缓存未命中计数的确切代码是什么?
- 如何通过IO定时测量来查找L1高速缓存行大小
- 高速缓存行检索和在大型数据结构上的性能
- 指令高速缓存和条件语句
- 英特尔 CPU 在处理大于其高速缓存行的类型时的预期行为是什么
- 高速缓存模拟中的位移位