2. 中国科学院大学 网络空间安全学院, 北京 100049
2. School of Cyber Security, University of Chinese Academy of Sciences, Beijing 100049, China
现代处理器中一般都拥有若干被称为硬件性能计数器(Hardware Performance Counter, HPC)的寄存器[1]. 这种寄存器只会按照软件的配置在指定的事件发生时自增计数, 对处理器的正常工作或者性能表现不会有影响. 这些被记录的信息能够帮助软件工程师对代码进行优化, 也能够协助计算机架构师对处理器结构进行调优, 因此HPC几乎成为所有现代处理器的标配. 作为近年来备受学术界和工业界关注的开源指令集RISC-V, 其处理器在设计之初就把HPC考虑了进去并为其制定了相关标准. RISC-V特权指令规范[2]定义了若干控制和状态寄存器(Control and Status Registers, CSRs)作为计数器和选择器. 其中选择器将一个或多个(微)体系结构事件的信号接入计数器, 从而构成了可捕获特定事件的HPC. 在现代处理器结构愈发复杂的时代, 这种将HPC集中在CSR模块内的方式不利于HPC的拓展, 也限制了可同时监测的体系结构事件数量. 为此, 本文设计了一种分布式的性能计数器. 按照处理器内部模块的划分, 将HPC分布在不同区域, 并通过片上互连将HPC和CSR模块连接, 从而降低了CSR模块复杂度, 同时也为HPC的拓展提供了便利.
本文组织架构如下: 第2节介绍了相关的背景知识. 第3节介绍了SiFive U74-MC[3]的性能计数器并分析其不足之处. 第4节针对现有的HPC方案存在的问题, 提出了分布式的HPC方案. 第5节完成了将分布式的HPC部署到lowRISC-v0.4[4], 通过运行SPEC CPU2006[5]分析结果并评估该方案效果. 第6节总结本文.
2 研究背景 2.1 RISC-VRISC-V[6]是一种优秀的开源指令集架构, 由加州大学伯克利分校于2010年发布. RISC-V充分吸取了其他指令集优点: 结构优雅便于实现、灵活性强方便拓展、免费开源无须高昂的授权费用、社区活跃工具链完善等[7,8]. 这些优点使其得到了众多科研团队和商业公司的青睐. 目前已有平头哥、SiFive在内的商业公司推出了基于RISC-V指令集的处理器. 然而RISC-V定义的HPC存在不足, 无法同时监测多种体系结构事件, 在使用中局限性较大.
2.2 RocketChipRocketChip[9]是加州大学开源的基于RISC-V的64位处理器. 其中RocketChip的Rocket处理器核采用5级标量顺序流水线, 采用Chisel (Constructing hardware in a Scala embedded language)语言开发[10]. 作为加州大学为推广RISC-V而开发的开源处理器, RocketChip为全世界的科研团队提供了针对体系结构研究的优良平台.
2.3 lowRISC-v0.4lowRISC-v0.4是剑桥大学开发的基于RocketChip的开源SoC, 其基本信息如表1所示[4]. 相比于其他开源SoC 项目lowRISC-v0.4加入的OSD (Open SoC Debug) 模块[11]提供了函数追踪、特权模式监测、程序下载(通过UART接口)等功能. 这些功能在代码调试过程中提供了详细的调试信息. 本文利用OSD模块与上位机结合的方式, 使得lowRISC-v0.4能够自动运行SPEC CPU2006 benchmark[5], 并在运行结束后读取HPC, 获取体系结构事件的统计值, 从而验证HPC 能否正常工作.
2.4 硬件性能计数器
硬件性能计数器是一组能够记录(微)体系结构事件发生次数的寄存器. 这些事件通常包括时钟周期数、已执行指令数、分支预测失败次数、各级缓存(cache)的缺失/命中次数、TLB (Translation Look-aside Buffer)的缺失/命中次数等[1]. 对于会造成流水线阻塞的事件, 某些处理器中的HPC还会记录该事件导致的阻塞周期数[13,14]. 这些寄存器通常作为系统寄存器(比如ARM中的System Register, RISC-V中的CSR), 从而能够被指令直接访问. 尽管HPC不是处理器正常工作的必要组成单元, 也不会对处理器性能有影响, 然而HPC提供了硬件运行过程中实时的状态信息. 利用这些信息我们能够更加高效地对系统状态进行监测[1]、对硬件资源进行高效利用[15]、对功耗进行合理管理[16]、对恶意代码进行有针对性的检测[17,18]、对计算机系统结构[19]进行优化. 因此, 几乎所有现代处理器都会配置该计数器. HPC的管理和配置工作通常由性能监测单元(Performance Monitor Unit, PMU)完成. PMU为每一个HPC都分配了一个事件类型选择寄存器, 当(微)体系结构中发生的事件和该寄存器选中的事件匹配时, PMU就会控制对应的HPC增加计数值. 除了计数器和选择寄存器这两个成对出现的寄存器之外, 某些处理中的PMU还包含了其他寄存器, 从而可以提供更丰富、更强大的额外功能: 比如访问控制、特权级过滤(如过滤用户态下的事件)等. HPC的基本配置和访问较为简单, 通常只需在选择寄存器中, 选中要监控的事件. 对于较为复杂的需要则可以直接使用Linux下的开源工具—perf[20]. 经过多年的发展, 商业处理器HPC的硬件结构和软件配套已经十分完善, 能够满足各种应用需求. 然而, 迄今为止开源RISC-V处理器(如RocketChip, lowRISC) 中的HPC存在功能简陋、拓展性弱、能够同时统计的体系结构事件少等不足, 无法满足对于体系结构的研究需求. 基于此本文设计、实现了一种分布式HPC, 并使用该HPC进行我们相关的体系结构研究工作.
3 U74-MC的性能计数器U74-MC[3]是由SiFive公司发布的基于RISC-V指令集的64位高性能多核处理器, 可应用于数据中心、通信基站等对性能要求较高的场景. 作为目前性能最优的RISC-V处理器之一, U74-MC拥有功能全面的HPC. 因此本文对U74-MC的HPC进行了着重分析. U74-MC的HPC可以分为两类: 第1类按照RISC-V特权指令规范, 将若干CSR作为HPC寄存器, 软件可以通过CSR指令配置和访问这些HPC. 第2类专门用来统计L2的微体系结构事件, 这类HPC不会占用CSR, 而是像外设一样通过MMIO (Memory-Mapped I/O, 即内存映射)与处理器核连接. 为了便于区分, 本文把第1类称为核内HPC, 第2类称为外设HPC.
3.1 核内HPC按照RISC-V特权指令规范[3], U74-MC分配了4个CSR作为HPC (这些计数器称为mhpmcounter), 其中两个(mcycle和minstret)用于统计时钟周期和已执行指令数, 其余两个是可编程的CSR, 可用于够捕获选定的事件, 并完成计数. 事件的选择由mphevent寄存器控制, 能够选中某一种或某几种事件. 为了安全起见, 用户级(user-level)的程序不能配置该寄存器, 也无法直接访问mhpmcounter, 只能在机器级(machine-level). 程序在[m|s]counteren中开启了对应的计数器访问权限后, 用户级程序才被允许通过访问hpmcounter, 从而间接获取mhpmcounter中的存储的计数值. 即hpmcounter是mhpmcounter的影子寄存器(shadow CSR).
如图1所示, 核内HPC的寄存器位于CSR模块内部, 事件信号来自不同模块. 因此这种结构的HPC拥有极低的访问延时, 软件通过CSR命令能够直接获取HPC数据. 虽然核内HPC结构简单, 便于实现且能够满足大部分应用场景, 但仍存在不足: 首先, 无法同时监测大量事件, 当监测事件大于核内HPC数量时, 只能由软件不断切换监测的事件类型. 这种方式不仅损害了性能, 同时还降低了测量精度. 其次, 计数器都集中在CSR区域, 而(微)体系结构事件却分布在如处理器核、缓存、直接存储器访问(Direct Memory Access, DMA)等各个模块中. 繁多的计数信号来源给前端设计和后端布线带来了巨大挑战.
3.2 外设HPC现代处理器内部拥有种类众多的模块: 处理器核、缓存、DMA等, 将这些模块的事件信息全部汇总在核内HPC是很不明智的做法. 将同一模块的HPC集中在一起并作为外设连接到MMIO, 这样就避免了核内HPC计数信号过于分散的问题, 而且通过访存指令(LOAD/STORE)就能对这些HPC进行控制和访问. U74-MC的L2 HPC就使用了这种设计方来案监测L2缓存的(微)体系结构事件.
如图2所示, 外设HPC就像外设一样通过MMIO连接至处理器核, 由于IO空间范围较大, 此结构具有较好的拓展性. 外设HPC弥补了核内HPC缺陷, 能够同时监测更多的(微)体系结构事件. 但仍有一些不足: 首先, IO空间无法对用户态下的程序直接可见, 访问前需要经过操作系统的映射, 从而产生不小的代价. 其次, MMIO由诸多外设共享, HPC数据可能被恶意外设获取, 进而被利用发起侧信道攻击, 引起难以监测的安全问题. 最后, 相比于CSR访问命令, LOAD/STORE指令影响L1D (一级数据缓存)的缺失率, 即访问HPC会影响测量的准确性.
4 分布式性能计数器
针对以上不足, 本文提出一种分布式的性能计数器方案, 该方案充分结合了核内/外设 HPC两者优点: 首先, 该结构拥有众多HPC, 能同时监测上百种事件. 其次, 易于使用, 利用3个CSR就够控制和访问这些HPC, 不影响L1D性能有更好的准确性, 不占用MMIO, 因此不会带来地址映射的额外开销. 最后, 有着更好的安全特性, 能够通过CSR的权限控制管理HPC的访问, 从而避免了HPC被非法使用, 进而导致侧信道攻击.
4.1 结构核内HPC结构模型中的每一个计数器都占据了1个CSR, 当需要同时监测更多事件时, 就需要更多的CSR. 如果将这些计数器从CSR中剥离出来, 根据其事件类型和触发信号的来源, 将其分布在不同模块中, 并通过片上互连, 将各个计数器和对应的CSR相连, 这样就可以通过使用少量的CSR来控制和访问数量庞大的HPC, 按照这种策略, 本文设计了如图3所示的分布式性能计数器. 从图3中可以清晰地看出它由3个重要部分组成: HPCManager, HPCClient和HPCInterconnect. 而HPC的寄存器被分散在了HPCManager中.
HPCManager主要负责接收和处理来自HPCClient的数据请求, 根据请求命令去查找指定的HPC, 并把该HPC的数据返回给HPCClient. 1个HPCManager最多可以容纳64个HPC, 这些HPC并无编程功能, 每个计数器只能够记录特定的(微)体系结构事件. HPC按照所属模块进行划分, 比如处理器核中的事件统一划分给一个HPCManager, L2 (二级缓存)分片中的事件统一划分给另一个HPCManager. 当模块中的事件超过64种时, 可为该模块分配多个HPCManagerID. 显然, 相比于计数器集中在CSR中的方式, 这种按模块去划分的分布式方案拓展性更强, 拥有更规整、更清晰的结构, 同时带给后端布线的压力也更小.
HPCClient主要负责向HPCManager发起HPC数据请求以及接收返回的数据, 其结构如图4所示. 可以看出, HPCClient位于处理器核中的CSR模块, 它占用了3个CSR: hpcm (hardware performance counters bitmap), hpcc (hardware performance counters config)以及hpcr (hardware performance counters receive). 通过这3个CSR, 软件能够获取到任意HPC的数据. 它们的详细内容将在本文的4.2小节展开.
HPCInterconnect则把HPCClient和HPCManager连接在一起, 并且把这两种模块的命令、数据传递到指定位置. HPCInterconnect采用循环优先级, 它保证了在多核结构中, 每个核对HPCManager都拥有相同的优先级, 在多核同时向同一HPCManager发起请求时, 可以有效避免“饿死”的情况.
4.2 性能计数器占用的CSR在CSR中定义了3个寄存器, 即hpcc, hpcm, hpcr, 通过这3个寄存器来完成对HPC的管理和访问.
hpcc即 hardware performance counters config. 其比特位分配情况如图5所示. 作为硬件性能计数器的功能配置寄存器, 该CSR功能包括: 向指定的HPCManager发起HPC请求、指示接收状态、指示软件读取是否失败等.
以下内容是依据图5对hpcc的功能划分进行说明:
(1) trigger: hpcc[0] ReadWrite
该位主要功能是发起和取消HPC请求. 如果此位为0, 则表示当前没有正在进行的HPC请求, 这时写入1就可以触发一次新的HPC请求. 若此位为1, 则表示有正在进行的HPC请求, 软件可以通过写入0的方式来撤销当前未完成的请求. 当HPCClient接收完所有指定的数据后, trigger会自动复位, 表示完成了1次请求, 即所有需要的HPC数据均已存入fifo.
(2) interrupted: hpcc[1] ReadOnly
该位用于表示HPC在请求过程中, 是否发生过上下文切换. 当软件写hpcm时, 该位自动复位, 当上下文切换时, interrupted自动置位, 表示HPC请求阶段可能出现数据错误, 需要重新发起请求. 软件只拥有该位的读取权限.
(3) empty: hpcc[2] ReadOnly
该位用于表示接收返回数据的fifo状态. 当fifo空时, 该位会被置位, 否则被复位. 当软件写hpcm时该位自动置位, 软件只拥有该位的读取权限. 利用empty, 我们可以实现更快速地HPC读取, 当empty复位后, 软件就可以开始读取该数值, 而不必等到接收完HPCManager返回的所有数据(此时trigger自动复位)才开始读取工作. 因而把该位当作读取开始的判断依据, 能够节约一定的时钟周期.
(4) readerror: hpcc[3] ReadOnly
该位用于表示软件读取HPC时是否发生了错误. 当软件写hpcm时, 该位自动复位, 当软件从空的fifo中读出了数据时, 该位置位, 表示读到了错误的数据. 软件只拥有该位的读取权限.
(5) HPCMangerID: hpcc[20:4] ReadWrite
即HPCManager的ID. 软件向该位写入正确的ID号, 从而在选中预期的HPCManager之后, 置位trigger就能向该HPCManager发起HPC请求. 为了增强扩展性, 该位无法独立工作, 需要与hpcm寄存器配合使用. 事实上, HPC可以按照任意规则划分到HPCManager, 本着“一种逻辑清晰的划分规则, 既能给使用者带来便利也能够减轻后端布线的压力”的思想, 本文采取按照“模块化”的划分策略, 将HPCMangerID分割成module和extend两部分, module指的是处理器核0, 处理器核1, 末级缓存分片0, 末级缓存分片1等模块. 而复杂模块内的事件数量通常会超过64, 因此会使用extend对模块分配多个HPCManagerID.
useren: hpcc[21] ReadWrite
该位用于对用户级程序HPC访问权限的控制, 用户级的程序对该位只有读取的权限, 只有机器级或特权级下的程序能够对该位进行更改. 若此位为1, 则用户级的程序能够发起HPC请求, 否则用户级的程序在置位trigger时会触发异常. 该位的置位复位可以由操作系统完成, 这样能够对任意进程进行HPC访问权限的控制. 避免了HPC数据被恶意程序利用, 有着很好的安全特性.
hpcm即 hardware performance counters bitmap. 作为硬件性能计数器的位图选择器, 该寄存器的每一比特都对应HPCManager中的1个HPC. 当hpcc.trigger处于复位状态时, 软件拥有hpcm的写权限, 否则软件只能读取该寄存器. 当 HPCClient按照HPCMangerID指示向目标HPCManager发起请求时, hpcm选定了要读取的HPC, 同时该寄存器自动复位. 之后每接收到HPCManager返回的1个HPC, 就将对应的比特位置位, 通过读取该位, 软件可以知晓已接收到的HPC. 受限于寄存器最大位宽, 因此每次选取的HPC不能超过64个, 从而理论上, 1个HPCManager最多管理64个计数器. 为不同模块分配单独的HPCManager, 记录了不同模块内部的(微)体系结构事件, 目前支持的事件和对应的hpcm位图如表2所示. read表示读取缓存的次数. readmiss表示读取缓存, 但发生数据缺失的次数. write表示向缓存写入数据的次数. writemiss表示向缓存写入数据, 但是发生缺失的次数. writeback表示将缓存中的数据写入下一级缓存或者内存中的次数.
hpcr作为硬件性能计数器的接收寄存器, 软件只有该寄存器的读取权限. 通过读取该寄存器, 软件可以获得HPC数值. hpcr是直接连接到fifo输出端口, 软件每读取一次hpcr, fifo就会弹出一个新的数据存入hpcr寄存器. 当fifo为空时就会把过时或错误的数据存入该寄存器. 发起HPC请求后, 软件可以在hpcc.trigger由1变0后才开始读取hpcr (表示当前的HPC全部接收完毕), 也可以在hpcc.empty由1变0后立刻读取(表示当前接收到有返回的HPC). 在没有异常或例外的情况下, 两者得到的数值以及数值顺序完全相同, 且后者更节约时钟周期, 尤其在请求的HPC数量较多的情况中.
4.3 编程模型在裸机环境(bare metal environment)中, 不存在多个线程对HPC控制权的争抢问题, 配置并访问HPC十分简单. 算法1适用于裸机环境下获取HPC数值: 行①使用CSR置位指令, 将bitmap写入hpcm寄存器, 其中bitmap代表选中HPCManager中的某几个HPC. 行② id用来选中HPCManager, 置位trigger会触发对 HPCManager的请求. 行④等待HPCManager返回数据(empty复位). 行⑤empty复位后, 软件读取hpcr并将得到的HPC数据存入数组.
算法1. 裸机环境HPC的访问
输入: HPCM 的id和HPC对应的bitmap
输出: HPC记录的数据
Function get_HPCs(id, bitmap):
① set_csr(hpcm, bitmap);
② set_csr(hpcc, id&trigger);
③ for(i=0; i<=hpcnumber; i++) {
④ while(get_csr(hpcc.empty));
⑤ hpcs[i]=get_csr(hpcr);
⑥ }
在多线程环境下, 可能会出现同一个处理器核中的多个线程同时向HPC发起请求. HPC的获取需要HPC的3个寄存器相互配合, 当配置工作被其他线程打断, 则会出现意想不到的错误. 针对这种问题, 我们通过使用“软件锁”, 防止多个程序同时对HPC的3个寄存器进行控制和访问. 然而“软件锁”不仅实现复杂而且开销较大, 对测量精度有影响. 为此, 我们通过监测hpcc.interrupted位, 来判断HPC的请求程序是否发生过中断. 当系统中线程个数与中断次数均较少时, 这种方式的失败率可以忽略. 这种方法编程简单、易于实现, 不会给系统带来过多的额外开销, 更加适合我们的研究工作. 其具体算法如算法2所示: 行②复位hpcc寄存器, 终止可能正在进行的HPC请求. 行③至行⑧如算法1, 获取HPC数据并存入数组. 行⑨判断上述操作是否出现上下文切换, 若出现过上下文切换, 则返回到行②处.
算法2. 多线程中HPC的访问
输入: HPCM 的id和HPC对应的bitmap
输出: HPC记录的数据
Function get_HPCs(id, bitmap):
① do {
② clear_csr(hpcc.trigger);
③ set_csr(hpcm, bitmap);
④ set_csr(hpcc, id&trigger);
⑤ for(i=0; i<=hpcnumber; i++) {
⑥ while(get_csr(hpcc.empty));
⑦ hpcs[i]=get_csr(hpcr);
⑧ }
⑨ } while(get_csr(hpcc.interruped))
5 结果与分析我们通过将本文设计的分布式硬件性能计数器, 部署在lowRISC-v0.4上, 其消耗的资源如表3所示. 可以看出本文的设计硬件开销较小: LUTs和Registers分别占用了1.66%和6.29%. 其中, HPCClient使用寄存器相对较多, 其原因是用于接收HPC数据的缓冲区容量较大. lowRISC-v0.4能够以50 MHz的频率工作在Genesys2开发板[12], 其工作频率并没有受到HPC的影响. 通过使用OSD模块, 我们实现了lowRISC-v0.4可以自动运行SPEC CPU2006的各个整数测试集, 在运行完一百亿条指令后, 采用算法1读取HPC. 每个基准的测试用例结果的平均值如表4所示, 可以看出L2的读取次数等于指令缓存和数据缓存的缺失次数之和, 符合L1和L2包含关系. 结合表3、表4, 我们可以得出一个结论: 分布式的HPC能够以极少的硬件资源为代价, 实现了准确地记录时钟周期、执行指令数以及L1与L2各分片的读写次数和缺失次数.
6 结论与展望
表5将分布式的HPC和SiFive公司的U74-MC处理器所包含的两类HPC进行对比: U74-MC的核内型HPC结构简单安全性强, 但是在监测大量事件时, 需要依靠软件不断切换监测事件, 既增加了编程代码也降低了测量精度. U74-MC的外设型HPC将计数器部署在IO空间, 因此有很大的拓展空间, 能够同时监测大量事件, 然而由于通过MMIO连接, HPC数据可能泄露给恶意外设, 对处理器安全有一定影响. 而且外设型HPC需要LOAD/STORE指令访问, 这些指令对L1D的缺失率有一定影响. 本文设计的分布式HPC为每个事件都单独分配了计数器, 因而测量精度得到了保障. 根据事件种类将计数器部署在不同HPCManager中, 并利用独立的HPC互连将这HPCManager和处理器核中的HPCClient进行连接, 因此分布式HPC有着很大的拓展空间和很好的安全性. 除此之外该方案仅使用3个CSR就能访问所有的HPC, 避免了对CSR资源的过多占用. 这些优点给我们之后的相关研究工作带来了极大的便利. 但仍存在诸多缺陷: 首先分布式的HPC只适用于64位处理器, 通用性较差. 其次精力所限, 本文提出的方案没有经过严格测试无法保障稳定性, 只适合研究工作. 再次相较于商业处理器提供的众多监测事件, 本方案目前监测的事件种类少, 只统计了我们研究需要的事件. 这些不足均需要后续完善.
[1] |
邹文. 基于硬件性能监视的性能测试技术研究[硕士学位论文]. 长沙: 国防科学技术大学, 2004.
|
[2] |
Waterman A, Asanović K. The RISC-V instruction set manual, Volume II: Privileged architecture. https://riscv.org/wp-content/uploads/2019/08/riscv-privileged-20190608-1.pdf. (2019-06-08) [2021-04-06].
|
[3] |
SiFive, Inc. SiFive U74-MC core complex manual. https://sifive.cdn.prismic.io/sifive/f24c0f97-cd86-4a88-9f2d-af23e8e32a10_u74mc_core_complex_manual_21G1.pdf. [2021-04-06].
|
[4] |
Kimmitt J, Song W, Bradbury A. Tutorial for the v0.4 lowRISC release. https://www.lowrisc.org/docs/minion-v0.4/.[2021-04-06].
|
[5] |
Henning JL. SPEC CPU2006 benchmark descriptions. ACM SIGARCH Computer Architecture News, 2006, 34(4): 1-17. DOI:10.1145/1186736.1186737 |
[6] |
Waterman A, Asanović K. The RISC-V instruction set manual, Volume I: Unprivileged ISA. https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf. (2019-12-13) [2021-04-06].
|
[7] |
王诲喆, 唐丹, 余子濠, 等. 开源芯片、RISC-V与敏捷开发. 大数据, 2019, 7(4): 50-66. |
[8] |
余子濠, 刘志刚, 李一苇, 等. 芯片敏捷开发实践: 标签化RISC-V. 计算机研究与发展, 2019, 56(1): 35-48. DOI:10.7544/issn1000-1239.2019.20180771 |
[9] |
Asanović K, Avizienis R, Bachrach J, et al. The rocket chip generator. https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-17.pdf. (2016-06-15) [2021-04-06].
|
[10] |
Bachrach J, Vo H, Richards B, et al. Chisel: Constructing hardware in a Scala embedded language. Proceedings of the 49th Annual Design Automation Conference. San Francisco: Association for Computing Machinery, 2012. 1216–1225.
|
[11] |
The open SoC debug documentation library. https://opensocdebug.readthedocs.io/en/latest/. (2017-06-09) [2021-04-06].
|
[12] |
Genesys 2 FPGA board reference manual. https://reference.digilentinc.com/_media/reference/programmable-logic/genesys-2/genesys2_rm.pdf. (2017-08-24) [2021-04-06].
|
[13] |
Eyerman S, Eeckhout L, Karkhanis T, et al. A performance counter architecture for computing accurate CPI components. ACM SIGARCH Computer Architecture News, 2006, 34(5): 175-184. DOI:10.1145/1168919.1168880 |
[14] |
Intel. Dual-core update to the Intel Itanium 2 processor reference manual for software development and optimization revision 0.9. https://www.intel.cn/content/www/cn/zh/pro-ducts/docs/processors/itanium/dual-core-update-itanium-2-processor-manual.html. [2021-04-06].
|
[15] |
刘玉. 基于性能监测硬件支持的片上缓存资源管理技术[博士学位论文]. 合肥: 中国科学技术大学, 2013.
|
[16] |
Chetsa GLT, Lefèvre L, Pierson JM, et al. Exploiting performance counters to predict and improve energy performance of HPC systems. Future Generation Computer Systems, 2014, 36: 287-298. DOI:10.1016/j.future.2013.07.010 |
[17] |
李晓虹. 基于行为的Cache攻击检测系统[硕士学位论文]. 长沙: 湖南大学, 2018.
|
[18] |
周巧凤. 基于性能计数器的Cache侧信道攻击检测研究[硕士学位论文]. 北京: 北京交通大学, 2018.
|
[19] |
吴金磊. 处理器核的性能分析及其分支预测结构优化[硕士学位论文]. 长沙: 国防科学技术大学, 2016.
|
[20] |
Singh A, Buchke A. A study of performance monitoring unit, perf and perf_events subsystem. http://rts.lab.asu.edu/web_438/project_final/CSE_598_Performance_Monitoring_Unit.pdf. [2021-04-06].
|