Here's the technical breakdown of PCIe slot configurations:
PCIe Version | Lanes (x) | Pin Count | Length (mm) | Bandwidth (per direction) |
---|---|---|---|---|
PCIe 3.0 | x1 | 36 | 25 | ~1 GB/s |
x4 | 64 | 39 | ~4 GB/s | |
x8 | 98 | 56 | ~8 GB/s | |
x16 | 164 | 89 | ~16 GB/s |
When working with PCIe devices in code, you'll often need to query lane configuration:
// C example using libpci
struct pci_dev *dev = pci_get_device(0x10de, 0x13c2, NULL);
if (dev) {
uint16_t lnkcap;
pci_read_config_word(dev, 0x4c, &lnkcap);
int lanes = (lnkcap >> 4) & 0x3F;
printf("Device supports x%d link width\n", lanes);
}
Bandwidth directly affects data-intensive applications:
- x1: Suitable for network cards, sound cards
- x4: Common for NVMe SSDs, RAID controllers
- x8: Used by mid-range GPUs, FPGA boards
- x16: High-end graphics cards, AI accelerators
Note that smaller cards can physically fit into larger slots:
// Python example checking PCIe compatibility
import os
def check_pcie_compatibility():
with open('/sys/bus/pci/devices/0000:01:00.0/current_link_width') as f:
current_width = f.read().strip()
with open('/sys/bus/pci/devices/0000:01:00.0/max_link_width') as f:
max_width = f.read().strip()
return current_width == max_width
PCI Express (Peripheral Component Interconnect Express) slots come in different physical configurations denoted by "x" values (x1, x4, x8, x16). These represent both the number of data lanes and the physical slot size:
// Example C code to detect PCIe lane width #includeint get_pcie_lanes(struct pci_dev *dev) { u16 lnksta; pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &lnksta); return (lnksta & PCI_EXP_LNKSTA_NLW) >> 4; }
PCIe Version | x1 Bandwidth | x4 Bandwidth | x8 Bandwidth | x16 Bandwidth | Pin Count |
---|---|---|---|---|---|
1.0 (2003) | 250 MB/s | 1 GB/s | 2 GB/s | 4 GB/s | 36 pins (x1) |
2.0 (2007) | 500 MB/s | 2 GB/s | 4 GB/s | 8 GB/s | 36 pins (x1) |
3.0 (2010) | 984.6 MB/s | 3.938 GB/s | 7.877 GB/s | 15.754 GB/s | 36 pins (x1) |
4.0 (2017) | 1.969 GB/s | 7.877 GB/s | 15.754 GB/s | 31.508 GB/s | 36 pins (x1) |
The physical size increases with lane count:
- x1: 25mm length, 36 pins
- x4: 39mm length, 64 pins
- x8: 56mm length, 98 pins
- x16: 89mm length, 164 pins
When working with PCIe devices in code, you might need to check capabilities:
# Python example using lspci import subprocess def get_pcie_info(): cmd = "lspci -vv | grep -E 'LnkSta:|LnkCap:'" output = subprocess.check_output(cmd, shell=True) return output.decode() print(get_pcie_info())
Common use cases for different slot sizes:
- x1: Sound cards, USB expansion
- x4: RAID controllers, 10G NICs
- x8: NVMe expansion cards
- x16: GPUs, high-performance computing
Theoretical bandwidth can be calculated as:
// C++ bandwidth calculation example double calculate_pcie_bandwidth(int version, int lanes) { const double base_speeds[] = {0.250, 0.500, 0.985, 1.969}; // GB/s per lane return base_speeds[version - 1] * lanes; }