Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Array parameters lose alignment metadata and ICE on >16 byte alignments

未关闭
#387 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
45/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
冷清
技术栈
rust
领域
compilers

调研方向

从 crates/rustc_codegen_nvvm/src/abi.rs 开始,阅读 readjust_fn_abi,并将数组处理与 ADT 回退分支进行比较。使用所提供的对齐数组内核复现该问题,包括 16 字节和 32 字节对齐的情况,然后验证生成的 PTX 保留所需的对齐方式,并确认更高对齐的情况不再触发报告的 ICE。

由索引模型根据 Issue 内容生成。

描述

Summary

There is a bug in rustc_codegen_nvvm/src/abi.rs where arrays passed by value to CUDA kernels discard their underlying alignment metadata, forcing them into PassMode::Direct(ArgAttributes::new()).

This presents two distinct issues:

  1. Lost Alignment Metadata (IllegalAddress traps): If you pass an array of 16-byte aligned elements (like [u128; 4] or [AlignedStruct; 2]), the compiler forces it to PassMode::Direct and generates PTX expecting 8-byte boundaries (e.g., .param .align 8 .b8 param_0[32]). However, the Host driver packs the array at a 16-byte boundary. If the kernel subsequently attempts an aligned/vectorized 128-bit load, it can trap with an IllegalAddress error.
  2. Internal Compiler Error (ICE) for >16-byte alignments: Because arrays bypass the 16-byte PassMode::Cast workaround that is correctly applied to ADTs, passing an array requiring 32-byte or greater alignment (e.g., [AlignedStruct32; 2]) triggers an ICE in the upstream NVPTX ABI handling: internal error: entered unreachable code: Align is given as power of 2 no larger than 16 bytes.

Reproduction Case

Define an aligned struct and pass an array of them to a kernel:

#[derive(Copy, Clone)]
#[repr(C, align(16))]
pub struct AlignedStruct {
    a: u64,
    b: u64,
}

#[cuda_std::kernel]
pub unsafe fn array_kernel2(arr: [AlignedStruct; 2], out: *mut u128) {
    // PTX generates: .param .align 8 .b8 array_kernel2_param_0[32]
    // The missing 16-byte alignment metadata leads to an ABI mismatch
    // between the host and device.
    unsafe {
        *out = arr[0].a as u128 + arr[1].a as u128;
    }
}

If the struct is changed to #[repr(C, align(32))], compiling the kernel causes the compiler to panic with internal error: entered unreachable code: Align is given as power of 2 no larger than 16 bytes.

Issue Details

In crates/rustc_codegen_nvvm/src/abi.rs, the function readjust_fn_abi handles arrays blindly without preserving or checking arg.layout.align.abi:

// Current array handling in abi.rs
if arg.layout.ty.is_array() && !matches!(arg.mode, PassMode::Direct { .. }) {
    arg.mode = PassMode::Direct(ArgAttributes::new());
}

Unlike the ADT fallback branch (attrs.pointee_align = Some(arg.layout.align.abi)), the array block throws away all alignment metadata. It also completely misses the PassMode::Cast workaround needed for types with align >= 16.

主要语言
Rust
星标
5.4k
派生
249
PR 合并指标
30 天内没有已合并 PR

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

Rust-GPU/rust-cuda 的其他 Issue

查看 Rust-GPU/rust-cuda 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。