0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

訪(fǎng)問(wèn)寄存器代替內(nèi)存引用

麥辣雞腿堡 ? 來(lái)源:OPPO內(nèi)核工匠 ? 作者:Rock ? 2023-12-13 11:07 ? 次閱讀

我們先看一個(gè)例子:

有這么兩個(gè)程序:它們的目的就是將數(shù)組x中的數(shù),按照下標(biāo)累加到數(shù)組y中,最后在把數(shù)組y中的數(shù)據(jù)累加到一個(gè)數(shù)dest里面。為了驗(yàn)證效果,我們將這個(gè)過(guò)程重復(fù)10000遍。

圖片

Prog 1 Prog2

這兩個(gè)程序的區(qū)別就在Prog2中紅框里面的內(nèi)容。那么哪個(gè)程序運(yùn)行的更快呢?

話(huà)不多說(shuō),我們看實(shí)際的結(jié)果:

圖片

圖片

這里為了說(shuō)明效果,我們編譯的時(shí)候,并沒(méi)有采用優(yōu)化(編譯優(yōu)化,確實(shí)可以提高程序運(yùn)行的效率,但是過(guò)高的編譯優(yōu)化等級(jí)會(huì)有一定的副作用,另外編譯器優(yōu)化也具有一定的局限性,高效的代碼仍然應(yīng)該是我們追求的目標(biāo))??梢钥吹?,Prog2要明顯比Prog1快。

要想理解上面的例子,我們必須先介紹一下寄存器匯編代碼的相關(guān)知識(shí):

寄存器

CPU內(nèi)部用來(lái)存放數(shù)據(jù)的一些小型存儲(chǔ)區(qū)域, 注意寄存器是在CPU內(nèi)部,受限于CPU的物理尺寸,寄存器數(shù)量不會(huì)太多。我們只需要記住兩點(diǎn):

1) 寄存器和CPU的L1 cache相比,速度雖然還在一個(gè)數(shù)量級(jí),但是L1 cache的訪(fǎng)問(wèn)速度還是要慢幾倍。具體的數(shù)據(jù)見(jiàn)下文表2

2) CPU只能從寄存器直接取數(shù)據(jù)或者指令,如果取不到,獲取的順序是L1-》L2-》L3-》主存-》磁盤(pán)。

從下文表2中可以看出,如果cpu的cache訪(fǎng)問(wèn)miss了,性能損失還是很大的。如果內(nèi)存里面再miss了,那對(duì)性能來(lái)說(shuō)不亞于一場(chǎng)災(zāi)難了。

計(jì)算機(jī)訪(fǎng)問(wèn)速度分級(jí):

表1 時(shí)間單位

圖片

以3.3GHz的CPU為例:

表2 系統(tǒng)的各種延時(shí)

圖片

正如你所見(jiàn),CPU周期的時(shí)間非常短,這段時(shí)間,光的速度大約只能走0.5米。想象一下,是不是非常震撼?

x86-64 CPU的整數(shù)寄存器:

圖片

我們無(wú)需刻意去記住這些寄存器的名稱(chēng),不同架構(gòu)的寄存器的數(shù)量和名稱(chēng)也不一樣,我們只要知道他們是cpu內(nèi)部的效率極高的存儲(chǔ)單元即可。

回到前面的例子,為什么Prog2要比Prog1快,是因?yàn)镻rog2里面用DEST這個(gè)局部變量代替了dest。DEST是一個(gè)局部變量,在匯編指令里是直接訪(fǎng)問(wèn)寄存器,而dest則需要去訪(fǎng)問(wèn)內(nèi)存cache。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120807
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10890

    瀏覽量

    212405
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3042

    瀏覽量

    74177
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3793

    瀏覽量

    81223
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    arm程序狀態(tài)寄存器訪(fǎng)問(wèn)指令

    arm程序狀態(tài)寄存器訪(fǎng)問(wèn)指令
    發(fā)表于 01-04 13:11 ?0次下載

    寄存器Load/Store內(nèi)存訪(fǎng)問(wèn)指令

    5.4 多寄存器Load/Store內(nèi)存訪(fǎng)問(wèn)指令 多寄存器Load/Store內(nèi)存訪(fǎng)問(wèn)指令也叫批
    發(fā)表于 10-18 15:56 ?1次下載

    為什么寄存器內(nèi)存快_原因是這個(gè)

    本文開(kāi)始介紹了寄存器特點(diǎn)、分類(lèi)以及寄存器的工作原理,其次介紹了內(nèi)存的容量、大小與選購(gòu)方法,最后闡述了寄存器內(nèi)存更快的原因。
    發(fā)表于 04-11 09:09 ?7127次閱讀
    為什么<b class='flag-5'>寄存器</b>比<b class='flag-5'>內(nèi)存</b>快_原因是這個(gè)

    逆向基礎(chǔ)之寄存器內(nèi)存詳解

    本文主要介紹的是逆向基礎(chǔ)的寄存器內(nèi)存方面的信息,首先介紹的是逆向主要是做什么的,其次對(duì)編程和機(jī)器架構(gòu)做了個(gè)簡(jiǎn)介,最后詳細(xì)的闡述了逆向基礎(chǔ)的寄存器內(nèi)存。
    發(fā)表于 04-26 09:52 ?2998次閱讀

    RFM反射內(nèi)存5565控制和狀態(tài)寄存器

    3.3 RFM反射內(nèi)存控制和狀態(tài)寄存器 內(nèi)存訪(fǎng)問(wèn)周期RFM5565 反射內(nèi)存控制和狀態(tài)寄存器,偏
    發(fā)表于 08-13 07:58 ?1309次閱讀

    寄存器變量

    C語(yǔ)言中使用關(guān)鍵字register來(lái)聲明局部變量為寄存器變量。寄存器變量的值會(huì)被存放在CPU的寄存器中,每當(dāng)需要使用它們時(shí),CPU就可以直接使用,而無(wú)須再通過(guò)控制
    發(fā)表于 06-03 10:13 ?2403次閱讀

    零基礎(chǔ)學(xué)ARM:程序狀態(tài)寄存器訪(fǎng)問(wèn)指令解析

    一、程序狀態(tài)寄存器訪(fǎng)問(wèn)指令A(yù)RM微處理支持程序狀態(tài)寄存器訪(fǎng)問(wèn)指令,用于在程序狀態(tài)寄存器和通用
    的頭像 發(fā)表于 12-24 13:36 ?3531次閱讀

    寄存器內(nèi)存的區(qū)別

    寄存器是中央處理內(nèi)的組成部份。它跟CPU有關(guān)。寄存器是有限存貯容量的高速存貯部件,它們可用來(lái)暫存指令、數(shù)據(jù)和位址。在中央處理的控制部件中,包含的
    發(fā)表于 12-31 16:57 ?1w次閱讀

    C語(yǔ)言訪(fǎng)問(wèn)MCU寄存器

    C語(yǔ)言訪(fǎng)問(wèn)MCU寄存器問(wèn)題由來(lái)://下面這行代碼的意思是直接操作0X020C4068這個(gè)寄存器//具體寄存器的作用是通過(guò)手冊(cè)得到的#define CCM_CCGR0 *((volati
    發(fā)表于 10-25 13:21 ?3次下載
    C語(yǔ)言<b class='flag-5'>訪(fǎng)問(wèn)</b>MCU<b class='flag-5'>寄存器</b>

    Cortex-M3 內(nèi)部寄存器

    寄存器組R0-R12R0-R12,通用寄存器;R0-R12都是32位通用寄存器,用于數(shù)據(jù)操作;但是絕大多數(shù)16位Thumb指令只能訪(fǎng)問(wèn)R0-R7,而32位Thumb指令可以
    發(fā)表于 11-26 16:21 ?39次下載
    Cortex-M3 內(nèi)部<b class='flag-5'>寄存器</b>

    [從零學(xué)習(xí)匯編語(yǔ)言] - 寄存器內(nèi)存訪(fǎng)問(wèn)

    [從零學(xué)習(xí)匯編語(yǔ)言] - 寄存器內(nèi)存訪(fǎng)問(wèn)
    發(fā)表于 11-26 20:51 ?13次下載
    [從零學(xué)習(xí)匯編語(yǔ)言] - <b class='flag-5'>寄存器</b>與<b class='flag-5'>內(nèi)存</b><b class='flag-5'>訪(fǎng)問(wèn)</b>

    訪(fǎng)問(wèn)CXL 2.0設(shè)備中的內(nèi)存映射寄存器

    計(jì)算快速鏈接 (CXL) 1.1 和 CXL 2.0 規(guī)范在內(nèi)存映射寄存器的放置和訪(fǎng)問(wèn)方式上有所不同。CXL 1.1 規(guī)范將內(nèi)存映射寄存器
    的頭像 發(fā)表于 05-25 16:56 ?2075次閱讀
    <b class='flag-5'>訪(fǎng)問(wèn)</b>CXL 2.0設(shè)備中的<b class='flag-5'>內(nèi)存</b>映射<b class='flag-5'>寄存器</b>

    寄存器內(nèi)存的區(qū)別

    在計(jì)算機(jī)體系結(jié)構(gòu)中,寄存器內(nèi)存是兩個(gè)至關(guān)重要的組成部分。它們各自承擔(dān)著不同的角色,共同確保計(jì)算機(jī)系統(tǒng)的正常運(yùn)行。本文將對(duì)寄存器內(nèi)存進(jìn)行詳細(xì)的介紹,包括它們的定義、功能以及二者之間的
    的頭像 發(fā)表于 05-12 17:11 ?2438次閱讀

    寄存器分為基本寄存器和什么兩種

    ,它們用于存儲(chǔ)指令、數(shù)據(jù)和地址等信息?;?b class='flag-5'>寄存器的容量通常較小,但訪(fǎng)問(wèn)速度非??欤?yàn)樗鼈兣cCPU的執(zhí)行單元緊密相連。 基本寄存器的分類(lèi) 基本寄存器可以分為以下幾類(lèi): (1)通用
    的頭像 發(fā)表于 07-12 10:31 ?1528次閱讀

    寄存器尋址的實(shí)現(xiàn)方式

    在計(jì)算機(jī)體系結(jié)構(gòu)中,寄存器尋址是一種常見(jiàn)的尋址方式,它允許程序直接訪(fǎng)問(wèn)CPU內(nèi)部的寄存器。寄存器尋址可以提高程序的執(zhí)行效率,因?yàn)樗苊饬藢?duì)內(nèi)存
    的頭像 發(fā)表于 07-12 10:36 ?759次閱讀