PCIe協議原始比特率和數據傳輸速度的區別
PCIe協議是一種端對端的互連協議,提供了高速傳輸帶寬的解決方案。目前PCIe已經發展到第四代PCIe4.0, 每一代的發展,最明顯的特征就是速率翻倍,如下表,從最初的2.5GT/s,到現在的PCIe 4.0的16GT/s.
數據傳輸速率定義
在PCIe總線中,事務傳輸類型有四種,Memory,IO,Configuration,Message,如下圖。
不過,PCIe係統針對傳輸速率的優化都主要集中提高Memory類型事務的傳輸速率,所以,我們在這裏提到的傳輸速率,主要是Memory data的傳輸速率。另外,鑒於PCIe 4.0相關產品問世還有一段時間,我們在這裏也先跳過PCIe 4.0。
PCIe Spec定義Gen1的最大傳輸速率是2.5Gb/s, Gen2的最大傳輸速率是5.0Gb/s, Gen3的最大傳輸速率是8.0Gb/s. 在這裏的最大傳輸速率指的是單lane單向的原始比特傳輸速率(Raw bit rate), 並不是PCIe係統中真正的數據傳輸速率。因為在PCIe係統存在一定的數據傳輸開銷和設計取舍。
數據傳輸開銷
任何數據在PCIe係統傳輸,都會產生一定的開銷。我們從以下五個方麵探究一下:
(1) 數據編碼: Gen1/2 8b/10b & Gen3 128b/130b
Gen1/Gen2采用8b/10b編碼,直觀的理解,就是把8bit數據轉換為10bit數據傳輸,目的就是維持"直流平衡(DC Balance)",讓1和0傳輸數目相等。因為高速串行傳輸過程中,如果有連續多位1或者0沒有變化,那麼,信號傳輸就會由於電壓位階的關係而發生錯誤。
Gen1/Gen2采用8b/10b編碼進行數據傳輸,就相當於多了20%傳輸開銷。同理,Gen3采用了128b/130b編碼傳輸,就等於多了2%的開銷。
(2) TLP數據包開銷
PCIe屬於封裝分層協議,數據報文在Device Core產生之後,在分別經過事務層(Transaction Layer)、數據鏈路層(Data Link Layer)、物理層(Physical Layer)之後會依次被增加ECRC,Sequence Number,LCRC,Start,END等數據塊。,
不過,需要注意的是,Gen1和Gen2有End標識符,Gen3則沒有End標識符。Gen2 TLP:
Gen3 TLP:
TLP header有兩種選擇12 bytes或者16bytes,主要與Memory Read/Write TLP中采用32位地址或者64位地址有關。
如果采用32位地址,那麼TLP Header的長度是12bytes:
如果采用64位地址,那麼TLP Header的長度是16bytes:
所以,在TLP傳輸過程中,就增加了20~30 Bytes的開銷。
(3) 流量開銷(Traffic Overhead)
在數據鏈路層(Data link layer)和物理層(Physical Layer)都會引入流量開銷(Traffic Overhead).
數據鏈路層在PCIe總線中的作用就是保證來自事務層TLPs的正確傳輸。為了實現這一目的,數據鏈路層又定義了DLLP(Data Link Layer Packets)。DLLP產生於數據鏈路層,終止於數據鏈路層。定義的DLLP數據類型主要有Ack, Nak, PM,FC等,如下圖。
在PCIe Link達到正常的工作狀態(L0)之後,如果兩個交互port口之間存在延時,那麼這個時候就需要物理層插入SKP Order sets來補償PCIe鏈路中的延時。對於Gen1/Gen2, SKP OS的大小為4 Bytes;對於Gen3, SKP OS的大小一般為16 Bytes. PCIe Spec規定,在TLP傳輸過程中,不允許插入Order Sets,SKP OS隻能在TLP傳輸間隙進行。
所以,Ack/Nak/PM/FC等DLLP和Order Sets都會影響到數據傳輸的速率。
(4) 協議開銷
PCIe Spec規定,發送端發送TLP之後,需要接受端回應Ack或者Nak, 以得知發送的TLP是否被成功接收。發送端需要將TLP保存在TLP retry buffer中,直到收到Ack成功接收的回應。如果不幸的收到了Nak未成功接收的回應,那也不怕,隻要將放在TLP retry buffer中的TLP再次發送,直到被正確接收。
如果發送每個TLP之後,都要求對應一個Ack回應,那麼,當發送多個TLP時,就需要對應多個Ack回應,這樣的話,會嚴重的增加PCIe鏈路中的數據傳輸開銷。為了減少這方便的開銷,PCIe允許發送多個TLP後,有一個Ack回應就可以。如下圖,發送5個TLP,收到一個Ack回應。
這樣做的好處可以降低開銷,但是不能消除開銷。
(5) 流量控製(Flow Control)機製的開銷
在PCIe鏈路中,我們不能一直發送TLP,而是需要接受端有足夠的接受空間之後,才能繼續發送TLP,這個過程就是PCIe協議中的流量控製(Flow Control)機製。
接收端會通過不斷地發送FC DLLP來告知發送端,此時接收端可用Buffer的大小。如果接收端的Buffer快滿時,發送端就會停止發送TLP,這樣做的目的就是防止Buffer空間不足而造成TLP被丟棄。
所以,接收端可用Buffer的大小很大程度上影響著數據傳輸速率。
係統參數對傳輸速率的影響
除了上麵提到的協議和流量開銷外,對傳輸速率也有一定影響的因素就是係統參數,比如MPS(Maximum Payload Size), MRRS(Maximum Read Request Szie), Request Type等。
(1) MPS(Maximum Payload Size)
PCIe協議對MPS支持的大小有6種: 128B,256B,512B,1024B,2048B,4096B.
PCIe係統中的最大負載MPS是在上電枚舉和配置階段定義的,以PCIe係統中最小MPS為準。比如,下圖,RC,Switch,Endpoint都有不同的MPS設置,那麼,就取最小MPS 128 Bytes為準。這個過程,類似水桶原理。
MPS的大小影響著數據傳輸的效率。數據傳輸效率計算公式:
我們假設TLP中的Header大小為12 Bytes, 同時沒有ECRC,這樣的話,TLP傳輸就有20bytes的額外開銷。那麼,不同MPS大小對應的傳輸效率計算結果如下:
從計算結果來看,隨著MPS的增加,傳輸效率在增加,但是增幅在變小,作個曲線表示如下:
(2) MRRS(Maximum Read Request Size)
PCIe協議中,MRRS代表著讀請求最大Size,對於MRRS選擇,同樣有6種:128B,256B,512B,1024B,2048B,4096B. 這個參數也是在Configuration階段,寫入到設備的control寄存器。
由於不寫任何數據,所以每次的讀請求都是一筆額外的開銷。如果我們設定MRRS為128B,我們讀64KB數據時,就需要發送512(64KB/128B=512)次讀請求,這樣的話,就增加了很多額外的開銷,對數據傳輸速率也是一種傷害。
寫入吞吐量(Write Throughput)計算方式
假設Write TLP的數量是200, MPS=128B,PCIe係統是Gen1 x8.
(1) 計算Symbol Time
我們知道是Gen1,傳輸速率是2.5Gb/s. 那麼,
Symbol Time(傳輸1byte的時間)=1B/2.5Gb/s=4ns.
因為是8 lane,那麼,每4ns可以發送8Byte數據。
(2) 計算TLP和DLLP傳輸時間
在MPS=128B,32bit地址的情況下,Memory Write TLP的傳輸時間就等於:
[(128B payload+ 20B overhead)/8B/Clock]*4ns/Clock=74 ns.
DLLP的傳輸時間就等於:
[8B / 8B/Clock] * [4ns/Clock] = 4 ns.
另外,我們在這裏假設,每傳輸5個TLPs, 對應一個Ack DLLP。每傳輸4個TLPs,有一個FC update DLLP.
(3) 計算傳輸帶寬
傳輸數據總量(Bytes)=200 posted writes × 128 bytes/posted write = 25,600 bytes.
傳輸時間=(200 × 74 ns) + (40 × 4 ns) + (50 × 4 ns) = 15,160 ns.
傳輸帶寬=[25,600 bytes / 15,160 ns] = 1.689 GB/s or 1,689 MB/s.
讀取吞吐量(Read Throughput)計算方式
假設讀取數據量=4096B, MRRS=256B,PCIe係統是Gen1 x8.
(1) 計算Symbol Time
我們知道是Gen1,傳輸速率是2.5Gb/s. 那麼,
Symbol Time(傳輸1byte的時間)=1B/2.5Gb/s=4ns.
因為是8 lane,那麼,每4ns可以發送8Byte數據。
(2) 計算TLP和DLLP傳輸時間
在32bit地址的情況下,MemoryRead TLP的傳輸時間就等於:
[20B overhead/8B/Clock]*4ns/Clock=10 ns.
DLLP的傳輸時間就等於:
[8B / 8B/Clock] * [4ns/Clock] = 4 ns.
假設RCB(Read Completion Boundary)=64 Bytes,所以,多數的Completion TLP都是64B大小。
[(64 bytes payload + 20 bytes overhead) / 8 bytes/clock] × [4 ns/clock] = 42 ns.
另外,我們在這裏假設,每傳輸5個TLPs, 對應一個Ack DLLP。每傳輸4個TLPs,有一個FC update DLLP. 從發送Read請求,到Completion產生的時間為300ns.
(3) 計算傳輸帶寬
傳輸數據總量(Bytes)=4096 bytes.
傳輸時間=(16 × 10 ns) + (16 × 300 ns) + (64 × 42 ns) + (16 × 4 ns) + (20 × 4 ns) = 7,792 ns.
傳輸帶寬=[4096 bytes / 7,792 ns] × [1 GB / 1s] = 0.523 GB/s or 523 MB/s.