FPC压缩论文解读

写在前面

最近看着方面的工作,争取每天读一篇论文做一个合辑。
本篇论文的题目是
Frequent Pattern Compression: A Significance-Based Compression Scheme for L2 Caches

背景知识

随着处理器和内存速度之间的差距越来越大,内存系统设计者可能会发现缓存压缩有利于增加缓存容量和减少片外带宽。大多数硬件压缩算法都属于基于字典的类别,这取决于构建字典并使用其条目对重复的数据值进行编码。这种算法在压缩大型数据块和文件方面是有效的。然而,缓存线通常很短(32-256字节),每行字典会带来显著的开销,限制压缩性并增加此类算法的解压缩延迟。
关于各种压缩算法的分类和解释可以参考之前写的笔记。

数据压缩的前提
基于显著性的压缩是基于这样的观察:大多数数据类型(如32位整数)可以存储在比最大允许位数少的位数中。例如,符号位扩展是一种常用的技术,用于将小整数(例如,8位)存储到32位字中,而字中的所有信息存储在最不重要的几位中。

题外话

为什么要cache数据压缩

将片内Cache 中的数据进行压缩,可以显著增加Cache的有效容量,降低 Cache失效率和传送带宽需求,从而能够提高处理器的性能。但是,由于压缩Cache发生命中时需要首先对压缩数据进行解压缩,压缩Cache技术会增加Cache的命中延迟。 当后一效应占主导地位时,系统性能反而可能下降。因此,
压缩Cache技术对于某些应用能够提高性能,而对另外一些应用可能降低性能。这也是面向性能提升的压缩存储技术通常只应用于主存或l2 Cache的压缩,而不能应 用于l1数据Cache的原因。因为主存与l2 Cache的访问频率相对较少,较能容忍解压缩延迟,而L1 Cache的频繁访问对访问延迟的约束要求更为严格.

这里给出一些中文论文连接有兴趣可以看一看
基于简单常见模式编码(S-FPC)的压缩Cache层次设计

SFPC好像还蛮有意思的,这里稍微提及一下。
SFPC是FPC(也就是本文)的变种,具体的可以参考我这篇博客

一种简单的数据Cache压缩方法及其在同时多线程处理器上的应用

FPC压缩方案的核心特点

  1. 此方案中,频繁模式压缩(FPC)通过以压缩格式存储常见的字模式并附带适当的前缀,逐字压缩单个缓存线。
  2. 对于64字节缓存线,假设每个周期12 FO4门延迟,压缩可在三个周期内完成,解压缩可在五个周期内完成。
  3. 我们提出一种压缩缓存设计,其中数据以压缩形式存储在二级缓存中,但在一级缓存中不压缩。二级缓存线被压缩到预定的大小,永远不会超过其原始大小,以减少反编译开销。
  4. 这个简单的方案提供了与具有更高缓存命中延迟的更复杂方案相当的压缩比。

FPC压缩方案

压缩前缀编码特点

缓存线 = Cache line

频繁模式压缩(FPC)基于缓存线压缩/解压缩。每个高速缓存线被划分为32位字(例如,64字节线为16个字)。
每个32位的字被编码为3位pre-fix(前缀)加上数据。表1显示了与每个pre-fix对应的不同模式。
在这里插入图片描述

压缩层次特点

我们提出了一种压缩缓存设计,其中数据未压缩存储在一级缓存中,压缩存储在二级缓存中。
优点
这有助于减少许多阻碍性能的代价高昂的二级缓存未命中,同时又不会影响一级命中的常见情况。
缺点
但是,这样的设计增加了在两个级别之间移动时压缩或解压缩缓存线的开销。

压缩

当数据从一级缓存写入二级缓存时,会发生缓存线压缩。使用一个简单的电路(并行地)检查每个字的模式匹配,可以很容易地压缩缓存线。如果一个字与七种可压缩模式中的任何一种匹配,则使用一个简单的编码器电路将该字编码为其最紧凑的形式。如果未找到匹配项,则整个字将与pre fix“111”一起存储。
对于zero-run模式,我们需要检测连续的0的个数,并增加数据值来表示它们的计数。由于在我们的设计中,零运行被限制为8个零(多了的前缀就不是000了),因此可以使用简单的多路复用/加法器电路在一个周期内实现。

缓存线压缩可以在内存管道中实现,方法是在L1到L2写入路径上分配三个管道阶段(一个用于模式匹配,一个用于零运行编码,一个用于收集压缩线)。一个包含压缩和未压缩形式的几个条目的小型“受害者”我一般把这种cache叫老倒霉蛋缓存缓存可用于隐藏一级写回的压缩延迟。

解压缩

当数据从二级缓存读取到一级缓存时,会发生缓存线解压缩。对于工作集不在一级缓存中的大多数基准测试来说,这是一个经常发生的事件。
解压缩延迟非常关键,因为它直接添加到二级命中延迟中。
解压是一个比压缩慢的过程,因为行中所有单词的前缀都必须串联访问,因为每个pre-fix用于确定其对应的编码单词的长度,从而确定所有后续压缩单词的起始位置。

 举个例子,现在L2CACHE里面装的数据是


001010001000011111

第一步读001,前缀,则后面4bit是数据位
 所以L1CACHE中的数据是
 0000000000000000
 0000000000000100

此时确定了应该从010继续读L2CACHE,前缀010,则后面8位是数据位
 所以L1CACHE中的数据是
 0000000000000000
 0000000000011111

解压原理图(压缩原理图暂无)

在此之前我们先好好明确一个计算
一个CACHE LINE被分为若干个32位的字
例如一个64B的CACHE LINE被分为16个字
计算过程:64 * 1B = 16*32bit

在这里插入图片描述这是一个64字节(16字)缓存线的缓存线解压缩管道。
1个字3bit的前缀,16个字就是48bits
这是用于解压缩压缩缓存线的五级管道,其中每个级包含12个或更少的FO4门延迟。
第零步:确定zero-run的个数

  1. 第一流水线级(包含零运行检测器、移位寄存器和并行前置解码器)对前置阵列进行解码,以确定每个字的位长度。
  2. 第二级和第三级(并行前置加法器阵列)通过以分层方式添加前面单词的长度字段来计算每个数据单词的起始位地址。
  3. 第四级(并行移位寄存器)包含16个寄存器,每个寄存器都由其字的起始地址移位。
  4. 第五级和最后一级包含模式解码器,该模式解码器根据其对应的pre fix将每个32位寄存器的内容解码为未压缩字。

压缩结果

结果当然是很好的,我就不赘述了,有几个点可以注意一下
在这里插入图片描述

写在最后

感觉还有很多可以改进的空间

发布了105 篇原创文章 · 获赞 415 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43914889/article/details/104894014