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

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

3天内不再提示

访问寄存器代替内存引用

麦辣鸡腿堡 来源:OPPO内核工匠 作者:Rock 2023-12-13 11:07 次阅读

我们先看一个例子:

有这么两个程序:它们的目的就是将数组x中的数,按照下标累加到数组y中,最后在把数组y中的数据累加到一个数dest里面。为了验证效果,我们将这个过程重复10000遍。

图片

Prog 1 Prog2

这两个程序的区别就在Prog2中红框里面的内容。那么哪个程序运行的更快呢?

话不多说,我们看实际的结果:

图片

图片

这里为了说明效果,我们编译的时候,并没有采用优化(编译优化,确实可以提高程序运行的效率,但是过高的编译优化等级会有一定的副作用,另外编译器优化也具有一定的局限性,高效的代码仍然应该是我们追求的目标)。可以看到,Prog2要明显比Prog1快。

要想理解上面的例子,我们必须先介绍一下寄存器汇编代码的相关知识:

寄存器

CPU内部用来存放数据的一些小型存储区域, 注意寄存器是在CPU内部,受限于CPU的物理尺寸,寄存器数量不会太多。我们只需要记住两点:

1) 寄存器和CPU的L1 cache相比,速度虽然还在一个数量级,但是L1 cache的访问速度还是要慢几倍。具体的数据见下文表2

2) CPU只能从寄存器直接取数据或者指令,如果取不到,获取的顺序是L1-》L2-》L3-》主存-》磁盘。

从下文表2中可以看出,如果cpu的cache访问miss了,性能损失还是很大的。如果内存里面再miss了,那对性能来说不亚于一场灾难了。

计算机访问速度分级:

表1 时间单位

图片

以3.3GHz的CPU为例:

表2 系统的各种延时

图片

正如你所见,CPU周期的时间非常短,这段时间,光的速度大约只能走0.5米。想象一下,是不是非常震撼?

x86-64 CPU的整数寄存器:

图片

我们无需刻意去记住这些寄存器的名称,不同架构的寄存器的数量和名称也不一样,我们只要知道他们是cpu内部的效率极高的存储单元即可。

回到前面的例子,为什么Prog2要比Prog1快,是因为Prog2里面用DEST这个局部变量代替了dest。DEST是一个局部变量,在汇编指令里是直接访问寄存器,而dest则需要去访问内存cache。

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

    关注

    31

    文章

    5336

    浏览量

    120224
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10854

    浏览量

    211563
  • 内存
    +关注

    关注

    8

    文章

    3019

    浏览量

    74000
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    80999
收藏 人收藏

    评论

    相关推荐

    arm程序状态寄存器访问指令

    arm程序状态寄存器访问指令
    发表于 01-04 13:11 0次下载

    寄存器Load/Store内存访问指令

    5.4 多寄存器Load/Store内存访问指令 多寄存器Load/Store内存访问指令也叫批
    发表于 10-18 15:56 1次下载

    为什么寄存器内存快_原因是这个

    本文开始介绍了寄存器特点、分类以及寄存器的工作原理,其次介绍了内存的容量、大小与选购方法,最后阐述了寄存器内存更快的原因。
    发表于 04-11 09:09 7081次阅读
    为什么<b class='flag-5'>寄存器</b>比<b class='flag-5'>内存</b>快_原因是这个

    逆向基础之寄存器内存详解

    本文主要介绍的是逆向基础的寄存器内存方面的信息,首先介绍的是逆向主要是做什么的,其次对编程和机器架构做了个简介,最后详细的阐述了逆向基础的寄存器内存
    发表于 04-26 09:52 2974次阅读

    RFM反射内存5565控制和状态寄存器

    3.3 RFM反射内存控制和状态寄存器 内存访问周期RFM5565 反射内存控制和状态寄存器,偏
    发表于 08-13 07:58 1241次阅读

    寄存器变量

    C语言中使用关键字register来声明局部变量为寄存器变量。寄存器变量的值会被存放在CPU的寄存器中,每当需要使用它们时,CPU就可以直接使用,而无须再通过控制
    发表于 06-03 10:13 2362次阅读

    零基础学ARM:程序状态寄存器访问指令解析

    一、程序状态寄存器访问指令ARM微处理支持程序状态寄存器访问指令,用于在程序状态寄存器和通用
    的头像 发表于 12-24 13:36 3433次阅读

    寄存器内存的区别

    寄存器是中央处理内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理的控制部件中,包含的
    发表于 12-31 16:57 1w次阅读

    C语言访问MCU寄存器

    C语言访问MCU寄存器问题由来://下面这行代码的意思是直接操作0X020C4068这个寄存器//具体寄存器的作用是通过手册得到的#define CCM_CCGR0 *((volati
    发表于 10-25 13:21 3次下载
    C语言<b class='flag-5'>访问</b>MCU<b class='flag-5'>寄存器</b>

    Cortex-M3 内部寄存器

    寄存器组R0-R12R0-R12,通用寄存器;R0-R12都是32位通用寄存器,用于数据操作;但是绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb指令可以
    发表于 11-26 16:21 39次下载
    Cortex-M3 内部<b class='flag-5'>寄存器</b>

    [从零学习汇编语言] - 寄存器内存访问

    [从零学习汇编语言] - 寄存器内存访问
    发表于 11-26 20:51 13次下载
    [从零学习汇编语言] - <b class='flag-5'>寄存器</b>与<b class='flag-5'>内存</b><b class='flag-5'>访问</b>

    访问CXL 2.0设备中的内存映射寄存器

    计算快速链接 (CXL) 1.1 和 CXL 2.0 规范在内存映射寄存器的放置和访问方式上有所不同。CXL 1.1 规范将内存映射寄存器
    的头像 发表于 05-25 16:56 1998次阅读
    <b class='flag-5'>访问</b>CXL 2.0设备中的<b class='flag-5'>内存</b>映射<b class='flag-5'>寄存器</b>

    寄存器内存的区别

    在计算机体系结构中,寄存器内存是两个至关重要的组成部分。它们各自承担着不同的角色,共同确保计算机系统的正常运行。本文将对寄存器内存进行详细的介绍,包括它们的定义、功能以及二者之间的
    的头像 发表于 05-12 17:11 2228次阅读

    寄存器分为基本寄存器和什么两种

    ,它们用于存储指令、数据和地址等信息。基本寄存器的容量通常较小,但访问速度非常快,因为它们与CPU的执行单元紧密相连。 基本寄存器的分类 基本寄存器可以分为以下几类: (1)通用
    的头像 发表于 07-12 10:31 1305次阅读

    寄存器寻址的实现方式

    在计算机体系结构中,寄存器寻址是一种常见的寻址方式,它允许程序直接访问CPU内部的寄存器寄存器寻址可以提高程序的执行效率,因为它避免了对内存
    的头像 发表于 07-12 10:36 638次阅读