Rust and SPIR-V float rounding semantics are different
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 25/100
Hướng nghiên cứu
Bắt đầu tại crates/rustc_codegen_spirv/src/builder/builder_methods.rs, xung quanh phần tạo OpConvertFToS được tham chiếu, sau đó đối chiếu tài liệu tham chiếu Rust và đặc tả SPIR-V được liên kết trong issue. Xác định hành vi mặc định dự kiến hoặc hành vi do người dùng kiểm soát đối với việc chuyển đổi từ số thực sang số nguyên, rồi kiểm chứng hành vi đó với ví dụ được cung cấp. Được xem là hoàn tất khi ngữ nghĩa được chọn đã được thống nhất một cách rõ ràng và hành vi của CPU/GPU được đồng nhất hoặc được cấu hình một cách có chủ đích.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
- Ngôn ngữ chính
- Rust
- Star
- 3.4k
- Fork
- 126
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Rust-GPU/rust-gpu
-
enhancement
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 68/100
-
enhancement
Rust-GPU/rust-gpu#643 · 2 bình luận · 1 reaction · 1 người được giao ·
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
-
bug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 48/100
-
async functions cause ICE Đang mởbug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Tất cả issue của Rust-GPU/rust-gpu
Issue tương tự
-
risk:low runtime status:in-progress type:test
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
zeroclaw-labs/zeroclaw#11023 ·
-
good first issue refactor
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
bevyengine/bevy#25861 ·