viernes, 28 de septiembre de 2012

Asincronía A/V y similares en sistemas Windows sobre equipos con overclock

Este problema fue descubierto en 2010 por dos foreros de NotebookReview.com: Dufus y Unclewebb, éste, el desarrollador de la utilidad de overclock ThrottleStop -especializada en equipos portátiles- también participa en la comunidad de TechPowerUp!. Al parecer, el incordio existe desde la época de Windows XP, sistema para el que ofrece la solución en su mensaje: añadir al fichero BOOT.ini el parámetro /USEPMTIMER.  Microsoft lo documenta en su KB (Knowledge Base).

En cualquier caso, menos de un año después ya había dado con la solución para Windows 7 -y, de suponer, Windows Vista-. Unclewebb explica en el foro de  NotebookReview el contexto y los pasos necesarios para solventar este problema. Un pequeño programa diagnosticador y un comando fueron la solución efectiva para este pequeño-gran incordio.


¿Cuál es el origen?


El cambio de la frecuencia del bus frontal (FSB) -ojo, no el multiplicador; éste no afecta a los contadores internos del sistema- de un procesador no parece sentarle muy bien a Windows 7 puesto que una de sus funciones para utilizar en temporizadores de máxima precisión -inferior a un microsegundo- es dependiente de la frecuencia de la CPU.
En concreto, Windows basa los resultados de su función QueryPerformanceFrequency básicamente en el Time Stamp Counter (TSC), en lugar de un contador fijado a una frecuencia como el ACPI Power Management Timer (en versiones de Windows anteriores) o el HPET (High Precision Event Timer). La solución es activar el HPET tanto en BIOS/EFI de la placa principal como en el sistema operativo. (Más al respecto en este artículo técnico de Mark B. Friedman.)

El perjuicio principal de este problema ocurre en programas de audio/vídeo, y especialmente en videojuegos; Entre otros, pueden surgir saltos y pérdida de imágenes (frames), pérdida de la sincronización vertical, asincronía con la imagen en dispositivos de entrada como ratones, asincronía entre audio y vídeo, etc.
(Dejando aparte, claro está, que el problema esté siendo ocasionado por un dispositivo que introduzca -por defectos en su controlador- excesivas latencias; lo cual puede ser comprobado mediante descartes -por eliminación- junto con la utilidad DPC Latency Checker.)

Para saber si un equipo que sufre el estrés de un overclock por FSB tiene el potencial de este perjuicio puede ejecutarse el programa WinTimerTester de Unclewebb y dejarlo funcionando un minuto o dos. Si ambos contadores están en sincronía -es decir, la ratio es 1:1- el equipo no sufre el problema que nos ocupa. En caso contrario, ahora viene la solución.


¿Cómo arreglarlo?


Los sistemas operativos Windows afectados deberían tener instalado un programa para la línea de comandos llamado bcdedit, cuyo nombre significa Boot Configuration Data (BCD) Editor.
Uno de los parámetros de este programa, useplatformclock, es el que permite corregir el problema del contador despistado. Se utiliza del siguiente modo:

Se pulsa Win+R o se abre una consola de comandos con permisos elevados, según corresponda, y se escribe la línea "bcdedit /set useplatformclock true" (sin comillas). Inmediatamente tras lo cual se reinicia el sistema. Puede volverse a ejecutar WinTimerTester para comprobar el correcto solventado del problema.

Si, por cualquier motivo, quisiera volverse al estado anterior, se realiza el procedimiento anterior pero en lugar de esa línea se escribiría "bcdedit /deletevalue useplatformclock" (sin comillas).

Caso de que el problema no se solucionase de esta manera, habría que comprobar si el gestor de firmware (BIOS o EFI) de la placa principal tiene activado el sistema de contadores HPET y activarlo de no ser así — Suele encontrarse en el menú de gestión/administración de energía.


Nota: Antes de modificar el cargador de arranque de Windows Vista/7 es recomendable hacer un respaldo. El procedimiento indicado es seguro pero siempre es mejor ser precavido.
Para ello escriba en una consola de comandos con permisos elevados: "bcdedit /export C:\NombreRespaldo" (sin comillas).

Así tendrá en C:\ una copia llamada NombreRespaldo (o el nombre que se prefiera) con el respaldo de sus valores de arranque de Windows. Si, por cualquier caso, metiera la pata seriamente puede reimportar los datos previos así: "bcdedit /import C:\NombreRespaldo" (sin comillas).

Si el sistema no arrancase, está claro que la mencionada recuperación tendría que hacerse desde el disco de instalación de Windows. Para ello introduzca el DVD, inicie el PC y pulse en "Reparar el equipo", posteriormente tras seleccionar el sistema operativo a recuperar pulse en la opción "Símbolo del sistema". Una vez se encuentre en la línea de comandos puede procederse del modo indicado previamente.
De cualquier modo, este es un caso extravagante en el que algo inesperado ha ocurrido durante el proceso, o no se ha seguido el proceso descrito.