Rust and SPIR-V float rounding semantics are different
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 25/100
Piste de recherche
Commencez dans crates/rustc_codegen_spirv/src/builder/builder_methods.rs autour de la génération référencée de OpConvertFToS, puis comparez la référence Rust et la spécification SPIR-V liées dans l’issue. Déterminez le comportement par défaut prévu ou le comportement contrôlable par l’utilisateur pour la conversion des flottants en entiers, et validez-le avec l’exemple fourni. C’est terminé lorsque la sémantique choisie est explicitement acceptée et que le comportement CPU/GPU est aligné ou rendu délibérément configurable.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
There is a footgun when trying to share code between CPU and GPU. Rust and SPIR-V have different semantics when rounding floats:
Rust:
- Rust’s built-in conversion using
astruncates the fractional part, effectively rounding toward zero. - For example, 1743028479.999... becomes 1743028479.
Rust Language Reference
SPIR-V:
- SPIR-V uses the
OpConvertFToSinstruction for converting floating-point values to integers. Here is where it happens in rust-gpu. - It rounds using round-to-nearest-even, which can round 1743028479.999... up to 1743028480.
SPIR-V Specification
fn main() {
let x = 1743028480i32;
let y = (x as f64) * (1.0 / (i32::MAX as f64));
// Without explicit rounding, differs:
let without = (y * (i32::MAX as f64)) as i32;
// Using `trunc()` forces Rust’s truncation:
let with = (y * (i32::MAX as f64)).trunc() as i32;
println!("x = {}. Without rounding = {}. With trunc() = {}.", x, without, with);
}
I'm not sure which should be the default. If it is Rust's we'll want to polyfill on the spir-v side. Might be good to have this user controlled in any case.
Originally posted by @LegNeato in https://github.com/Rust-GPU/rust-gpu/discussions/228#discussioncomment-12784276
- Langage dominant
- Rust
- Étoiles
- 3.4k
- Forks
- 126
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de Rust-GPU/rust-gpu
-
enhancement
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
-
enhancement
Rust-GPU/rust-gpu#643 · 2 commentaires · 1 réaction · 1 personne assignée ·
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
-
bug
Difficulté 3/5 1-2 jours Accessibilité débutants 48/100
-
async functions cause ICE Ouvertebug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
Toutes les issues de Rust-GPU/rust-gpu
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
ClickHouse/ClickHouse#121222 ·
-
enhancement remote
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100