BookinglyTech News
Hardware

Loongson corrige una errata en la CPU LA664: su suma atómica no era atómica

La instrucción amadd.d del núcleo LA664 falla de forma ocasional y rompe bucles que dependen de contadores atómicos. El fallo apareció empaquetando Debian y ya tiene firmware de corrección.

3 min de lecturaLobsters0 vistas

Loongson ha preparado un firmware que corrige una errata de su CPU LoongArch LA664: la instrucción de suma atómica falla de manera ocasional y no garantiza atomicidad. El hallazgo salió del port comunitario loong13 de Debian 13, después de que un test de empaquetado se quedara colgado en un bucle infinito que nadie conseguía explicar.

Wang Miao, uno de los mantenedores de ese port, se topó con el problema en febrero de 2026 mientras empaquetaba normaliz, una librería de matemáticas. Su test interno no terminaba nunca. El código afectado es de lo más corriente: OpenMP repartiendo puntos de una lista entre hilos y acumulando en una variable compartida con #pragma omp atomic. La condición de salida del bucle exige que el contador nr_points_matched alcance el total de puntos, nr_to_match. Nunca llegaba.

Con gdb delante, el diagnóstico era raro. Todos los puntos de la lista quedaban marcados como procesados, pero el contador se quedaba corto. Y el incremento por ronda de nr_points_matched debería coincidir con el de nr_points_done_in_this_round, porque van juntos en la misma región atómica. No coincidían, y la diferencia cambiaba de una ejecución a otra.

Descarte por descarte

Lo primero que se descartó fue un problema de ordenación de memoria. LoongArch usa un modelo débil y el equipo ya había cazado antes condiciones de carrera de ese tipo, así que era el sospechoso natural. Pero este código no usa los atómicos para sincronizar nada más: todo el rato lee y escribe las propias variables atómicas, y desde el punto de vista lógico era correcto.

La siguiente sospecha fue la implementación de OpenMP. En el desensamblado, el compilador generaba la instrucción amadd.d de LoongArch64 para esas operaciones, justo lo esperado. Para comprobarlo montaron dos contadores std::atomic adicionales como control, en paralelo a los dos originales. Los cuatro deberían haber dado los mismos incrementos por ronda. Dieron discrepancias aleatorias.

Sin un ejemplo mínimo reproducible, el asunto se aparcó medio año. En agosto lo retomaron con otro método: en lugar de que una persona buscara el patrón, dirigieron a una IA para que lo hiciera. En unos dos días tenían un reproductor estable, y con él la causa raíz. La suma atómica del procesador no siempre es atómica. Es una errata de silicio, y explica por qué costaba tanto: no hay nada mal en el software, solo en el chip que lo ejecuta.

Firmware

Loongson tardó dos semanas en dar con un arreglo que, según sus responsables, apenas cuesta rendimiento, y entregó firmware de prueba al equipo de loong13. Estos confirmaron que resuelve el fallo. La compañía esperaba publicarlo antes del 1 de octubre, así que quien tenga una máquina con LA664 tendrá que actualizar el firmware para dejar de ver el problema.

Queda por ver el alcance exacto: la nota habla del LA664 y no detalla qué otras versiones del núcleo heredan la errata ni si el firmware llegará por el mismo canal para todos los fabricantes. Y queda la parte incómoda de siempre en este tipo de hallazgos: cualquier software que acumule contadores con amadd.d en estas CPUs puede estar dando resultados ligeramente mal sin avisar.