Sniper中cache实现

2023-12-11 06:48
文章标签 实现 cache sniper

本文主要是介绍Sniper中cache实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sniper中cache相关的文件

  • config文件夹
    • gainestown.cfg包含L3 cache的配置情况。嵌套包含了nehalem.cfg文件
    • nehalem.cfg包含L2 cache和L1 cache的配置情况。
    • sniper默认参数为gainestown.cfg文件
    ############  nehalem.cfg[perf_model/l1_icache]perfect = falsecache_size = 32associativity = 4address_hash = maskreplacement_policy = lrudata_access_time = 4tags_access_time = 1perf_model_type = parallelwritethrough = 0shared_cores = 1[perf_model/l1_dcache]perfect = falsecache_size = 32associativity = 8address_hash = maskreplacement_policy = lrudata_access_time = 4tags_access_time = 1perf_model_type = parallelwritethrough = 0shared_cores = 1[perf_model/l2_cache]perfect = falsecache_size = 256associativity = 8address_hash = maskreplacement_policy = lrudata_access_time = 8 # 8.something according to membench, -1 cycle L1 tag access timetags_access_time = 3# Total neighbor L1/L2 access time is around 40/70 cycles (60-70 when it's coming out of L1)writeback_time = 50 # L3 hit time will be addedperf_model_type = parallelwritethrough = 0shared_cores = 1[perf_model/l2_cache/srrip]bits[] = 3,3,3,3,3 #srrip算法需要额外增加这些信息,指明每个cacheline的额外需要的位数############  gainestown.cfg[perf_model/l3_cache]perfect = falsecache_block_size = 64cache_size = 8192associativity = 16address_hash = maskreplacement_policy =lru data_access_time = 30 # 35 cycles total according to membench, +L1+L2 tag timestags_access_time = 10perf_model_type = parallelwritethrough = 0shared_cores = 4
  • sniper\common\misc\fixed_types.h
    • 包含sniper整个系统中的类型定义,例如UInt64,IntPtr地址类型
    • 如果需要在sniper中增加全局变量可以选择在这个文件中进行声明,在使用的.cc文件中定义即可。所有文件都会包含这个文件。
    typedef int64_t SInt64;typedef int32_t SInt32;typedef int16_t SInt16;typedef int8_t  SInt8;typedef UInt8 Byte;typedef UInt8 Boolean;typedef uintptr_t IntPtr;extern UInt64 PC;
  • \sniper\common\core\memory_subsystem 包含了sniper中存储系统的定义和具体实现
    (1) .\parametric_dram_directory_msi\cache_cntlr.cc
    判断当前的访存操作cache是否miss或者命中,如果是命中访问cache(包括写回cache 和读取cache),如果cache 发生miss,则进行cache的插入操作。
HitWhere::where_t
CacheCntlr::processMemOpFromCore(Core::lock_signal_t lock_signal,
      Core::mem_op_t mem_op_type,IntPtr ca_address, UInt32 offset,Byte* data_buf, UInt32 data_length,bool modeled,bool count);
/* 接受访存或者是写存的请求,判断当前cache访问是否命中或者是缺失,然后调用不同的处理函数*/
SharedCacheBlockInfo* CacheCntlr::insertCacheBlock(IntPtr address,
      CacheState::cstate_t cstate, Byte* data_buf, 
      core_id_t requester, ShmemPerfModel::Thread_t thread_num);
/*当cache发生miss时会被上一个方法调用。主要功能是寻找cache block进行替换*/
void CacheCntlr::accessCache(
      Core::mem_op_t mem_op_type, IntPtr ca_address, UInt32 offset,Byte* data_buf, UInt32 data_length, bool update_replacement);
/*当cache未发生命中时的操作,也是被processMemOpFromCore方法调用。主要包括两个功能:read cache/write cache*/

(2) .\cache\cache.cc和cache.h
每个实际的cache都会被Cache类定义一个对象,例如L1-icache。Cache 中主要包含 cache 的一些基本信息,包括大小,类型,相连度等具体的信息和获取信息的一些操作。同时在cache类中包括了对cache的访问和插入的两个方法:accessSingleLine,insertSingleLine。这两个方法都会在CacheCntlr中被调用

/* cache类中的部分属性 */// Cache countersUInt64 m_num_accesses;UInt64 m_num_hits;// Generic Cache Infocache_t m_cache_type;CacheSet** m_sets;CacheSetInfo* m_set_info;
/* cache类构造函数 */
Cache(String name,String cfgname,core_id_t core_id,UInt32 num_sets,UInt32 associativity, UInt32 cache_block_size,String replacement_policy, cache_t cache_type,hash_t hash = CacheBase::HASH_MASK,FaultInjector *fault_injector = NULL,AddressHomeLookup *ahl = NULL);    
/* accessSingleLine */
//cache hit时,Cache controller会调用accessCache方法,在该方法中又会进一步调用cache类中的这个方法。该方法包括了对cache的读取和写入
CacheBlockInfo* accessSingleLine(IntPtr addr,access_t access_type, Byte* buff, UInt32 bytes, SubsecondTime now, bool update_replacement);
/* insertSingleLine  */  
//cache miss时,Cache controller会调用insertCacheBlock方法,在该方法中又会进一步调用cache类中的这个方法。
void insertSingleLine(IntPtr addr, Byte* fill_buff,bool* eviction, IntPtr* evict_addr,CacheBlockInfo* evict_block_info, Byte* evict_buff, SubsecondTime now, CacheCntlr *cntlr = NULL);

(3) .\cache\cache_base.h
CacheBase类中包括了一些cache的基本信息,例如相连度,cache大小。同时也包括了一些类型定义,例如replacement policy等,如果增加替换算法,需要更改这个地方。

    enum ReplacementPolicy{ROUND_ROBIN = 0,LRU,LRU_QBS,NRU,MRU,NMRU,PLRU,SRRIP,SHCT_SRRIP,SRRIP_QBS,RANDOM,NUM_REPLACEMENT_POLICIES,SHCT_LRU};//替换类型的枚举类型

(4) .\cache\cache_set.cc和cache_set.h
cache的替换算法是以组为单位,组内为若干cache line的集合。cache line的个数即为相连度。替换算法是在组中选择一个合适的cacheline进行替换。每一个组都会被CacheSet类定义一个对象。CacheSet类中主要包括了对cache的更基本的操作。accessSingleLine方法会调用read_line和write_line方法,insertCacheBlock会调用insert方法

/* cache hit时,用于访问cache,读取数据 */
void read_line(UInt32 line_index, UInt32 offset, Byte *out_buff,     UInt32 bytes, bool update_replacement);
/*  cache hit时,用于写回cache */
void write_line(UInt32 line_index, UInt32 offset, Byte *in_buff, UInt32 bytes, bool update_replacement);
/*  cache miss时,用于将数据插入到cache,替换算法的作用在这个地方体现 */
void insert(CacheBlockInfo* cache_block_info, Byte* fill_buff, bool* eviction, CacheBlockInfo* evict_block_info, Byte* evict_buff, CacheCntlr *cntlr = NULL);

cacheset除了包含cache的访问方法之外,如果需要自己增加替换算法还需要更改以下两个方法:

/* 根据替换算法的不同,创建对应的cache_set对象 */
CacheSet* CacheSet::createCacheSet(String cfgname, core_id_t core_id,String replacement_policy,CacheBase::cache_t cache_type,UInt32 associativity, UInt32 blocksize, CacheSetInfo* set_info);
/* 根据替换算法的不同,创建对应的cachesetinfo对象 */
CacheSetInfo* CacheSet::createCacheSetInfo(String name, String cfgname, core_id_t core_id,String replacement_policy, UInt32 associativity);
/* 根据输入的替换算法的字符串,判断替换算法的类型 */
CacheBase::ReplacementPolicyCacheSet::parsePolicyType(String policy);

(5) .\cache\cache_block_info.cc和cache_block_info.h
每一个cacheline都会被cacheBlockInfo的类创建一个对象,用于保存cache line的额外信息,例如tag位,used位等。如果增加替换算法,需要增加额外的信息,可以考虑在这个地方或者是上一层cacheset中增加。

    IntPtr m_tag;CacheState::cstate_t m_cstate;UInt64 m_owner;BitsUsedType m_used;UInt8 m_options;  // large enough to hold a bitfield for all available option_t's

(6) .\cache\cache_set_lru.cc和cache_set_lru.h
sniper中自带的lru算法,基类都是cacheset类,会实现基类中的getReplacementIndex方法和updateReplacementIndex方法。前者用于在寻找替换的cacheline时,根据确定替换算法,选择合适的cacheline被替换。后者则是用于当某一个cacheline被访问(读取,写回,插入)时,替换算法需要执行的更新操作(更新自身的额外信息,例如LRU的访问记录)。

/* cache set中的虚函数 */virtual UInt32 getReplacementIndex(CacheCntlr *cntlr) = 0;virtual void updateReplacementIndex(UInt32) = 0;
/* lru 替换算法中的具体实现 */
UInt32 CacheSetLRU::getReplacementIndex(CacheCntlr *cntlr)
{// First try to find an invalid block//首先寻找没有被用到的cacheline被替换for (UInt32 i = 0; i < m_associativity; i++){if (!m_cache_block_info_array[i]->isValid()){// Mark our newly-inserted line as most-recently usedmoveToMRU(i);return i;}}// Make m_num_attemps attempts at evicting the block at LRU positionfor(UInt8 attempt = 0; attempt < m_num_attempts; ++attempt){UInt32 index = 0;UInt8 max_bits = 0;//寻找最近都未被访问的cacheline进行替换for (UInt32 i = 0; i < m_associativity; i++){if (m_lru_bits[i] > max_bits && isValidReplacement(i)){index = i;max_bits = m_lru_bits[i];}}LOG_ASSERT_ERROR(index < m_associativity, "Error Finding LRU bits");bool qbs_reject = false;if (attempt < m_num_attempts - 1)//尝试的次数是给定的,参数传入{LOG_ASSERT_ERROR(cntlr != NULL, "CacheCntlr == NULL, QBS can only be used when cntlr is passed in");qbs_reject = cntlr->isInLowerLevelCache(m_cache_block_info_array[index]);}if (qbs_reject)//如果当前的数据在下一层cache中存在,则换一个cacheline{// Block is contained in lower-level cache, and we have more tries remaining.// Move this block to MRU and try againmoveToMRU(index);cntlr->incrementQBSLookupCost();continue;}else{// Mark our newly-inserted line as most-recently usedmoveToMRU(index);//更新操作m_set_info->incrementAttempt(attempt);return index;}}LOG_PRINT_ERROR("Should not reach here");
}//更新操作
void CacheSetLRU::updateReplacementIndex(UInt32 accessed_index)
{m_set_info->increment(m_lru_bits[accessed_index]);moveToMRU(accessed_index);
}
void CacheSetLRU::moveToMRU(UInt32 accessed_index)
{//m_lru_bits数字越大,说明当前的cacheline上次的访问时间越远for (UInt32 i = 0; i < m_associativity; i++){if (m_lru_bits[i] < m_lru_bits[accessed_index])m_lru_bits[i] ++;}//当前访问的cacheline对应m_lru_bits设置为0,表示刚刚被访问m_lru_bits[accessed_index] = 0;
}

(7) cache和cacheset之间关系的举例
示例:32KB, 8-way set-associative, 64B blocks
1个Cache对象包含(32KB/(8*64B))=64个CacheSet对象,每个CacheSet对象包含8个cacheline,每个cacheline都有一个CacheBlockInfo类保存额外信息

(8) 图解

这里写图片描述

这篇关于Sniper中cache实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479805

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机