系列文章 : [gem5] 從零開始的 gem5 學習筆記
檔案位置 : gem5/src/cpu/minor/buffers.hh
要注意這個 class Queue 並不是指 C++ std 的 queue,而是 gem5 minor CPU model 自己實作的一個 class。
std::deque<ElemType> queue;
這個 Queue 試用 std::deque 來實作的。
這種 queue 支援
unsigned int numReservedSlots
記錄我們目前 reserve 多少筆資料。
unsigned int capacity;
這個 class Queue 的最大容量。
void reserve()
預留一個空間。在這時候不會對 queue 做任何 push,而只是將 numReservedSlots + 1。
void freeReservation()
去除一個預留的空間。在這個時候不會對 queue 做任何 pop,而只是將 numReservedSlots - 1。
void clearReservedSpace()
把 numReservedSlots 歸零。
bool canReserve()
查看當前是否有可以 reserve 的空間。
unsigned int unreservedRemainingSpace() const
去除掉預留的空位,以及已經使用的元素 ( queue.size() ),還剩下多少空位。
unsigned int remainingSpace() const
僅去除已經使用的元素 ( queue.size() ),還剩下多少空位。
void push(ElemType &data)
真的把元素 push 進 queue,真的會對 queue 進行操作。
檔案位置 : gem5/src/cpu/minor/buffers.hh
InputBuffer 也是被用作一個 Queue,只不過 InputBuffer 大部分的時候只會有一個 element 在 Queue 裡面,而 InputBuffer 則是為了這種情況特別做優化。
mutable ElemType *elementPtr;
一個暫存的指標。
當 InputBuffer 是空的,且要 push 第一個元素,會先把元素暫存在這個指標,而不是真的去操作 queue,藉此增強效能。
void setTail(ElemType &new_element)
當 Queue 是空的,會把 new_element 的指標存在 elementPtr
當 Queue 裡面有東西,會直接把 new_element 推進 Queue
void pushTail() const
把暫存在 elementPtr 的指標 push 進 Queue
void pop()
假如 elementPtr 這個暫存指標有東西,則 pop 這個 elementPtr
假如沒有 elementPtr,則直接 pop Queue