ATI antes de AMD: La otra escuela de ingeniería gráfica

¿Te fue útil?

Si alguna vez te has quedado mirando una notificación de “el controlador de pantalla dejó de responder” mientras tu cola de render pierde el SLA, ya conoces la verdad: las GPU no fallan de forma educada. Fallan como un portero de discoteca: de repente, y sin interés en tu explicación.

ATI antes de AMD es un caso de estudio útil porque representa toda una cultura de ingeniería: iteración rápida, apuestas agresivas por funcionalidades y una pila de controladores que a menudo parecía un tratado de paz negociado entre el silicio y el sistema operativo. Esto no es nostalgia. Es arqueología operativa: qué se rompía, por qué se rompía y qué deberías comprobar primero cuando una canalización gráfica se convierte en tu nuevo incidente de producción.

Dos escuelas de ingeniería gráfica (y por qué a operaciones le debería importar)

ATI antes de AMD se sitúa en ese incómodo y poco documentado punto intermedio: no lo bastante “vintage” para que los coleccionistas escriban con cariño sobre cada stepping, ni lo bastante “moderno” para beneficiarse de la observabilidad y los ecosistemas de controladores abiertos de hoy. Aun así, las decisiones arquitectónicas de esa época siguen resonando en los sistemas actuales: supuestos sobre la planificación de shaders, decisiones de empaquetado de controladores, responsabilidades de firmware y la misma idea de que una GPU no es un dispositivo: es un pequeño ordenador con un contrato social frágil con tu SO.

Cuando la gente discute “ATI vs NVIDIA” en ese periodo, suele hacerlo como jugadores: FPS, calidad de imagen, una versión de controlador que arruinó el fin de semana de alguien. La gente de operaciones debería discutir de forma distinta. Deberíamos preguntar:

  • ¿Cómo trató cada proveedor la compatibilidad: estricto o permisivo?
  • ¿Dónde recayó el trabajo: en hardware, microcódigo o en controladores?
  • ¿Cómo falló la pila: bloqueo, reinicio, artefactos o corrupción silenciosa?
  • ¿Qué tan observable fue: contadores, logs, códigos de error, reproducibilidad?

La “otra escuela” de ATI era a menudo una mezcla de hardware ambicioso y una pila de controladores que tenía que suavizarlo todo a través de demasiadas versiones de OS, revisiones de API y raros comportamientos de placas base. Eso creó un perfil de fiabilidad específico: impresionante cuando todo encajaba, caótico cuando algo se desconfiguraba mínimamente.

Seco pero cierto: si ejecutas visualización en producción, CAD, VDI o cómputo acelerado por GPU en flotas mixtas, no necesitas lealtad a una marca. Necesitas alfabetización sobre modos de fallo.

Un chiste, porque lo merecemos: los controladores de GPU son como los pronósticos del tiempo—lo bastante precisos para planear, pero nunca apuestes tu lanzamiento por ellos.

Hechos históricos concretos que realmente puedes usar

A continuación, hechos y puntos de contexto cortos y operativos sobre ATI antes de AMD. No hay tour de museo, solo las piezas que explican el comportamiento en el mundo real.

  1. La línea Rage de ATI precedió a Radeon, y el impulso inicial de Radeon se debió en parte a limpiar la percepción de “ahora sí hacemos 3D, lo prometemos” de los aceleradores de finales de los 90.
  2. ATI adquirió ArtX (2000), un equipo con profunda experiencia en gráficos de consola (notablemente ligado al GPU del GameCube de Nintendo). Esa influencia se vio luego en la confianza arquitectónica y en las hojas de ruta de funcionalidades.
  3. Radeon 9700 Pro (R300, 2002) fue un punto de inflexión: un diseño de clase DX9 que forzó al mercado hacia adelante y, importante para operaciones, aumentó la complejidad del controlador al ritmo de la sombreado programable.
  4. Catalyst se convirtió en la marca unificada de controladores a principios de los 2000. El empaquetado unificado suena aburrido hasta que has intentado reproducir un bug en tres imágenes de OS y cinco forks “aleatorios” de drivers OEM.
  5. ATI aprovechó intensamente la transición AGP→PCIe. Los chips puente y las interacciones con el chipset importaban; “es la misma GPU” a menudo era una mentira a nivel de sistema.
  6. La era X1000 (mediados de los 2000) se inclinó hacia Shader Model 3.0 y planificación compleja. Genial cuando funcionaba; más difícil de depurar cuando el controlador adivinaba mal.
  7. La historia de ATI en Linux fue históricamente más áspera que en Windows durante mucho tiempo, con controladores propietarios que se comportaban como un universo separado de la evolución DRM del kernel.
  8. ATI fue adquirida por AMD en 2006. Los años previos reflejan las propias prioridades de ATI: tiempo hasta la funcionalidad y cobertura amplia del consumidor, a veces en detrimento de fronteras claras de abstracción.

No son trivia. Explican por qué todavía ves ciertas clases de problemas en Radeons heredadas: mal comportamiento del aperture de AGP, casos límite frágiles del ICD de OpenGL y desajustes de empaquetado de controladores que parecen deriva de configuración—porque son deriva de configuración, solo que con una GPU.

Qué construyó ATI antes de AMD: decisiones de diseño que aparecen en fallos

La programabilidad cambió el perfil de incidentes

Las canalizaciones de función fija fallaban de manera relativamente predecible. Obtendrías mezclas incorrectas, texturas perdidas, z-fighting o caídas duras con un conjunto estrecho de desencadenantes. Una vez que la canalización se volvió programable—vertex shaders, pixel shaders y, eventualmente, planificación más flexible—la superficie de fallo se expandió drásticamente:

  • Los compiladores del controlador (compilación y optimización de shaders) pasaron a ser parte de tu runtime.
  • El comportamiento indefinido y el código de shader en el límite dejaron de ser “solo más lento” y empezaron a ser “a veces corrupto”.
  • La reserva térmica y de potencia importó más porque el hardware podía ser empujado a mezclas de instrucciones más complejas.

La era pre-AMD de ATI vivió justo en esa transición. Algunos diseños estaban adelantados a su tiempo. Otros simplemente estaban por delante de sus controladores.

AGP y el mito de “solo un bus”

Los sistemas AGP eran una trampa de fiabilidad disfrazada de mejora de rendimiento. La GPU podía DMA texturas desde la memoria del sistema, y el chipset y la BIOS del sistema tenían opiniones sobre cómo debía funcionar eso. Si estás diagnosticando una workstation heredada o un sistema industrial que ejecuta un Radeon antiguo, no trates la configuración del bus como una nota al pie. Es un sospechoso principal.

Puentes, variantes y el impuesto operacional de las SKUs

ATI tuvo que enviar al mercado una cantidad absurda de SKUs: diferentes tamaños de memoria, tipos de memoria, diseños de placa y interfaces de bus. El puenteo de AGP a PCIe (y limpiarlo después) creó situaciones donde dos placas del “mismo modelo” se comportaban diferente bajo estrés. Desde la perspectiva SRE, esto es el clásico problema de “mascotas fingiendo ser ganado”: haces una imagen de máquina y asumes homogeneidad; la placa GPU dice lo contrario.

Calidad de imagen vs predictibilidad

ATI históricamente se preocupó mucho por la calidad de imagen y la completitud de funcionalidades. Eso no es marketing; afecta prioridades de ingeniería. Puede significar rutas de filtrado más complejas, más caminos de código en el controlador y comportamiento condicional según perfiles de aplicación. Eso no es automáticamente malo—pero incrementa la varianza, y la varianza es lo que convierte una regresión de rendimiento en un incidente.

Aquí está la moraleja operativa: cuanto más “inteligente” sea tu controlador, más debes tratarlo como un componente dinámico digno de control de cambios, fijado por versión y con planes de reversión.

La historia de los controladores: Catalyst, ICDs y el coste de la compatibilidad

Catalyst como un objeto de operaciones, no una simple descarga

Catalyst no era solo un controlador. Era un paquete: piezas en modo kernel, capas en modo usuario, paneles de control y heurísticas específicas por aplicación. ATI pre-AMD tuvo que soportar un ecosistema de Windows caótico (diferentes versiones de DirectX, service packs, personalizaciones OEM) y un ecosistema Linux que aún estaba resolviendo responsabilidades DRM/KMS.

En términos de producción, Catalyst estaba más cerca de un “lanzamiento de plataforma” que de un “controlador de dispositivo”. Trátalo así. Cuando lo actualizas, estás actualizando un compilador, un scheduler y un motor de políticas que decide cómo mapear llamadas de API al hardware.

ICDs de OpenGL y “funciona en mi máquina”

En Windows, OpenGL a menudo corre a través de un Installable Client Driver (ICD). Si nunca has depurado un desajuste de ICD de OpenGL, imagina enlazado dinámico más ajustes del registro más fallback específicos de la app, y luego añade un panel de control del proveedor que puede anular valores por defecto. Cuando falla, puede retroceder a la implementación de software de Microsoft o algún shim de compatibilidad—lo que significa que tu GPU está “bien” mientras el rendimiento se colapsa.

Lección operativa: verifica que la aplicación esté realmente usando la ruta GPU prevista. No supongas que porque el Administrador de dispositivos se ve bien, todo está bien.

Timeouts, reinicios y el SO protegiéndose

Windows moderno tiene Timeout Detection and Recovery (TDR). En la era pre-AMD de ATI, el ecosistema aún convergía hacia un comportamiento robusto de recuperación. Un trabajo de GPU de larga duración podía congelar la UI y tomar la caja entera como rehén. Incluso hoy, puedes ver la línea histórica: el SO reiniciará el controlador para mantener el sistema interactivo, lo cual es genial para escritorios y horrible para cómputo sin cabeza o renders largos si no lo configuras.

La fiabilidad a menudo es el arte de prevenir que los mecanismos de seguridad “útiles” destruyan tu carga de trabajo mientras aún preservas la contención de fallos. Eso no es filosófico; es una clave del registro y una decisión de política.

Una cita, porque sigue siendo el mejor encuadre para este trabajo: La esperanza no es una estrategia. —General Gordon R. Sullivan

Tareas prácticas: comandos, salidas y decisiones (12+)

A continuación están las tareas reales que ejecutaría al diagnosticar problemas con GPUs ATI/Radeon en sistemas Linux (y algunas comprobaciones útiles del host). Cada una incluye el comando, salida de ejemplo, lo que significa y la decisión que tomas a partir de ello.

1) Identificar la GPU y qué controlador está vinculado

cr0x@server:~$ lspci -nnk | sed -n '/VGA compatible controller/,+4p'
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 [Radeon HD 4870] [1002:9440]
	Subsystem: Sapphire Technology Limited Device [174b:e610]
	Kernel driver in use: radeon
	Kernel modules: radeon, amdgpu

Significado de la salida: Tienes una GPU ATI (ID de proveedor 1002). El kernel está usando actualmente el controlador radeon, pero amdgpu también está disponible como módulo.

Decisión: Si este es hardware heredado que es estable con radeon, fíjalo. Si persigues fallos y la GPU está soportada por amdgpu, considera pruebas controladas con amdgpu (pero hazlo con un plan de reversión).

2) Confirmar anchura y velocidad del enlace PCIe (un cuello de botella oculto clásico)

cr0x@server:~$ sudo lspci -s 01:00.0 -vv | egrep -i 'LnkCap|LnkSta'
LnkCap: Port #0, Speed 5GT/s, Width x16, ASPM L0s L1
LnkSta: Speed 2.5GT/s (downgraded), Width x4 (downgraded)

Significado de la salida: La tarjeta puede hacer PCIe Gen2 x16, pero actualmente está funcionando a Gen1 x4. Eso no es “un poco más lento.” Eso es un incidente auto-infligido.

Decisión: Revisa la configuración de la BIOS, el asiento, los risers, la bifurcación de lanes y la elección de la ranura de la placa base. Si es una flota, audita todos los nodos por degradaciones de enlace.

3) Revisar logs del kernel por reinicios/congelamientos de GPU

cr0x@server:~$ sudo dmesg -T | egrep -i 'radeon|amdgpu|gpu reset|ring|timeout' | tail -n 20
[Mon Jan 13 09:41:22 2026] radeon 0000:01:00.0: GPU lockup (current fence id 0x00000000000a3f1b last fence id 0x00000000000a3f1c on ring 0)
[Mon Jan 13 09:41:22 2026] radeon 0000:01:00.0: ring 0 stalled for more than 10240msec
[Mon Jan 13 09:41:22 2026] radeon 0000:01:00.0: GPU softreset: 0x00000000
[Mon Jan 13 09:41:23 2026] radeon 0000:01:00.0: GPU reset succeeded, trying to resume

Significado de la salida: Tienes un bloqueo real de GPU y recuperación. Esto no es un bug de la aplicación hasta que se demuestre lo contrario; podría ser potencia, térmicos, VRAM o una ruta de controlador/firmware.

Decisión: Correlaciona con el timing de la carga de trabajo; revisa térmicos; reduce clocks si hay overclock; prueba una versión de controlador conocida buena; considera intercambio de hardware si los reinicios persisten.

4) Verificar qué controlador DRM se cargó y con qué parámetros

cr0x@server:~$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.5.0 root=UUID=... ro quiet splash radeon.modeset=1

Significado de la salida: Los parámetros de arranque del kernel incluyen una directiva radeon.modeset.

Decisión: Si mezclas GPUs heredadas y kernels modernos, establece explícitamente el controlador y el comportamiento de modeset en lugar de confiar en la autodetección.

5) Confirmar dispositivos DRM y permisos (trampa común en headless/VDI)

cr0x@server:~$ ls -l /dev/dri
total 0
drwxr-xr-x 2 root root         80 Jan 13 09:40 by-path
crw-rw---- 1 root video  226,   0 Jan 13 09:40 card0
crw-rw---- 1 root render 226, 128 Jan 13 09:40 renderD128

Significado de la salida: Los nodos de dispositivo existen; el nodo render pertenece al grupo render. Tu usuario de servicio podría no estar en render o video.

Decisión: Añade la cuenta de servicio al grupo correcto o configura reglas de udev. Si “arreglas” esto con chmod 666, estás creando un incidente de seguridad para resolver un incidente de rendimiento.

6) Ver si Mesa está usando aceleración por hardware

cr0x@server:~$ glxinfo -B | egrep 'OpenGL vendor|OpenGL renderer|OpenGL version'
OpenGL vendor string: Mesa
OpenGL renderer string: AMD RV770 (DRM 2.50.0 / 6.5.0, LLVM 15.0.7)
OpenGL version string: 3.3 (Core Profile) Mesa 23.2.1

Significado de la salida: Mesa está impulsando la GPU vía DRM; no estás cayendo al renderizado por software llvmpipe.

Decisión: Si ves llvmpipe o softpipe, deja de optimizar la aplicación. Arregla la selección del controlador y la pila GL primero.

7) Detectar renderizado por software inmediatamente (comprobación rápida)

cr0x@server:~$ glxinfo -B | grep -i renderer
OpenGL renderer string: llvmpipe (LLVM 15.0.7, 256 bits)

Significado de la salida: Estás renderizando en CPU. Tu “problema de rendimiento de GPU” es en realidad un problema de “GPU no en uso”.

Decisión: Revisa la configuración de Xorg, controladores Mesa, passthrough de contenedores o firmware faltante. No hagas benchmarks hasta que esto esté arreglado.

8) Comprobar visibilidad Vulkan (cuando aplique)

cr0x@server:~$ vulkaninfo --summary | sed -n '1,25p'
Vulkan Instance Version: 1.3.268

Devices:
========
GPU0:
	apiVersion         = 1.2.170
	driverVersion      = 0.0.1
	vendorID           = 0x1002
	deviceName         = AMD RADV RV770
	deviceType         = DISCRETE_GPU

Significado de la salida: Vulkan detecta el dispositivo y la pila RADV está presente (si es soportada para esa clase de GPU).

Decisión: Si faltan dispositivos Vulkan pero OpenGL funciona, puede que falten paquetes ICD de Vulkan o que el hardware simplemente no sea compatible. Elige la API en consecuencia.

9) Revisar el log de Xorg por retrocesos de controlador y desajustes de ABI

cr0x@server:~$ egrep -i 'radeon|amdgpu|failed|fallback|ABI|glamor' /var/log/Xorg.0.log | tail -n 20
[     9.231] (II) Loading /usr/lib/xorg/modules/drivers/radeon_drv.so
[     9.245] (II) RADEON(0): glamor X acceleration enabled on RV770
[     9.246] (WW) RADEON(0): Option "AccelMethod" is not used
[     9.312] (EE) AIGLX: reverting to software rendering

Significado de la salida: Se cargó el DDX, glamor está activado, pero AIGLX retrocedió al renderizado por software. Eso es una configuración medio acelerada—a menudo peor que estar completamente acelerado o completamente en software.

Decisión: Corrige la ruta GL/AIGLX (Mesa, permisos, coincidencia de libGL). No aceptes “arranca” como éxito.

10) Medir saturación de CPU vs espera de GPU (división rápida a alto nivel)

cr0x@server:~$ mpstat -P ALL 1 5
Linux 6.5.0 (server) 	01/13/2026 	_x86_64_	(32 CPU)

09:52:18 AM  CPU   %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
09:52:19 AM  all   22.41  0.00  6.13    0.12 0.00  0.51   0.00   0.00   0.00  70.83

Significado de la salida: La CPU no está saturada. Si los frames son lentos, es posible que estés limitado por la GPU, por sincronizaciones o bloqueado en el controlador.

Decisión: Pasa a contadores/logs del lado GPU (reinicios, clocks, VRAM) y perfilado a nivel de aplicación.

11) Comprobar uso de VRAM y GTT en Linux (cuando se exponga)

cr0x@server:~$ sudo cat /sys/kernel/debug/dri/0/amdgpu_vram_mm 2>/dev/null || echo "no amdgpu vram mm stats"
no amdgpu vram mm stats

Significado de la salida: Probablemente no estás en amdgpu o el nodo no expone esas estadísticas. En radeon heredado, el layout de debugfs es distinto.

Decisión: No pierdas tiempo buscando contadores que no existen. Cambia a la telemetría disponible: reinicios en dmesg, FPS de la aplicación y sensores hardware.

12) Leer datos de sensores GPU (térmicos/potencia) vía lm-sensors

cr0x@server:~$ sensors
radeon-pci-0100
Adapter: PCI adapter
temp1:        +92.0°C  (crit = +105.0°C)

Significado de la salida: 92°C es lo bastante alto como para provocar throttling o inestabilidad en algunas placas, dependiendo del enfriamiento y la salud de las VRM.

Decisión: Limpia el disipador, arregla el flujo de aire, vuelve a asentar, considera cambiar la pasta térmica. Si es una flota: estandariza curvas de ventilador y presión del chasis. No “tunes” software alrededor de hardware cocinado.

13) Verificar módulos del kernel cargados y conflictos

cr0x@server:~$ lsmod | egrep 'radeon|amdgpu|drm' | head
radeon               1515520  3
drm_ttm_helper         16384  1 radeon
ttm                   106496  2 radeon,drm_ttm_helper
drm_kms_helper        249856  1 radeon
drm                  622592  6 drm_kms_helper,radeon,drm_ttm_helper,ttm

Significado de la salida: La pila es coherente: radeon con helpers DRM. Si ves tanto radeon como amdgpu vinculados al mismo dispositivo, tienes un problema de configuración.

Decisión: Asegura que solo el controlador previsto esté vinculado. Blacklist al otro controlador si es necesario, pero documenta la decisión como debe ser.

14) Comprobar errores de memoria y salud general de PCIe (no ignores AER)

cr0x@server:~$ sudo journalctl -k | egrep -i 'AER|pcie|error|radeon' | tail -n 20
Jan 13 09:41:22 server kernel: pcieport 0000:00:1c.0: AER: Corrected error received: id=00e0
Jan 13 09:41:22 server kernel: pcieport 0000:00:1c.0: PCIe Bus Error: severity=Corrected, type=Physical Layer, (Receiver ID)
Jan 13 09:41:22 server kernel: pcieport 0000:00:1c.0:   device [8086:2942] error status/mask=00000001/00002000

Significado de la salida: Errores PCIe corregidos. “Corregido” no significa “inofensivo”; significa que estás consumiendo margen y puede que veas throttling o reintentos.

Decisión: Vuelve a asentar la GPU, revisa risers/cables, reduce la velocidad del enlace en BIOS como prueba o cambia de ranura. Si los errores correlacionan con picos de carga, trátalos como integridad de señal de hardware.

15) Confirmar presión de sistema de archivos e intercambio (problemas de GPU que en realidad son host)

cr0x@server:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            62Gi        58Gi       1.2Gi       1.0Gi       2.8Gi       2.6Gi
Swap:          8.0Gi       7.9Gi       120Mi

Significado de la salida: Estás intercambiando intensamente. Los stutters y frames perdidos pueden ser presión de memoria, no GPU. Además, los timeouts de drivers pueden activarse cuando el host no puede alimentar la GPU con suficiente rapidez.

Decisión: Arregla el dimensionamiento de memoria, reduce concurrencia o ajusta la carga de trabajo. No persigas “inestabilidad de GPU” mientras la máquina está paginando hasta la muerte.

Guía rápida de diagnóstico: qué comprobar primero/segundo/tercero

Esta es la guía que le daría a un ingeniero on-call a las 02:00 cuando un nodo de visualización respaldado por Radeon está “lento” o “fallando”. Está ordenada para eliminar las causas de mayor frecuencia con rapidez.

Primero: confirma que la ruta GPU es real (no un placebo)

  1. ¿La app usa aceleración por hardware? Comprueba glxinfo -B renderer. Si ves llvmpipe, para y arregla eso.
  2. ¿Está vinculado el controlador correcto? lspci -nnk. Si el dispositivo tiene el driver del kernel equivocado, estás depurando el sistema equivocado.
  3. ¿Los permisos bloquean los nodos render? ls -l /dev/dri. Los servicios headless a menudo corren sin acceso a render.

Segundo: comprueba reinicios, bloqueos y problemas de bus

  1. Busca bloqueos/reinicios de GPU en dmesg / journalctl -k. Los reinicios significan inestabilidad o bug de controlador bajo carga.
  2. Comprueba estado y velocidad del enlace PCIe con lspci -vv. Enlaces degradados pueden parecer una “regresión misteriosa”.
  3. Escanea errores AER de PCIe. Los errores corregidos son advertencias tempranas, no buenas noticias.

Tercero: aisla térmicos, memoria y deriva de configuración

  1. Térmicos: sensors. Si está caliente, es culpable hasta que se demuestre lo contrario.
  2. Presión de memoria del host: free -h, más uso de swap. El paginado crea cuellos de botella falsos de GPU.
  3. Deriva de versiones: confirma versiones de kernel/Mesa/controlador entre nodos. Si solo un host regresó, trátalo como deriva de configuración, no “aleatoriedad”.

Segundo chiste, porque este es el momento en que la gente empieza a negociar con el universo: Si tu enlace se negoció a x4 en lugar de x16, ninguna cantidad de “tuning de GPU” ayudará—la física no acepta tickets.

Tres micro-historias corporativas desde las trincheras

Micro-historia 1: El incidente causado por una suposición equivocada

El equipo operaba una pequeña granja de render para fotos internas de producto. Mayormente estaciones Linux, cada una con un Radeon discreto. La carga no era exótica: vista previa de viewport OpenGL, renders offscreen y algo de post-proceso. Llegó un nuevo lote de GPUs “idénticas” desde compras. Mismo nombre de modelo, misma cantidad de memoria y—crucialmente—la misma etiqueta en la caja.

Los nodos nuevos eran un 20–30% más lentos y de vez en cuando perdían frames en la vista previa interactiva. La gente culpó a la nueva imagen OS, luego a Mesa, luego a la actualización de la aplicación. La primera pista real vino de un solo ingeniero que dejó de adivinar y ejecutó lspci -vv en nodos viejos y nuevos. Los nodos nuevos estaban negociando anchura PCIe a x4 bajo carga.

Lo que pasó no fue magia. El nuevo lote de placas tenía disposición y características de potencia ligeramente distintas. En cierto chasis con cierto riser, no había margen de integridad de señal. El enlace PCIe se entrenó a una velocidad menor para mantenerse “estable”. No era estable de la forma que quieres; era estable de la forma que oculta el problema hasta que graficas el rendimiento.

La suposición equivocada fue “mismo modelo equivale a mismo comportamiento”. En términos de compras, esa suposición ahorra tiempo. En operaciones, crea una clase de bugs que no puedes reproducir en la máquina del ingeniero.

La solución fue aburrida: mueve esas placas a ranuras/riser distintos, fija la velocidad del enlace en la BIOS para pruebas de validación y actualiza la lista de verificación de calificación de hardware para incluir la verificación de anchura de enlace bajo carga sostenida. La solución a largo plazo fue cultural: nunca aceptes “misma SKU” como sustituto de medición.

Micro-historia 2: La optimización que salió mal

Otra organización ejecutaba sesiones VDI con aceleración GPU para diseñadores. Tenían una mezcla de GPUs y una política estricta: exprimir la máxima densidad por host. Alguien descubrió que bajar ajustes de calidad en el panel de control del driver (y habilitar un conjunto de toggles de “rendimiento”) mejoraba números de benchmark. El cambio se desplegó ampliamente, porque parecía capacidad gratis.

En una semana, la cola de tickets se llenó de artefactos intermitentes: bordes brillantes, texturas que a veces faltaban y crashes raros—pero desagradables—de aplicaciones durante la rotación del viewport. Nada era suficientemente consistente para reproducirlo de forma fiable. Cada vez que un usuario compartía pantalla, el problema paraba. Clásico.

El fallo no fue místico tampoco. Esos toggles de “rendimiento” cambiaron rutas de filtrado y heurísticas, aumentando la dependencia de una vía rápida más agresiva que tenía un bug de borde con un patrón de shader específico común en una herramienta CAD. Las escenas de benchmark no lo golpeaban. Las cargas reales sí.

La remediación no fue “revertir todo para siempre”. Fue gestión de configuración controlada: define un perfil baseline conocido bueno, luego A/B testea toggles individuales con cargas representativas, no con benchmarks sintéticos. Al final consiguieron un perfil ligeramente menos “rápido” pero mediblemente más estable. La densidad mejoró al final porque la estabilidad es capacidad.

Conclusión: las optimizaciones que cambian rutas de código son cambios de producción. Trátalas con revisión de cambios, canarios y reversión, incluso si viven en una GUI.

Micro-historia 3: La práctica aburrida pero correcta que salvó el día

Una pequeña organización mantenía un museo de sistemas heredados para una línea de fabricación. Algunas estaciones dependían de aplicaciones OpenGL antiguas validadas años atrás en hardware ATI. El equipo evitaba recertificar equipos costosos, así que ejecutaban lo que tenían, con cuidado.

Hicieron una cosa que todos se burlaban hasta que importó: fijaron versiones de controladores y mantuvieron una “imagen dorada” interna con checksums, más un pequeño cuadernillo (sí, papel) que mapeaba el modelo GPU de cada máquina, versión de firmware/BIOS y la pila de controladores conocida buena. También guardaban dos GPUs de repuesto del mismo lote en bolsas antiestáticas, probadas trimestralmente.

Un día una estación comenzó a congelarse completamente durante un cambio de turno—el peor momento posible. No empezaron reinstalando el OS ni actualizando controladores. Cambiaron la GPU por una de las de repuesto conocida buena, confirmaron estabilidad y luego llevaron la GPU fallida al banco. En el banco, los térmicos estaban al límite y comenzó a lanzar errores PCIe corregidos de forma intermitente bajo carga.

Porque tenían fijación de versiones y repuestos, el “incidente” fue un evento de mantenimiento de 30 minutos, no una tormenta de culpas de varios días. La causa raíz fue envejecimiento de hardware y degradación del enfriamiento, no software. La práctica que los salvó fue anodina: inventario, fijación y validación periódica.

Ese es el corazón poco glamoroso de la ingeniería de fiabilidad: reduce el número de desconocidos hasta que el desconocido restante sea obvio.

Errores comunes: síntomas → causa raíz → solución

Estos son los modos de fallo que aparecen repetidamente en flotas Radeon de la era ATI y entornos gráficos mixtos. Cada entrada te dice qué parece, qué está pasando realmente y qué hacer.

1) Síntoma: “La GPU está lenta después de la actualización”

Causa raíz: Retroceso del controlador a renderizado por software (llvmpipe/softpipe), a menudo por paquetes Mesa faltantes, libGL incorrecto o huecos en passthrough de contenedores.

Solución: Verifica con glxinfo -B. Asegura los DRI correctos de Mesa instalados, permisos correctos en /dev/dri/renderD* y selección consistente de libGL en el sistema.

2) Síntoma: “Stutters aleatorios cada pocos segundos”

Causa raíz: Presión de memoria del host y swapping, o contención de CPU alimentando la GPU.

Solución: Revisa free -h y la carga del host. Reduce concurrencia, añade RAM o rediseña la carga de trabajo. El tuning de GPU no arreglará el paginado.

3) Síntoma: “Pantalla negra ocasional, luego recuperación”

Causa raíz: Eventos de reinicio de GPU por bloqueos—térmicos, PSU marginal, errores de VRAM o bugs de controlador desencadenados por shaders específicos.

Solución: Inspecciona dmesg por logs de bloqueo/reinicio. Revisa térmicos (sensors), elimina overclocks, valida rieles PSU y prueba una combinación kernel/controlador estable conocida.

4) Síntoma: “Rendimiento difiere entre máquinas ‘idénticas’”

Causa raíz: Enlace PCIe negociado a menor anchura (x16 → x4) o funcionando a menor velocidad debido a ranura, riser, BIOS o integridad de señal.

Solución: lspci -vv para LnkSta. Reasienta, cambia de ranura, actualiza BIOS, prueba con velocidad reducida y estandariza rutas de hardware.

5) Síntoma: “Solo una app falla; todo lo demás está bien”

Causa raíz: Heurísticas/perfiles de driver específicos de la app, caso límite del compilador de shaders o desajuste de rutas de extensión OpenGL.

Solución: Reproduce con una escena minimizada o conjunto de shaders; prueba diferentes versiones de driver; desactiva perfiles de app si es posible; valida capacidades GL/Vulkan y asegura bibliotecas runtime consistentes.

6) Síntoma: “Aparecen artefactos tras habilitar ajustes de ‘rendimiento’”

Causa raíz: Forzar rutas rápidas o precisión reducida puede desencadenar bugs de renderizado o problemas en sombreado sensibles a precisión.

Solución: Vuelve a los valores predeterminados conocidos buenos. Reintroduce cambios uno a uno con cargas representativas. Trátalos como cambios de código.

7) Síntoma: “Trabajo headless no puede acceder a la GPU”

Causa raíz: El usuario de servicio no tiene acceso a /dev/dri/renderD* o herramientas asumen sesión Xorg/Wayland.

Solución: Añade el usuario a los grupos render/video; verifica nodos de dispositivo; usa nodos render para cómputo/offscreen cuando sea posible; evita dependencias frágiles de X.

8) Síntoma: “Congelamientos intermitentes bajo carga; logs muestran errores PCIe”

Causa raíz: Problemas de integridad de señal: riser, polvo, oxidación, ranura débil de la placa base o tarjeta fallando.

Solución: Reasienta, cambia de ranura, quita risers, mejora el enfriamiento y, si AER persiste, reemplaza el hardware sospechoso. Los errores corregidos no son una característica de rendimiento.

Listas de verificación / plan paso a paso

Lista A: Poner en marcha un nodo ATI/Radeon heredado de forma segura

  1. Inventaría la GPU exacta y el ID del subsistema (lspci -nn). Regístralo. No confíes en nombres comerciales.
  2. Elige el controlador intencionalmente (radeon vs amdgpu cuando aplique). Documenta la elección y fija versiones.
  3. Valida la salud del bus: comprueba LnkSta de PCIe y logs AER.
  4. Valida la ruta de render: asegura que glxinfo -B muestre renderizador hardware, no llvmpipe.
  5. Establece una línea base térmica: registra temperaturas en reposo y bajo carga (sensors).
  6. Ejecuta una prueba de carga sostenida lo bastante larga para provocar soak térmico (no solo un benchmark de 30 segundos).
  7. Captura versiones conocidas buenas: kernel, Mesa, Xorg/Wayland, paquetes de firmware y componentes propietarios si los hay.
  8. Crea un plan de reversión: snapshot de imagen o bloqueo de paquetes. Practica la reversión una vez.

Lista B: Cuando un nodo regresa tras una actualización

  1. Confirma que no es renderizado por software (glxinfo -B).
  2. Revisa dmesg/journal por reinicios (journalctl -k).
  3. Compara estado del enlace PCIe (lspci -vv) frente a un nodo sano.
  4. Compara versiones de paquetes (pila de controladores y Mesa). No lo intuyas; diff las versiones reales.
  5. Revisa presión de memoria del host (free -h, uso de swap).
  6. Revierte una dimensión a la vez: primero controlador, luego kernel, luego Mesa/stack X. Evita “probar cosas” al azar.
  7. Escribe la carga desencadenante que muestra la regresión. Si no puedes reproducirla, no puedes arreglarla.

Lista C: Hacer cambios de controlador sin ganarte enemistades

  1. Canary en un nodo con cargas reales, no solo benchmarks.
  2. Mide tres cosas: rendimiento, estabilidad (reinicios/bloqueos) y corrección (artefactos/problemas de precisión).
  3. Mantén un set conocido de artefactos buenos: capturas de pantalla o renders deterministas para comparar.
  4. Planifica una ventana de reversión y asegura que puedes revertir rápido sin reimaginar manualmente.
  5. No mezcles cambios: evita actualizar kernel + Mesa + controles del driver a la vez.

Preguntas frecuentes

1) ¿Fue ATI “peor” que NVIDIA antes de AMD?

No categóricamente. ATI a menudo lanzaba hardware ambicioso y luego pagaba el coste de integración en controladores y compatibilidad. NVIDIA tendía a apoyarse más en un comportamiento de controlador consistente. Para operaciones, no es “peor”, es “modos de fallo diferentes”.

2) ¿Por qué los sistemas ATI heredados muestran variabilidad extraña entre máquinas?

Porque la GPU es solo una variable. Chipset, BIOS, entrenamiento PCIe, risers, entrega de potencia y refrigeración pueden cambiar el comportamiento. Además, los forks de controladores OEM eran comunes; la deriva de versiones es real.

3) ¿Cuál es la comprobación más rápida cuando el rendimiento cae?

Verifica que no estés en renderizado por software. En Linux, glxinfo -B y comprueba la cadena del renderer. Si dice llvmpipe, tu GPU no es el cuello de botella—tu CPU está haciendo el render.

4) ¿Por qué importa tanto la anchura del enlace PCIe?

Porque regula la sumisión de comandos, las subidas de recursos y las lecturas. Una GPU hambrienta por un enlace degradado se comporta como una GPU más lenta, excepto que no puedes arreglarla con ajustes. La arreglas con disciplina de hardware/BIOS.

5) ¿Los reinicios de GPU son siempre un bug de controlador?

No. A menudo son margen de hardware: térmicos, inestabilidad de PSU, VRAM envejecida o integridad de señal. Empieza con logs, luego térmicos y salud PCIe. Si puedes reproducir reinicios en distintas imágenes OS, probablemente es hardware.

6) ¿Por qué el ecosistema de controladores de ATI se sentía complicado?

Porque gestionaba múltiples APIs, versiones de OS y comportamientos específicos de aplicaciones justo cuando las canalizaciones programables evolucionaban rápidamente. La complejidad no era opcional; era el coste de competir en esa carrera de funcionalidades.

7) Para nodos Radeon heredados, ¿debería actualizar controladores o fijarlos para siempre?

Fija por defecto, actualiza deliberadamente. Si el nodo existe para ejecutar una carga validada, la estabilidad vence a la novedad. Si la seguridad y el soporte OS requieren actualizaciones, trátalas como actualizaciones de plataforma con canarios y reversión.

8) ¿Por qué los toggles de “rendimiento” a veces provocan artefactos?

Pueden cambiar precisión, rutas de filtrado o heurísticas del compilador. Si tu carga es sensible a la precisión (CAD, visualización científica), esos atajos pueden convertirse en bugs de corrección.

9) ¿Cuál es una forma fiable de separar problemas bound por GPU de los bound por CPU?

Empieza con mpstat y métricas básicas del host: si la CPU está saturada o hay swapping, probablemente estás limitado por CPU/host. Si el host está bien y ves reinicios de GPU o anchura de enlace baja, está limitado por la ruta GPU.

10) ¿Importa todo esto ahora que AMD posee ATI?

Sí, porque persisten sistemas heredados y los patrones de ingeniería persisten. Además, la lección operativa es atemporal: las GPUs son ecosistemas, no piezas.

Próximos pasos que puedes dar esta semana

  • Audita tu flota por renderizado por software: verifica con muestras glxinfo -B strings de renderer en nodos representativos.
  • Ejecuta una auditoría de salud de enlace PCIe: registra anchura/velocidad LnkSta en todos los nodos GPU y marca degradaciones.
  • Configura una línea base de controladores “conocida buena” por generación de hardware y fíjala. Haz que las reversiones sean baratas.
  • Recoge evidencia de reinicios: centraliza logs del kernel y alerta en patrones de bloqueo/reinicio de GPU.
  • Estandariza refrigeración y limpieza: una GPU a 92°C es un bug de fiabilidad, no una vibra.
  • Codifica control de cambios para ajustes de controladores: las toggles de GUI son cambios de producción. Trátalos como tal.

ATI antes de AMD es un recordatorio de que la ingeniería gráfica no solo trata de throughput; trata de cuánta imprevisibilidad puedes tolerar. Si quieres menos incidentes, reduce la varianza: fija versiones, verifica la salud del bus, vigila térmicos y nunca asumas que la GPU está haciendo lo que crees que hace.

← Anterior
Desviación de zona horaria en contenedores Docker: corrígela sin reconstruir imágenes
Siguiente →
Panel de salud de ZFS: las métricas que debes supervisar (o estás ciego)

Deja un comentario