Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

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

Ouverte Adaptée aux débutants
#23,682 0 commentaires 0 réactions 2 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@JakeStevens y travaille déjà.

Depuis le 12/10/2026.

  • #23683 par @usmanmateen — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
82/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
cpp, python, pytorch

Piste de recherche

Lisez kernels/portable/cpu/util/math_util.h et le fichier op_remainder_test.cpp existant. Vérifiez les surcharges pour les entiers et les nombres à virgule flottante en fonction des cas de signe et de précision indiqués dans l’issue, y compris la forme scalaire. Le travail est terminé lorsque les tests couvrent ces cas et que les kernels portables correspondent aux résultats de PyTorch.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug module: kernels triaged
🐛 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).

cc @larryliu0820 @manuelcandales @JakeStevens

Langage dominant
Python
Étoiles
5.1k
Forks
1.2k
Merge moyen
2 j 8 h
PR mergées (30 j)
610

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de pytorch/executorch

Toutes les issues de pytorch/executorch

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.