k路並行暫存器溢位 迴圈展開

2021-10-05 12:11:40 字數 1821 閱讀 6027

1.當三次迴圈展開+三個並行變數的時候

有三條關鍵路徑,每條路徑之間無資料相關,可以並行執行。看上去關鍵路徑上只有乙個add,整數的add延遲為1。但是我們可以仔細分析流水線上各個操作的發射時間和延遲時間,來確定每乙個操作開始的時間點。

如下表:

迴圈次數

add開始時間

mull開始時間

load1開始時間

load2開始時間

1mul+3=5

load2+1=2

0load1+1=1

25+1=6load2+1=4

2load1+1=3

37+1=8load2+1=6

4load1+1=5

分析:①0時刻開始第乙個操作load1,花費1個週期,load1結束後時刻1開始load2

③load2結束後時刻2開始mull,  mull延遲是3個週期,在時刻5結束。

④時刻5開始add,延遲1個週期,時刻6結束

⑤問題在這裡。下乙個add可以在前乙個add結束後的下一周起開始嗎?

答案是不可以:

mull發射時間是1,表明在每乙個週期都可以開始一次mull,上一次mull在時刻2開始,但是第二次的load1,load2在時刻4結束。所以mull只能等load結束才能開始:時刻4;

add只能在mull結束後開始,mull+3=7,因此在時刻7開始,因此平均每次add花費了2個週期

因此cpe=2.00

b.三路並行理想化的流水線是如上圖所示的:

可以看到函式中一些常用到的變數有:i,length,xdata,ydata,sum1,sum2,sum3共7個。

在ubuntu 32位gcc的o2級別編譯後,反彙編可以看到如下的**

所以有6個暫存器可以用來暫時存放運算資料。如果頻繁使用到的變數較多,會導致暫存器溢位到棧,程式的效率大大降低。變數i

xdata

ydata

sum1

sum2

sum3

length

中間結果

儲存位置

eaxecx

ebxebp

ediesi(esp)

edx四次迴圈展開的流水線圖:

函式中一些常用到的變數有:i,length,xdata,ydata,sum共5個。可以從彙編**中看出,所有常用的變數都儲存在了暫存器中。 變數

ixdata

ydata

sum中間結果1

中間2length

儲存位置

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...

CS 暫存器 和 IP 暫存器

下面將要介紹的是一組非常非常重要的暫存器,即 cs ip cs ip 兩個暫存器指示了 cpu 當前將要讀取的指令的位址,其中cs 為 段暫存器,而ip 為指令指標暫存器。什麼叫做指示了 cpu 當前將要讀取的指令呢?在 8086 cpu 中,為什麼 cpu 會自動的執行指令呢?這些指令肯定是存放在...