0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过C代码和Intel手册详细理解cache参数

SSDFans 来源:未知 作者:李倩 2018-08-15 14:25 次阅读

Cache的容量一般都很小,即使是最大的三级 Cache(L3)也只有20MB ~30MB。cache加快了CPU对内存的读写速率,CPU第一次执行需要将数据时候需要从主存-->L3 Cache--->L2 Cache -->L1 Cache传递到CPU的计算单元。cache分成多个组,每个组分成多个行,linesize是cache的基本单位,从主存向cache迁移数据都是按照linesize为单位替换的。下面通过C代码和Intel手册详细理解cache参数

Intel CPU可以通过CPUID命令获取cpu相关信息,查询Intel可以获取到相应的指令信息,获取cache 参数有下面两种方法:分别是当CPUID指令Initial EAX Value为0x02和0x04时候,由于方法一种CPUID指令的入口参数存放在EAX寄存器中,所以获取cache信息需要给EAX寄存器赋值为0x02,然后分别读取EAX、EBX、ECX、EDX四个寄存器得到Cache and TLB Information。查看Intel手册(图1)得到方法一的指令码。

图1

参考Linux内核中header.c文件中的cpuid函数实现获取cache代码函数,图2有两种方式实现获取cache函数,原理都是一样,赋值然后读取值。

图2

本次试验采用gcc 4.7.2版本编译程序并且运行得到如下结果:

d_eax : 55035a01

d_ebx : f0b2de

d_ecx : 0

d_edx : 9ca212c

查看intel 手册可以得到每个字节的解释,ebx寄存器中低八位查表得到如图3所示相关信息,3级cache 容量6M,12路组相连(每组有12个line),每个line大小为64 字节。其它信息查表得到如下:

EAX:

(55h) Instruction TLB: 2-MB or 4-MB pages, fully associative, 7 entries

(03h) Data TLB: 4-KB Pages, 4-way set associative, 64 entries

(5Ah) Data TLB0: 2-MB or 4-MB pages, 4-way associative, 32 entries

(01h) Instruction TLB: 4-KB Pages, 4-way set associative, 32 entries

EBX:

(F0h) 64-byte Prefetching

(B2h) Instruction TLB: 4-KB pages, 4-way set associative, 64 entries

(DEh) 3rd-level cache: 6-MB, 12-way set associative, 64-byte line size

EDX:

(09h) 1st-level Instruction Cache: 32-KB, 4-way set associative, 64-byte line size

(CAh) Shared 2nd-level TLB: 4-KB pages, 4-way set associative, 512 entries

(21h) 256KB L2 (MLC), 8-way set associative, 64-byte line size

(2Ch) 1st-level data cache: 32-KB, 8-way set associative, 64-byte line size

从上面信息得到当前CPU的cache信息如下:

L1 Cache : 32KB , 8路组相连,linesize为 64Byte 64个组

L2 Cache:256KB 8路组相连,linesize为 64Byte 512个组

L3 Cache:6MB 12路组相连,linesize为 64Byte 8192个组

图3

获取cache参数的另外一种方法,查阅Intel手册(图4)得到当CPUID的Initial EAX Value为0x04时得到cache十六进制数,在根据图4中的编码信息获取cache详细参数,执行该CPUID命令时还需要设置另外一个入口参数ECX,ECX寄存器设置我们需要查询哪一个cache ,ECX的输入与cache对应如下:

0:L1D

1:L1I

2:L2

3:L3

图4

执行CPUID Initial EAX Value 等于0x04时,返回的EAX、EBX、ECX、EDX寄存器值得位信息如图5所示。

图5

EAX[4:0]=1,表示这是一个数据Cache。EAX[7:5]=1,表示该Cache的级别为1,即为L1D。EAX[8]=1表示该Cache处于自初始化的Cache层(Seache Level)。EAX[9]=0,表示此Cache不是全相联Cache。EAX[25:14]=1表示能够共享此Cache的最大线程数为2。EAX[31:26]=15,表示这个处上,最多支持16个核心。EBX[11:0]=63表示Cache LineSize为64字节。EBX[21:12]表示此Cache不支持硬件Cache Line分区。EBX[31:22]=7,表示此Cache为8路组相联

7表示此Cache的组数为8组。

获取L3 cache详细参数代码如图6所示:

图6

代码运行结果如下:

d_eax : 163

d_ebx : 2c0003f

d_ecx : 1fff

d_edx : 6

计算L3 cache容量公式如下:

Size = (Ways + 1) * (Partitions + 1) * (Line_Size + 1) * (Sets + 1)

= (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1)

=(0x2c0003f>>22+1)*((0x2c0003f&0x003FF000)>>12+1)*(0x2c0003f&0x00000FFF+1)*(0x1fff+1)

= 6291456 B=6144 K=6M

获取其它cache 只需要修改传入cpuid的ecx参数,如果需要获取CPU的其它信息,可以查看Intel 指令手册修改传入EAX参数的值

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Cache
    +关注

    关注

    0

    文章

    129

    浏览量

    28331
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68525

原文标题:几行C代码剖析Cache参数

文章出处:【微信号:SSDFans,微信公众号:SSDFans】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C6678芯片CACHE设置问题

    1 在文档《C66x CorePac User's Guide》中描述“Defines the size of the L1P cache. The L1PMODE field powers-up
    发表于 06-21 14:00

    如何理解C6678中关于cache的描述?

    在TMS320C6678中,有这样对cache的描述:“L1D memory cannot be cached within L1D cache, L1P cache, or L2
    发表于 06-21 16:07

    关于C6747的cache

    )用做片上RAM,将一些实时要求高的代码和数据放在这部分内存中。现在的现象是程序会跑飞,.text区和L2前半部分的数据(包括代码部分)会被修改,而且是大面积修改。不知道是不是因为L2的前半部分被用作cache了,使用L2CFG
    发表于 08-02 06:44

    关于芯片数据手册参数理解的问题

    最近用到一个集成四与门的芯片:SN54AHC08看数据手册的时候遇到一些疑惑,有前辈能帮忙解惑吗。1. 这里是芯片的一些参数的最大值,里边第七个参数规定了连续通过电流或地的电流,这样是
    发表于 12-16 11:02

    降低Cache失效率的方法[1]

    降低Cache失效率的方法[1]  学习目标:     理解失效的三种类型(3C);
    发表于 04-13 16:32 4246次阅读

    代码编译器Studio V2.3版本的Cache详细资料分析概述

    Cache分析是一个代码编写器Studio插件,它为您的程序在一个固定的时间内提供内存引用模式的图形化可视化。此工具可以帮助您提高程序的缓存性能。
    发表于 05-07 09:48 0次下载
    <b class='flag-5'>代码</b>编译器Studio V2.3版本的<b class='flag-5'>Cache</b><b class='flag-5'>详细</b>资料分析概述

    DSP上CacheC64+ 系列中的应用(1)

    C64+ 系列DSP上Cache 的应用(第一部分)
    的头像 发表于 06-13 01:08 4131次阅读
    DSP上<b class='flag-5'>Cache</b> 在 <b class='flag-5'>C</b>64+ 系列中的应用(1)

    DSP上CacheC64+ 系列中的应用(2)

    C64+ 系列DSP上Cache 的应用(第二部分)
    的头像 发表于 06-13 01:01 3924次阅读
    DSP上<b class='flag-5'>Cache</b> 在 <b class='flag-5'>C</b>64+ 系列中的应用(2)

    MPU6050陀螺仪通过I2C传递数据的C语言源代码免费下载

    本文档的主要内容详细介绍的是MPU6050陀螺仪通过I2C传递数据的C语言源代码免费下载。
    发表于 06-10 17:54 44次下载
    MPU6050陀螺仪<b class='flag-5'>通过</b>I2<b class='flag-5'>C</b>传递数据的<b class='flag-5'>C</b>语言源<b class='flag-5'>代码</b>免费下载

    SPI总线驱动的C语言源代码详细概述

    本文档的主要内容详细介绍的是SPI总线驱动的C语言源代码详细概述。
    的头像 发表于 09-26 11:36 7223次阅读

    cache对写好代码真的有那么重要吗

    CACHE基础 对cache的掌握,对于Linux工程师(其他的非Linux工程师也一样)写出高效能代码,以及优化Linux系统的性能是至关重要的。简单来说,cache快,内存慢,硬盘
    的头像 发表于 07-26 15:18 1756次阅读
    <b class='flag-5'>cache</b>对写好<b class='flag-5'>代码</b>真的有那么重要吗

    Page Cache是什么 一文带你深入理解Linux的Page Cache

    是什么? 为了理解 Page Cache,我们不妨先看一下 Linux 的文件 I/O 系统,如下图所示: Figure1. Linux 文件 I/O 系统 上图中,红色部分为 Page Cache。可见 Page
    的头像 发表于 10-20 14:12 5937次阅读
    Page <b class='flag-5'>Cache</b>是什么 一文带你深入<b class='flag-5'>理解</b>Linux的Page <b class='flag-5'>Cache</b>

    什么是 Cache? Cache读写原理

    由于写入数据和读取指令分别通过 D-Cache 和 I-Cache,所以需要同步 D-Cache 和 I-Cache,即复制后需要先将 D-
    发表于 12-06 09:55 2555次阅读

    深入理解Cache工作原理

    按照数据关系划分:Inclusive/exclusive Cache: 下级Cache包含上级的数据叫inclusive Cache。不包含叫exclusive Cache。举个例子,
    的头像 发表于 05-30 16:02 799次阅读
    深入<b class='flag-5'>理解</b><b class='flag-5'>Cache</b>工作原理

    Cache内容锁定是什么

    “锁定”在cache中的块在常规的cache替换操作中不会被替换,但当通过C7控制cache中特定的块时,比如使某特定的块无效时,这些被“锁
    的头像 发表于 10-31 11:31 746次阅读