Qué es un BAR, y por qué las GPU se le quedaron pequeñas
Cada dispositivo PCIe expone uno o más Base Address Registers. Un BAR le dice al sistema cuánto espacio de direcciones quiere el dispositivo, y el firmware lo mapea en el mapa de memoria del host. Una vez mapeado, la CPU alcanza la memoria del dispositivo con cargas y almacenamientos corrientes.
El tamaño de un BAR solía estar fijado en el silicio. El firmware lo leía al arrancar y ahí terminaba la conversación.
Eso estaba bien mientras los BAR eran pequeños. Una tarjeta de red quiere unas pocas decenas de kilobytes para sus registros. Una controladora NVMe quiere de 16KB a 64KB.
Las tarjetas gráficas rompieron el arreglo. Una tarjeta moderna tiene 8, 12, 16 o 24GB de memoria de vídeo, y lo obvio es mapearla toda para que la CPU pueda escribir en cualquier parte de ella. Los BAR fijos no podían expresar eso, así que la convención pasó a ser una ventana pequeña — normalmente 256MB — que el driver reapunta sobre el framebuffer, copiando a través de ella a trozos. Funciona. Es solo una cantidad absurda de contabilidad para alcanzar una memoria que ya has comprado y montado.
Qué cambia el Resizable BAR
El Resizable BAR es una capacidad de PCIe que deja negociar el tamaño de un BAR en vez de fijarlo. El dispositivo anuncia los tamaños que puede soportar, y el firmware o el sistema operativo programa uno de ellos.
Para una GPU eso significa que todo el framebuffer se puede mapear de una vez.
El driver deja de paginar a través de una ventana y escribe donde quiere escribir.
El núcleo informa de la capacidad como Physical Resizable BAR, y es neutral respecto al fabricante. Una tarjeta AMD funciona con él en una plataforma Intel y viceversa.
Qué hacen de verdad los tres fabricantes
La parte interesante es que los fabricantes no se ponen de acuerdo en cuánto importa.
Intel Arc y Arc Pro — Intel lo llama obligatorio
Intel es el enfático. Su guía dice que el Resizable BAR es «required to get a good experience with Intel® Arc™ hardware» — necesario para tener una buena experiencia con el hardware Intel Arc. Ese es un lenguaje inusualmente fuerte para una función de plataforma, y muestra cómo está construido el driver de Arc más que una elección de marketing.
Del lado de los síntomas, Intel describe el efecto de apagarlo en términos de regularidad y no de medias: con «ReBAR off» «will generally result in spikes that were already there getting bigger» — los picos que ya estaban se hacen más grandes. Ese es un argumento de estabilidad de tiempos de fotograma, y es la misma forma de problema que el efecto de ASPM en las colas de latencia. La media lo esconde.
Intel lista los procesadores Intel Core de 10.ª generación y más nuevos, la mayoría de la serie Ryzen 3000 y todas las CPU Ryzen 5000 como plataformas soportadas, y lo trata como una función de la BIOS de la placa que tienes que ir a activar.
La consecuencia práctica para Arc y Arc Pro es simple. Si has puesto una tarjeta Arc en una máquina y el rendimiento es decepcionante o desigual, comprueba esto antes que ninguna otra cosa. Por eso, en esas tarjetas no es tanto un mando de ajuste como un prerrequisito.
NVIDIA — de Ampere en adelante, y solo donde ayuda
NVIDIA añadió soporte para las tarjetas y portátiles GeForce RTX serie 30 en marzo de 2021. Ponerlo a funcionar necesitaba una VBIOS soportada, una CPU y una placa compatibles, una actualización del firmware de la placa, y un driver actual. La RTX 3060 se entregó con él; la 3060 Ti, la 3070, la 3080 y la 3090 podían necesitar una actualización de firmware para tenerlo.
El planteamiento de rendimiento de la propia NVIDIA es refrescantemente poco glamuroso. Encontraron que «some titles benefit from a few percent, up to 12%» — algunos títulos ganan unos pocos por ciento, hasta un 12 % — mientras que «there are also titles that see a decrease in performance», así que también hay títulos cuyo rendimiento baja.
Su respuesta a eso es el detalle que vale la pena saber: en vez de dejarlo activado de forma global, NVIDIA prueba los títulos por adelantado y usa perfiles por juego para activar el Resizable BAR solo donde midió una ganancia. Así que en una tarjeta NVIDIA, «¿está ReBAR activado?» tiene una respuesta por aplicación, y un benchmark que no muestra nada puede ser simplemente un título que el driver decidió dejar en paz.
AMD — Smart Access Memory es lo mismo
La marca de AMD para ello es Smart Access Memory, introducida junto a la serie Radeon RX 6000 y las CPU Ryzen 5000. El marketing da a entender un emparejamiento de CPU-AMD-más-GPU-AMD, y así se lanzó, pero la capacidad de debajo es la estándar de PCIe. Activa el Resizable BAR en el firmware con una tarjeta Radeon en una máquina Intel y obtienes la misma función sin la marca.
Las tarjetas Radeon Pro serie W también lo soportan. En arquitecturas más antiguas — Vega y Polaris — el soporte es más irregular, y ahí es también donde viven los problemas de virtualización.
El Resizable BAR y el trabajo de IA
Aquí es donde la función se malinterpreta, así que vale la pena tener claro qué toca.
El Resizable BAR cambia cómo la CPU alcanza la memoria de la GPU. Ese es el camino de transferencia — preparar los pesos del modelo, empujar lotes, leer los resultados de vuelta. No toca el ancho de banda de la propia memoria de la GPU, y no hace más rápida una multiplicación de matrices.
Así que el resumen honesto es que afecta a la carga y la alimentación de un modelo, no a la aritmética. Para un modelo grande, la copia de host a dispositivo en el momento de la carga es un coste genuino, y un BAR de tamaño completo deja a la CPU escribir directo en la memoria del dispositivo en vez de transbordar a través de un ojo de buey de 256MB. Para el estado estacionario de una tirada de inferencia — donde los pesos ya están residentes y el trabajo está limitado por el cómputo. No esperes nada.
Tres detalles concretos vale la pena saberlos.
Arc Pro para IA hereda el veredicto de Intel. Si Intel dice que la tarjeta necesita Resizable BAR para una buena experiencia, eso se aplica a una tarjeta corriendo oneAPI o PyTorch igual que a una corriendo un juego. Las tarjetas Arc y Arc Pro que hacen inferencia deberían tenerlo activado, y punto.
En NVIDIA, el número que quieres es el BAR1. El BAR1 es la ventana visible por el host hacia la memoria del dispositivo, y es por lo que pasan las reservas mapeadas por el host y el GPUDirect RDMA:
# How much device memory is actually host-visible
nvidia-smi -q | grep -A3 "BAR1 Memory Usage"
Una tarjeta de centro de datos se construye con un BAR1 grande ya. En una tarjeta de escritorio, el Resizable BAR es lo que hace esa ventana grande en vez de diminuta. Si estás haciendo RDMA directo desde una NIC hacia la memoria de la GPU, esto no es un lujo.
No confundas esto con el requisito de ROCm. Los requisitos de sistema de ROCm de AMD piden CPU que soporten atómicas PCIe — «modern CPUs after the release of 1st generation AMD Zen CPU and Intel™ Haswell», las CPU modernas aparecidas tras el Zen de 1.ª generación de AMD y el Haswell de Intel — y no dicen nada sobre el dimensionamiento de los BAR. Esos son dos requisitos de plataforma distintos que viven ambos en el mismo menú de la BIOS, y la gente los confunde constantemente. Comprueba el que de verdad necesitas.
El modo de fallo que muerde más fuerte a las builds de IA no es el rendimiento en absoluto, y está cubierto más abajo: varias GPU de BAR grande en una máquina pueden agotar el espacio de direcciones.
Qué necesita para funcionar
Cuatro cosas, y todas son a nivel de firmware:
- Resizable BAR activado en el firmware de la placa. A menudo desactivado por defecto.
- Above 4G Decoding activado. Un BAR de 24GB no cabe por debajo de la línea de los 4GB, así que la plataforma tiene que estar dispuesta a asignar espacio de direcciones por encima de ella. Actívalo aunque no haya ninguna GPU presente. No cuesta nada.
- Arranque UEFI, con el CSM apagado. El modo de compatibilidad heredado y los BAR grandes no se mezclan.
- Firmware y drivers actuales, en particular en las placas y tarjetas de la transición 2020-2021, donde el soporte llegó por actualización y no en el lanzamiento.
Cómo comprobarlo en Linux
Si la tarjeta tiene la capacidad, y qué tamaños ofrece:
# Substitute your card's address from lspci
lspci -vvs 0000:XX:00.0 | grep -A6 "Physical Resizable BAR"
El núcleo también expone esto en sysfs, un fichero por cada BAR redimensionable:
cat /sys/bus/pci/devices/0000:XX:00.0/resource1_resize
Ese valor es un mapa de bits de los tamaños soportados, no un tamaño.
El bit 0 significa 1MB, el bit 1 significa 2MB, el bit 2 significa 4MB, y el tamaño para un bit dado es 2 ^ (bit + 20).
Así que 00000000000001c0 tiene los bits 6, 7 y 8 puestos, lo que significa que el BAR puede ser de 64MB, 128MB o 256MB.
Para ver qué está en vigor de verdad, lee las regiones asignadas:
lspci -vvs 0000:XX:00.0 | grep -i Region
Una tarjeta corriendo con su framebuffer completo mapeado muestra una región que coincide con el tamaño de su VRAM en vez de una de 256MB.
Redimensionar a mano
Puedes escribir tú mismo la posición del bit:
# bit 7 -> 2 ^ (7 + 20) = 128MB
echo 7 > /sys/bus/pci/devices/0000:XX:00.0/resource1_resize
Las condiciones adjuntas son estrictas, y vale la pena leerlas antes de probarlo en una máquina que te importe.
Cada driver debe desvincularse del dispositivo primero.
Los dispositivos pares bajo el mismo puente padre pueden necesitar una retirada blanda.
En un dispositivo VGA, escribir un valor de redimensión derriba los drivers de consola de bajo nivel.
Cualquier cosa que mantenga abiertos los ficheros sysfs resourceN tiene que soltarlos.
La documentación del núcleo también es rotunda sobre el resultado: el éxito no está garantizado. La redimensión falla si no hay espacio de direcciones donde colocar el BAR mayor. Lo que te lleva directo de vuelta al Above 4G Decoding.
Cuando sale mal
dmesg dice que no puede asignar el BAR.
Los mensajes con la forma BAR 0: no space for [mem size ...] significan que la asignación falló, no que la tarjeta esté defectuosa.
El Above 4G Decoding es lo primero que comprobar.
Varias GPU y una de ellas no inicializa. Este es el fallo de multi-GPU y de rig de IA. Cuatro tarjetas con BAR de 24GB necesitan 96GB de espacio MMIO de 64 bits asignados, más todo lo demás, y no el firmware de toda placa de consumo lo hará. El síntoma es que la máquina va bien con dos tarjetas y se cae con cuatro.
El rendimiento bajó. En NVIDIA eso puede ser la propia conclusión del driver, dado que lo activan por título justo porque algunas cargas empeoran. En las otras, mide de las dos formas en vez de suponer.
No cambió nada en absoluto. El resultado más probable para una carga que nunca estuvo limitada por la ventana de la CPU hacia la VRAM.
Pasar una GPU de BAR grande a una VM
Vale la pena señalarlo porque sorprende a la gente: un invitado no hereda el mapa de memoria del host. El firmware de la VM construye su propia apertura MMIO de 64 bits, y el valor por defecto de OVMF es mucho más pequeño de lo que una GPU moderna necesita, así que la tarjeta o no inicializa o recae en un BAR pequeño. Ese es un tema de Proxmox y QEMU más que de la GPU, y vive en el artículo del impuesto del IOMMU junto a los requisitos de tipo de máquina de Usa siempre Q35, no i440fx.
Referencias
- Intel — Resizable BAR e Intel Arc Graphics — la propia afirmación de Intel de que es necesario para una buena experiencia en Arc, y la lista de plataformas soportadas
- NVIDIA — soporte de Resizable BAR para la GeForce RTX serie 30 — los requisitos, el rango medido, y el enfoque de perfiles por juego
- AMD — Smart Access Memory — la marca de AMD y el emparejamiento de plataforma
- ABI sysfs-bus-pci del núcleo Linux —
resourceN_resize— el mapa de bits, el dimensionamiento2 ^ (bit + 20), y las condiciones de desvinculación - Requisitos de sistema de ROCm — el requisito de atómicas PCIe que se confunde con este