PCIe: Difference between revisions
(Added Knowledge Graph section) |
(Fix: remove --- horizontal lines (12 removed)) |
||
| Line 20: | Line 20: | ||
* 언제 사용하는가? — GPU, NVMe SSD, 네트워크 카드, 확장 카드 등 | * 언제 사용하는가? — GPU, NVMe SSD, 네트워크 카드, 확장 카드 등 | ||
== Purpose == | == Purpose == | ||
| Line 30: | Line 29: | ||
* Non-goals: PCIe 커널 드라이버 개발, FPGA PCIe IP 코어 설계는 별도 문서 | * Non-goals: PCIe 커널 드라이버 개발, FPGA PCIe IP 코어 설계는 별도 문서 | ||
== Key Concepts == | == Key Concepts == | ||
| Line 72: | Line 70: | ||
|} | |} | ||
== Architecture == | == Architecture == | ||
| Line 90: | Line 87: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Workflow == | == Workflow == | ||
| Line 116: | Line 112: | ||
|} | |} | ||
== Detailed Explanation == | == Detailed Explanation == | ||
| Line 373: | Line 368: | ||
* http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 | * http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 | ||
== Configuration == | == Configuration == | ||
| Line 391: | Line 385: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Examples == | == Examples == | ||
| Line 440: | Line 433: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Best Practices == | == Best Practices == | ||
| Line 452: | Line 444: | ||
* TC(Traffic Class)를 활용한 QoS 설정 | * TC(Traffic Class)를 활용한 QoS 설정 | ||
== Limitations == | == Limitations == | ||
| Line 462: | Line 453: | ||
* 스위치 추가: 각 hop마다 흐름 제어 오버헤드 | * 스위치 추가: 각 hop마다 흐름 제어 오버헤드 | ||
== References == | == References == | ||
| Line 470: | Line 460: | ||
* http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 | * http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 | ||
== Related Pages == | == Related Pages == | ||
| Line 480: | Line 469: | ||
* [[DMA]] | * [[DMA]] | ||
[[Category:Hardware]] | [[Category:Hardware]] | ||
Revision as of 11:30, 17 July 2026
PCIe
Overview
PCIe(Peripheral Component Interconnect Express)는 패킷 기반的高速 직렬 확장 버스 표준입니다. 기존 PCI/PCI-X의 병렬 버스 아키텍처를 개선하여, 스위치 기반의 전용 연결로 각 카드가 독립적인 세트를의 와이어로 연결됩니다.
Summary
- 무엇인가? — 패킷 기반的高速 직렬 확장 버스 표준 (PCIe)
- 왜 필요한가? — 높은 대역폭, 낮은 지연, 확장성, 후방 호환성
- 언제 사용하는가? — GPU, NVMe SSD, 네트워크 카드, 확장 카드 등
Purpose
이 문서가 존재하는 이유
- Goal: PCIe 아키텍처, 대역폭, 전원, 프로토콜 계층, 흐름 제어 등 핵심 개념 제공
- Scope: PCIe 세대별 대역폭, 전원 공급, TLP/DLLP 계층, 흐름 제어, 가상 채널, 라우팅
- Non-goals: PCIe 커널 드라이버 개발, FPGA PCIe IP 코어 설계는 별도 문서
Key Concepts
| Concept | Description | Related |
|---|---|---|
| Lane | PCIe 기본 전송 채널 (2쌍 데이터 + 1쌍 클록) | PCIe |
| TLP | Transaction Layer Packet — 상위 계층 패킷 | PCIe |
| DLLP | Data Link Layer Packet — 신뢰성 제어 패킷 | PCIe |
| Root Complex | PCIe 호스트 브리지 (CPU 내 또는 별도 칩셋) | PCIe |
| Flow Control | 수신 버퍼 여유 확인 후 전송 제어 | PCIe |
| Virtual Channel | TC(Traffic Class) 기반 독립 흐름 제어 | PCIe |
| MSI | Message Signaled Interrupts — 메모리 기반 인터럽트 | PCIe |
| DMA | Direct Memory Access — 버스 마스터링 | PCIe |
Architecture
PCIe는 3계층 아키텍처로 구성됩니다:
graph TD
A[PCIe Stack] --> B[Transaction Layer]
A --> C[Data Link Layer]
A --> D[Physical Layer]
B --> E[TLP - Transaction Layer Packet]
C --> F[DLLP - Data Link Layer Packet]
D --> G[Lane - Differential Pairs]
B --> H[Root Complex / Switch]
H --> I[Peripheral Device]
Workflow
| Stage | Input | Output |
|---|---|---|
| Write (Posted) | Memory Write TLP | Fire-and-forget 전송 |
| Read (Non-Posted) | Read Request TLP → Completion TLP | 데이터 수신 |
| Flow Control | Flow Control DLLP | 전송 크레딧 관리 |
| Interrupt | MSI TLP (Posted Write) | 인터럽트 발생 |
Detailed Explanation
PCIe 아키텍처
PCIe는 패킷 네트워크처럼 동작하는 직렬 버스입니다. 각 카드는 스위치 패브릭에 전용 연결로 연결되며, MAC 주소 대신 물리적 위치(버스/디바이스/함수)로 주소 지정됩니다.
최소 1x 연결은 4개의 와이어로 구성됩니다:
- 2쌍: 각 방향 데이터 전송용
- 1쌍: 참조 클록 공급용
PCIe 대역폭
| Generation | Release Year | Data Rate | BW x1 Lane | BW x4 Lane | BW x8 Lane | BW x16 Lane |
|---|---|---|---|---|---|---|
| PCIe 1.0 | 2003 | 2.5 GT/s | 250 MB/s | 1 GB/s | 2 GB/s | 4 GB/s |
| PCIe 2.0 | 2007 | 5.0 GT/s | 500 MB/s | 2 GB/s | 4 GB/s | 8 GB/s |
| PCIe 3.0 | 2010 | 8.0 GT/s | 1 GB/s | 4 GB/s | 8 GB/s | 16 GB/s |
| PCIe 4.0 | 2017 | 16 GT/s | 2 GB/s | 8 GB/s | 16 GB/s | 32 GB/s |
| PCIe 5.0 | 2019 | 32 GT/s | 4 GB/s | 16 GB/s | 32 GB/s | 64 GB/s |
| PCIe 6.0 | 2022 | 64 GT/s | 8 GB/s | 32 GB/s | 64 GB/s | 128 GB/s |
| PCIe 7.0 | 2025 (예정) | 128 GT/s | 15 GB/s | 60 GB/s | 121 GB/s | 242 GB/s |
예시: GPU가 16 PCIe 레인 사용 시
- PCIe 4.0: 16 × 16 GT/s = 256 GT/s
- PCIe 5.0: 16 × 32 GT/s = 512 GT/s
※ PCIe 3.0/4.0 인코딩 오버헤드 약 1.54%
PCIe 전원
| 카드 타입 | +3.3V | +12V | 총합 |
|---|---|---|---|
| 모든 PCIe 카드 | 최대 3A (9.9W) | — | — |
| x1 카드 | — | 최대 0.5A (6W) | 10W 합계 |
| x4 이상 카드 | — | 최대 2.1A (25W) | 25W 합계 |
| full-size x16 (그래픽) | — | 최대 5.5A (66W) | 75W 합계 |
| 6-pin 추가 커넥터 | — | +75W | 최대 150W |
| 8-pin 추가 커넥터 | — | +150W | 최대 300W (2×75W + 1×150W) |
| 1×75W + 2×150W | — | — | 최대 375W |
단순 버스 트랜잭션
PCIe Write (Posted)
1. Root Complex가 Memory Write TLP 생성 (헤더 3-4 DW + 데이터 1 DW) 2. TLP를 PCIe 포트에 전송 3. 대상 peripheral이 라우팅, 디코딩, 실행 4. Fire-and-forget — 응답 불필요
PCIe Read (Non-Posted)
1. CPU가 peripheral에 Read Request TLP 전송 2. peripheral이 Completion TLP로 데이터 응답 3. CPU는 Completion 수신까지 대기
PCIe 통신 계층
| 계층 | 역할 | 패킷 |
|---|---|---|
| Transaction Layer | TX/RX 패킷 정의 | TLP (Transaction Layer Packet) |
| Data Link Layer | TLP 무결성 보장, 재전송, 흐름 제어 | DLLP (Data Link Layer Packet) |
| Physical Layer | 실제 신호 전송 (와이어, 클록) | Lane (차분 쌍) |
- DLLP 타입:**
- Ack DLLP — 성공적 TLP 수신 확인
- Nack DLLP — 손상된 TLP 재전송 요청
- Flow Control DLLP — 크레딧 공지 (InitFC1, InitFC2, UpdateFC)
- Power Management DLLP
- TLP 크기:** 최대 128, 256, 또는 512 바이트
흐름 제어 (Flow Control)
Data Link Layer의 흐름 제어는 TLP가 link partner의 수신 버퍼 여유 확인 후 전송되도록 합니다.
- 중요:** flow control은 최종 destination이 아닌 link partner에 대해 작동합니다. Switch를 경유할 경우 각 hop마다 독립적인 흐름 제어가 적용됩니다.
- 6개 독립 계정:**
1. Posted Requests TLP headers 2. Posted Requests TLP data 3. Non-Posted Requests TLP headers 4. Non-Posted Requests TLP data 5. Completion TLP headers 6. Completion TLP data
가상 채널 (Virtual Channels)
TC(Traffic Class)는 TLP에서 가상 채널을 식별하는 데 사용됩니다. 각 가상 채널은 독립적인 흐름 제어 크레딧과 카운터를 가집니다. TC 0 외의 값을 선택하면 다른 채널의 트래픽이 차단되지 않습니다.
식별 및 라우팅
PCIe 스위치는 각 TLP를 어디로 보낼지 알아야 합니다. 3가지 라우팅 방법:
1. **주소 라우팅** — Memory/I/O Read/Write 요청 2. **암시적 라우팅** — Root Complex 브로드캐스트 및 응답 메시지 3. **ID 라우팅** — 나머지 모든 TLP (Bus:Device:Function 16-bit triplet)
Posted vs Non-Posted 연산
| 타입 | 연산 | 특징 |
|---|---|---|
| Posted (Write) | Memory Write | Fire-and-forget — 전송 후 대기 불필요 |
| Non-Posted (Read) | Memory Read | Requester가 Completion 수신까지 대기, CPU 버스 홀드 가능 |
Non-Posted Read는 버스 지연을 유발할 수 있으므로 최신 시스템에서는 최소화됩니다.
32 vs 64 비트 주소
- 32비트 주소: 헤더 3 DW
- 64비트 주소: 헤더 4 DW
PCIe spec: 4GB 미만 주소는 32비트 형식 사용 필수. 4GB 초과 주소(예: DMA 버퍼)는 64비트 형식 필요.
I/O 요청
PCIe는 후방 호환성을 위해 I/O 연산을 지원하지만 새 설계에서는 사용을 권장하지 않습니다. I/O Read/Write 모두 Non-Posted이므로 Write에서도 Completion 대기 필요. 또한 32비트 주소만 지원.
인터럽트
| 타입 | 설명 | 특징 |
|---|---|---|
| INTx | 레거시 레벨 트리거 인터럽트 | 공유 가능, 각 핸들러가 본인 확인 필요 |
| MSI | 메모리 기반 메시지 인터럽트 | Posted Write TLP, OS가 직접 핸들러 호출, 클리어 불필요 |
MSI는 PCI 2.2에서 도입되었으며, 현대 OS(리눅스 포함)에서 널리 사용됩니다.
버스 마스터링 (DMA)
PCIe에서 모든 디바이스는 Root Complex처럼 Read/Write TLP를 전송할 수 있습니다. 이를 통해 peripheral이 CPU 메모리에 직접 접근(DMA)하거나 peer peripheral과 TLP를 교환할 수 있습니다.
- DMA 설정:**
1. 표준 구성 레지스터에서 "Bus Master Enable" 비트 설정 2. 드라이버가 BAR 매핑 레지스터에 버퍼 물리 주소 쓰기
Reference
- http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1
- http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2
Configuration
# PCIe 디바이스 확인
lspci
lspci -v
lspci -vvv
# PCIe 레인 속도 확인
lspci -vvv | grep -i width
lspci -vvv | grep -i speed
# PCIe 링크 상태
lspci -vvv | grep -i LnkSta
Examples
Example 1: GPU 대역폭 계산
| GPU Lanes | PCIe 3.0 | PCIe 4.0 | PCIe 5.0 |
|---|---|---|---|
| x1 | 1 GB/s | 2 GB/s | 4 GB/s |
| x4 | 4 GB/s | 8 GB/s | 16 GB/s |
| x8 | 8 GB/s | 16 GB/s | 32 GB/s |
| x16 | 16 GB/s | 32 GB/s | 64 GB/s |
Example 2: PCIe 디바이스 정보 확인
# 모든 PCIe 디바이스 목록
$ lspci
# 상세 정보
$ lspci -v
# 매우 상세 정보 (링크 속도, 레인 수 등)
$ lspci -vvv
# 특정 디바이스 정보
$ lspci -s 01:00.0 -v
Best Practices
- PCIe 4.0 이상 사용 권장 (대역폭 효율성)
- GPU는 x16 레인 사용 (최대 대역폭)
- NVMe SSD는 x4 레인 이상 사용
- DMA 버퍼는 64비트 주소 지원 확인
- MSI 인터럽트 사용 (INTx 대신)
- 흐름 제어 크레딧 모니터링
- TC(Traffic Class)를 활용한 QoS 설정
Limitations
- PCIe 1.0/2.0: 대역폭 제한 (구형 시스템)
- INTx: 인터럽트 공유 문제
- I/O TLP: Non-Posted로 인한 지연
- 32비트 주소: 4GB 초과 주소 사용 불가
- 스위치 추가: 각 hop마다 흐름 제어 오버헤드
References
- https://en.wikipedia.org/wiki/Peripheral_Component_Interconnect
- http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1
- http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2
Related Pages
Knowledge Graph
Related
→ ACS → Bifurcation → CPU features → Dual vs Single PCIe Root Configuration → AER (Advanced Error Reporting) → ASPM → PCIe 5.0