女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于LRU(Least Recently Used)的邏輯實現

Spinal FPGA ? 來源:Spinal FPGA ? 2024-11-12 11:47 ? 次閱讀

湊巧看到一個有關LRU(Least Recently Used)的邏輯實現,其采用矩陣方式進行實現,看起來頗有意思,但文章中只寫方法不說原理,遂來研究下。

LRU

LRU(Least Recently Used)算法是一種常用的緩存淘汰策略,其核心思想是:如果一個數據在最近一段時間內沒有被訪問到,那么在未來它被訪問的可能性也很小。因此,當緩存滿了的時候,最久未使用的數據會被淘汰。

LRU在Cache替換策略里還是有較大的用途的。對于一個N路組相連,當對應的entry滿了之后,當有新的訪問請求到來后需從N個entry中挑選出一個替換entry。通過LRU可以挑選出最久沒有被使用的元素。

LRU矩陣實現原理

對于一個具有N個Entry空間,LRU實現可以采用矩陣方式實現。這里以四個Entry空間為例:

c58b690e-9056-11ef-a511-92fbcf53809c.jpg

對于矩陣中的元素Value[i,j](第i行第j個元素),定義如下:

1: 為1時表示元素i在j訪問之后被訪問過。

0:為0時表示元素i在j被訪問之后沒有被訪問過。

搞清楚了這兩個元素定義,那么我們自然可以定義規則。當entry i被訪問時,執行如下操作:

將第i行所有元素全部設置為1.

將第i列所有元素全部設置為0.

這里有一個點就是Value[i,i]將會被設置為0,也沒有毛病,畢竟元素i在元素i被訪問之后沒有被訪問過也是對的。

那么基于此,很明顯一定存在某一行存在所有元素全為0的情況,從而也表示了其是Least Recently Used。

下圖給出了基于矩陣的LRU檢測過程:

c5af0d32-9056-11ef-a511-92fbcf53809c.jpg

Demo

基于上面的原理,下面的代碼基于SpinalHDL寫了一個簡單的Demo,包含仿真代碼:

packageLRU

importspinal.core._
importspinal.lib._

caseclass LRUUpdateRequest(entryNum: Int)extends Bundle {
val lru_state = Bits(entryNum * entryNum bits) //LRU State entryNum row,entryNum col
val lru_update_entry = UInt(log2Up(entryNum) bits)
}

caseclass LruControl(entryNum: Int)extends Component {
val io = newBundle {
val lru_state = in Bits(entryNum * entryNum bits)//LRU狀態
val lru_entry = out UInt(log2Up(entryNum)bits) //最近最少被使用

val lru_update_req = in(LRUUpdateRequest(entryNum))
val lru_update_result = out(Bits(entryNum * entryNum bits))
}
noIoPrefix()
/** *****************************************************************************************
* 計算最近最少被使用者
* 尋找矩陣中為0的行,只需找到一個即可,找最低位
* 實現機制:每一行做按位或,隨后取反,轉換為尋找最低位為1的位置
* ***************************************************************************************** */
val lru_row_state = io.lru_state.subdivideIn(entryNum bits).map(~_.orR).asBits()
val lru_row_state_oh = OHMasking.first(lru_row_state) //先轉換成獨熱碼
io.lru_entry := OHToUInt(lru_row_state_oh) //再轉換成二進制
/** *****************************************************************************************
* lru更新
* 更新規則,當更新entry i時,矩陣中第i行全部填1,矩陣中第i列全部填0
* ***************************************************************************************** */
val lru_update_entry_oh = UIntToOh(io.lru_update_req.lru_update_entry) //轉換成獨熱碼
for{
rowIndex <- 0?until entryNum;
????colIndex <- 0?until entryNum
??} {
????io.lru_update_result(rowIndex * entryNum + colIndex) := Mux(
??????sel = lru_update_entry_oh(colIndex),
??????whenTrue = False,
??????whenFalse = Mux(
????????sel = lru_update_entry_oh(rowIndex),
????????whenTrue = True,
????????whenFalse = io.lru_update_req.lru_state(rowIndex * entryNum + colIndex))
????)
??}
}

import?spinal.core.sim._
import?spinal.lib.tools.BigIntToListBoolean

object LruControlApp extends App {
??SimConfig.withFstWave.compile(LruControl(4)).doSim(dut => {
var lruState = BigInt(0)

def showLruState()= {
val lru_state_boolean = BigIntToListBoolean(lruState, 16bits)
for(rowIndex <- 0?until 4) {
????????println(s"${lru_state_boolean.slice(rowIndex * 4, rowIndex * 4 + 4).map(_.toInt)}")
??????}
????}

????def updateRequest(entry: Int)?= {
??????println(s"Update Entry:${entry}")
??????dut.io.lru_update_req.lru_update_entry #= entry
??????dut.io.lru_update_req.lru_state #= lruState
??????sleep(1)
??????lruState = dut.io.lru_update_result.toBigInt
??????//show 矩陣
??????showLruState()

??????dut.io.lru_state #= lruState
??????sleep(1)
??????val lruEntry = dut.io.lru_entry.toInt
??????println(s"The Lru Entry is $lruEntry")
??????sleep(1)
????}

????showLruState()
????dut.io.lru_state #= lruState
????sleep(1)
????val lruEntry = dut.io.lru_entry.toInt
????println(s"The Lru Entry is $lruEntry")
????sleep(1)
????for?(entry <- Array(0, 1, 2, 3, 2, 3, 0, 1, 2, 0, 3)) {
??????updateRequest(entry)
????}
??})
}

對于LRU矩陣實現,由于矩陣的存在導致其所需要的資源會隨著entry的增加而膨脹。實現一個四路組相連則需要16bit的空間用于存儲矩陣信息,8路就需要64bit信息了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真
    +關注

    關注

    51

    文章

    4239

    瀏覽量

    135306
  • 邏輯
    +關注

    關注

    2

    文章

    834

    瀏覽量

    29694
  • 矩陣
    +關注

    關注

    0

    文章

    434

    瀏覽量

    35019

原文標題:一文看懂LRU(Least Recently Used)實現

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    LRU緩存模塊最佳實踐

    LRULeast Recently Used)是一種緩存替換算法,它的核心思想是當緩存滿時,替換最近最少使用的數據。在實際應用中,LRU
    的頭像 發表于 09-30 16:47 ?1126次閱讀

    Redis的LRU實現和應用

    在編程中,計數器是一種基本但強大的工具,用于跟蹤和管理數據和資源。本文將深入探討不同類型的計數器的應用,從Redis的LRU(最近最少使用)緩存淘汰算法的實現,到如何在內存受限的環境中有效地使用計數器,再到普通計數器的巧妙應用。
    的頭像 發表于 12-15 09:24 ?813次閱讀

    【原創】Android開發—Lru核心數據結構實現突破緩存框架

    【原創】Android開發—Lru核心數據結構實現突破緩存框架回復即可獲取下載鏈接[hide=d15]鏈接:http://pan.baidu.com/s/1c2BfjsW 密碼:bta5 更多學習資料加Q:1352716312,學習交流群:150923287[/hide]
    發表于 06-21 16:58

    關于汽車網絡管理邏輯環的實現問題

    最近想做汽車網絡管理,但是資料比較少,想采用底層和模型結合的方法來實現,看論文說要建立一個關于節點的邏輯環,用來觀察節點之間的通信情況。不知道這個邏輯環具體要怎么
    發表于 04-27 15:18

    用作AND/OR邏輯的數字是什么意思

    喜我正在使用spartan6-150和ISE13.3。在地圖報告文件(.mrp)中,有一個關于“切片寄存器數量”部分中“用作AND / OR邏輯的數字”的項目。我想知道寄存器如何用
    發表于 10-23 10:14

    如何在LUT和邏輯元件之間以及邏輯元件和邏輯單元之間進行交換

    嗨,我目前正在對設計進行初步分析。我正在研究關于實現不同功能所需資源的不同FPGA。我找不到一種方法來將設計使用的LUT數量相關聯,并將其轉換為virtex和spartan范圍的邏輯單元格。如果可能
    發表于 01-08 10:18

    架構設計應用級緩存回收策略

    下。FIFO(First In First Out):先進先出算法,即先放入緩存的先被移除。LRULeast Recently Used):最近最少算法,使用時間距離現在最久的那個被
    發表于 01-14 17:08

    基于修正LRU的壓縮Cache替換策略

    以優化壓縮cache的替換策略為目標,提出一種優化的基于修正LRU的壓縮cache替換策略MLRU-C。MLRU-C策略能利用壓縮cache中額外的tag資源,形成影子tag機制來探測并修正LRU替換策略的錯誤
    發表于 04-15 09:51 ?36次下載

    CMOS級邏輯電路實現綜述

    由前面的基礎可知,CMOS只能實現基本邏輯的非,比如或邏輯,與邏輯,如果不加反相器,CMOS只能實現或非,與非
    的頭像 發表于 09-07 14:43 ?5976次閱讀
    CMOS級<b class='flag-5'>邏輯</b>電路<b class='flag-5'>實現</b>綜述

    谷歌在內存方面依賴于per memcg lru lock

    能力。 作為世間最流行的操作系統Linux, 內核使用LRU, Last Recent Used 鏈表來管理全部用戶使用的內存,用一組鏈表串聯起一個個的內存頁,并且使用lru lock來保護鏈表的完整性。 所有應用程序常用操作都
    的頭像 發表于 01-15 14:00 ?2055次閱讀
    谷歌在內存方面依賴于per memcg <b class='flag-5'>lru</b> lock

    在InnoDB如何選擇從LRU_list

    如果寫入redo 速度不變, 那么生成page 速度不變, 如果刷臟能力極其快, 那么理論上LRU_scan_depth 的深度設置成用戶每秒最大的page IO 生成能力即可, 那么系統最好的狀態
    的頭像 發表于 05-29 10:59 ?712次閱讀
    在InnoDB如何選擇從<b class='flag-5'>LRU</b>_list

    設計并實現一個滿足LRU約束的數據結構

    LRUCache(int capacity)` 以 **「正整數」** 作為容量 `capacity` 初始化 `LRU` 緩存
    的頭像 發表于 06-07 17:05 ?1252次閱讀
    設計并<b class='flag-5'>實現</b>一個滿足<b class='flag-5'>LRU</b>約束的數據結構

    在組相聯cache中,用于替換cache line的算法有哪些?

    LRU(Least Recently Used)算法:該算法會跟蹤每個cache line的age(年齡)情況,并在需要時替換掉近期最少使用的cache line。
    的頭像 發表于 10-08 11:10 ?1207次閱讀

    redis的淘汰策略

    的寫入。 Redis的淘汰策略主要有以下幾種: LRULeast Recently Used,最近最少使用): 這是Redis默認的淘汰策略。當內存空間不足時,Redis會選擇最近最
    的頭像 發表于 12-04 16:23 ?766次閱讀

    redis的lru原理

    Redis是一種基于內存的鍵值數據庫,它使用了LRULeast Recently Used)算法來進行緩存的數據淘汰。LRU算法的核心思想
    的頭像 發表于 12-05 09:56 ?824次閱讀