Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Portable remainder kernel: wrong sign for integers and float64 rounded to float

Abierto Apto para principiantes
#23,682 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@usmanmateen ya está trabajando en esto.

Desde el 11/10/2026.

  • #23683 de @usmanmateen — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
82/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp, python, pytorch

Línea de trabajo

Lee kernels/portable/cpu/util/math_util.h y el op_remainder_test.cpp existente. Comprueba las sobrecargas para enteros y números de punto flotante con los casos de signo y precisión del issue, incluida la forma escalar. El trabajo estará listo cuando las pruebas cubran esos casos y los kernels portables coincidan con los resultados de PyTorch.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

🐛 Describe the bug

The portable remainder kernels give results that differ from PyTorch in two cases.

  1. Integers with mixed signs. ATen's remainder takes the sign of the divisor (-7 % 3 == 2), but for integer types utils::remainder_override in kernels/portable/cpu/util/math_util.h returns a % b, which takes the sign of the dividend (-1). The floating-point overload already adds b in this case, as the comment above both overloads describes. The integer one doesn't.
  2. float64 loses precision. The floating-point overload stores std::fmod(a, b) in a float, so double results are rounded to float precision.
import torch
from executorch.exir import to_edge
from executorch.runtime import Runtime


class Rem(torch.nn.Module):
    def forward(self, a, b):
        return torch.remainder(a, b)


def run(a, b):
    prog = to_edge(torch.export.export(Rem(), (a, b))).to_executorch()
    return Runtime.get().load_program(prog.buffer).load_method("forward").execute([a, b])[0]


a = torch.tensor([7, -7, 7, -7])
b = torch.tensor([3, 3, -3, -3])
print(torch.remainder(a, b).tolist(), run(a, b).tolist())
# [1, 2, -2, -1] [1, -1, 1, -1]

a = torch.tensor([123456789.123456789], dtype=torch.float64)
b = torch.tensor([1000.0], dtype=torch.float64)
print(torch.remainder(a, b).item(), run(a, b).item())
# 789.1234567910433 789.1234741210938

The integer case affects int8, int32 and int64, and remainder.Scalar too: torch.remainder(x, 3) gives -1 for x = -1 instead of 2. With the XNNPACK partitioner the result is the same, since these ops run on the portable kernel. A model that uses Python's % on integer tensors (for example to wrap positions or bucket ids) gets different values after export.

The existing op_remainder_test.cpp only covers 46 % 4. I have a fix with tests and will open a PR.

Versions

executorch 1.5.1 (math_util.h is the same on main at f2575be), torch 2.14.1+cpu, Python 3.12, Linux x86_64 (WSL2).

Lenguaje dominante
Python
Estrellas
5.1k
Forks
1.2k
Merge medio
2 d 9 h
PR fusionados (30 d)
632

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de pytorch/executorch

Todos los issues de pytorch/executorch

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.