Chuanqiz’s blog

GPGPU-Sim Notes —— Cache

GPGPU-Sim笔记整理 cache

gpgpu-cache.cc

本文件主要分为三部分:

一;tag array

二;MSHR

三;CACHE

.h文件

主要定义了

枚举类型

名称 定义 内容
cache_block_state 定义cache行的状态 INVALID(无效的),RESERVED(保留) VALID(有效),MODIFIED(修改的,dirty)
cache_request_status cache请求的状态 HIT/MISSHIT_RESERVED(命中保留,表示数据在L2 -INCT队列中)RESERVATION_FAIL
cache_event 访问cache的事件 WRITE_BACK_REQUEST_SENT,写回请求READ_REQUEST_SENT, 读请求WRITE_REQUEST_SENT 写请求
replacement_policy_t cache 替换策略 LRU, FIFO,
write_policy_t cache 写策略 READ_ONLY, 只读 WRITE_BACK, 写回 WRITE_THROUGH,写直达 WRITE_EVICT, 写剔除 LOCAL_WB_GLOBAL_WT 局部写回 全局写直达
allocation_policy_t 分配策略在miss时,是否将数据填入cache。 ON_MISS, 不将数据填入cache ON_FILL 将数据填入cache
mshr_config_t MSHR 的配置方法 TEX_FIFO,用于texture(纹理cache)ASSOC//用于普通cache
set_index_function 用于set 索引号的方法 FERMI_HASH_SET_FUNCTION = 0,费米哈希设置 LINEAR_SET_FUNCTION, 线性设置 CUSTOM_SET_FUNCTION ?????

结构体

cache_block_t cache块结构 new_addr_type m_tag; new_addr_type m_block_addr; unsigned m_alloc_time; unsigned m_last_access_time; unsigned m_label; unsigned m_eacnt; unsigned m_lru; unsigned m_fill_time; cache_block_state m_status;
cache_sub_stats cache统计信息 accessmisspending hitreservation
extra_mf_fields 在data_cache 类的在texture_cachel类中也有不知道啥意思 bool m_valid; new_addr_type m_block_addr; unsigned m_cache_index; unsigned m_data_size;
fragment_entry texture_cache mem_fetch *m_request; // request informationunsigned m_cache_index; where to look for databool m_miss; // true if sent memory requestunsigned m_data_size;
rob_entry texture_cache bool m_ready;unsigned m_time; // which cycle did this entry become ready?unsigned m_index; // where in cache should block be placed?mem_fetch *m_request;new_addr_type m_block_addr;
data_block texture_cache bool m_valid; new_addr_type m_block_addr;
extra_mf_fields texture_cache bool m_valid; unsigned m_rob_index;

tag_array()

类名 描述 重点说明
cache_config cache配置的类 主要作用是初始化cache;读取配置文件gpgpu.config中的参数重要函数init():读入配置参数,初始化cacheset_index():设置cache块索引tag():读取tag位
l1d_cache_configl2_cache_config 继承cache_config
tag_array 详见cache基础 重要函数;probe():查找cache中的块实现LRU策略access():实现cache 策略的主要功能函数fill() 实现对cache的填充flush()冲刷,清空
mshr_table MSHR表,用来存放miss轨迹的 重要函数:probefulladd
cache_stats cache统计信息的类 主要统计cache的访问次数,命中率利用率等等
cache_t 所有cache的父类 继承关系详见cache继承关系
baseline_cache

1.理解一下cache结构tag

For generality, the tag includes both index and tag. This allows for more complex set index calculations that can result in different indexes mapping to the same set, thus the full tag + index is required to check for hit/miss. Tag is now identical to the block address.

tag(标记字段)通常包括index(索引)和tag(标记)。这样允许我们设置更复杂的索引计算,会导致不同的索引映射到同一个set(cache存储单元)里,因此满的 tag+index 需要进行检查是否命中。现在tag和block地址是相同的。

cache 继承关系

20 评论

  1. 能问一下接下来的内容吗?

    • zangcq

      这是几年前的读书时的工作了,有什么可以帮到你的?

      • 您好,我是一名本科生打算研究生从事这个方向,就是想问一下在cc文件中如何实现观测l1cache和l2cache的使用并且打印出来这种

        • zangcq

          2020年3月13日 在 下午3:53

          1. 首先这里有一份官网的manual可以了解一下,有一些体系结构的储备和simulator的介绍 http://gpgpu-sim.org/manual/index.php/Main_Page
          2. 其实simulator已经做了一些详细的统计数据,不知道这个环境的你已经搭好了吗?
          3. 当然你的直接诉求是 想加打印,那么可以看一下 https://github.com/gpgpu-sim/gpgpu-sim_distribution/tree/dev/src/gpgpu-sim 这个文件夹里的 gpu-cache.cc/l2cache.cc 这两个源文件,不过这是cache架构相关的一些实现,需要一定的背景知识。

          • 谢谢您的讲解,这部分的代码我阅读了大概,我想问一下在运行ispass-2009 benchmarks的在使用模拟器的l1和l2cache时,如何能直观的将其显示出来呢,gpu-cache.cc文件中的print如何直接使用呢?

          • zangcq

            1. 当你将2009这个benchmark里边的app编译出来时,可以运行每个app文件夹的脚本,我记得会对应生成一个output文件,里面有详细的统计,你可以搜索关键字l1_dcache类似的;
            2. 你说在gpu-cache.cc 加打印的话 用 fprintf() 应该就可以,会写到我刚才说的 output文件里。你可以试一下

          • 你好,对于out这个文件,我只在GTX480中找到了stdout文件,应该是编辑isbenchmark时生成的,但是运行每一个app时并不会打印出来各自的信息而是只会在运行的时候显示,是要通过什么方式才能让他生成信息文件吗

          • zangcq

            2020年3月16日 在 下午4:44

            1. 应该是这个stdout这个文件,里边应该包含了从启动模拟器到执行完成某个app的所有信息;
            2. 你可以重定向到 一个文件里吧 ./AES > run.log

          • 1.在我运行NN等文件时,发现不管怎么运行都没有stdout文件的生成和输出,原本的stdout是系统自带的
            2.我尝试在gpu-cache.cc中加入了自己的fprint来尝试着在home界面生成一个txt文件,可是运行程序之后并没有生成相应的文件。
            想问一下这个fprint为什么没有打印呢,不过是原本自带的程序还是现在?

          • 您好,想问一下如何让这个模拟器禁用l1dcache或者l2cache呢,如果我们要做性能分析的话,,分析哪块阻塞严重,是通过什么数据观测比较好呢,如果直接禁用这块的cache是否可行呢

          • zangcq

            2020年3月31日 在 上午9:35

            在 config 里边应该有l1或者l2 cache的配置选项,具体修改我忘记了。
            我估计你想做的是 cache bypass 这种性能能对比吧,应该gpusim 代码里可以修改一下,加个判断条件就行了。

  2. 你好,我想问一下在http://gpgpu-sim.org/manual/index.php/Main_Page中图8的描述,访问dram的两个统计量具体含义是什么,是互联网络到L2的miss吗,L2cache.cc中用内存控制器是否满来判断,内存控制器包括dram吗?

    • zangcq

      我的理解(可能不是那么准确):
      Shader Cores(aka NV Stream MultiProcessor)跟 GDRAM 之间的总线 应该称为 interconnect;
      统计量理解
      1. gpu_stall_dramfull
      Number of cycles that the interconnect outputs to dram channel is stalled.
      可以理解为,shader core 中访存过程中 L2 cache 中 miss了(跟你的理解差不多),然后到GDRAM 取数据的延迟吧。
      2. gpu_stall_icnt2sh
      Number of cycles that the dram channels are stalled due to the interconnect congestion.
      这个的话,就可以理解为 片上与片外的阻塞吧,可能是带宽不够,或者数据请求太多,应该有一个Queue的,如Figure7所示。

      具体代码我倒是没看,大体意思应该如上吧

      • 好的,多谢您的回答,还有就是想问一下他获取时间戳到底是什么含义,gpu_tot_sim_cycle和gpu_sim_cycle,一个是内核要求运行的时间,一个是所有内核运行的总时间,为什么要相加减去mf的时间戳就是延迟时间了呢

        • zangcq

          2020年5月1日 在 下午3:19

          1.关于时间戳的用意,常作为缓存替换策略的一个标记使用,如LRU算法;
          再说一下这两个cycle吧
          a. 关于kernel的理解,我个人理解为一个gpu程序的内核函数;应该不是操作系统内核的概念。那么cycle统计就是这个 kernel 函数的运行时间吧?
          b. 关于延迟时间的计算,这个公式我不太清楚。通常我们看程序一般以ipc=gpu_tot_sim_insn / gpu_tot_sim_cycle 作为性能参考。

          • 1.如果不关心程序的延迟而是关心每级存储的性能(也就是研究一下每级存储的平均延迟时间呢),这个时间戳gpu_tot_sim_cycle是所有kernel运行的周期数,gpu_sim_cycle是当前运行的kernel运行的周期数,加起来当成访存操作生成的时间,然后取出访存用当前gpu_tot_sim_cycle+gpu_sim_cycle-(访存操作生成时的gpu_tot_sim_cycle+gpu_sim_cycle),为什么会这么操作呢,直接用tot相减不就是了吗
            2.通过阅读GPGPU-sim的代码,想问一下L1是非阻塞cache,miss的话放入mshr表,这样L1的延迟是不是就是会被掩盖掉,L1每回合查看写回,是否影响到取指译码等阶段
            3.能问一下L2缓存的死锁问题吗?还有为什么L1没有死锁而L2会发生,而且占的比重较大
            4.DRAM的空指令是什么呢,还有就是DRAM还要等那几个参数归零才能访问是什么意思呢?比如说CCD(列到列延迟),执行一次后将它还原然后每循环递减到零才能重新执行,这是什么含义呢
            5.想问一下为什么DRAM[0]和DRAM[1]他们的n_cmd(总命令)相同,但是组成部分的数量却不同,比如说执行n_nop(空指令)的数量却不同呢?

          • zangcq

            1. 关于存储性能问题我没有涉及太多
            2. 你说的是 L1 data cache 吗? 延时还是有的,如果是读请求的话,是 on-demand 的,你不还是得等吗?取指令跟译码操作那不是 l1 instruction cache 相关的吗?这种指令cache,是只读的,而且命中率很高。
            3. 死锁问题从何而来?数据统计?
            4. 空指令的作用是用来仿真延迟的,CCD 这要看一下DRAM的结构。推荐我师兄硕士毕业论文《混合主存感知的末级缓存管理策略研究》中有DRAM结构的描述。
            5. 没看懂问题描述的含义。

          • 还有就是想问一下,在gpgpu-sim.config中nsets,nsize和nways的具体含义是什么呢

          • zangcq

            cache 的 配置参数;
            eg.
            # 64 sets, each 128 bytes 8-way for each memory sub partition. This gives 786KB L2 cache
            -gpgpu_cache:dl2 64:128:8,L:B:m:W:L,A:32:4,4:0,32

            nsets = 64 那么就是说 l2 cache 共有 64 个 entry
            bsizes = 128 就是 每个 cache block 里有 128 字节
            nways = 8 代表8路组相连,每个entry 里可以有 8个 cache block

            所以每个memory partition 里 l2 cache capacity = nsets * nways * bsizes
            total l2 cache = ( nsets * nways * bsizes ) * num of memory partition

          • 1.如果L1级cache访存也存在阻塞,那么想问一下,L1级cache的话,我看是非阻塞型的,那么怎么通过实验数据来证明L1级cache是非阻塞的呢,收集L1级cache存在未命中请求的时间和处理数据的时间感觉无法证明所有周期都是非阻塞的,这方面怎么解决比较好呢
            2.L1级cache允许失效命中,L2级cache允许吗,L2级cache的MSHR和L1级的有什么区别呢

回复 zangcq 取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据