Skip to content

Panic in linear algebra with rustc 1.70 #1327

Description

@Luthaf

Rustc started to add runtime checks for pointer alignment when running with debug assertions (rust-lang/rust#98112), and I'm hitting this with pure ndarray code (the assertion comes from inside matrixmultiply, I can move the issue there if you prefer). Here is the code to reproduce:

# file: Cargo.toml
[package]
name = "unaligned-ndarray"version = "0.1.0"edition = "2021"
[dependencies]
ndarray = "=0.15.6"matrixmultiply = "=0.3.7"
// file: src/main.rsuse ndarray::arr2;fnmain(){let eigenvalues = arr2(&[[18.116246041742507,0.0,0.0,0.0,0.0,0.0],[0.0,5.805039200355111,0.0,0.0,0.0,0.0],[0.0,0.0,2.927806035063571,0.0,0.0,0.0],[0.0,0.0,0.0,1.2613436289637108,0.0,0.0],[0.0,0.0,0.0,0.0,0.7165245981172256,0.0],[0.0,0.0,0.0,0.0,0.0,0.5526372670286159],]);let eigenvectors = arr2(&[[-0.10351332412686326, -0.4623184729990635,0.46449894659535196, -0.4203749636311023, -0.5470018106358486,0.2895880850053783],[0.20981505566105116,0.6470517590244376, -0.3132200413226277, -0.1691738276421041, -0.5396669852908671,0.34544844811226105],[-0.358982796007903, -0.3525936483472587, -0.4379262883013029,0.5500889201658851, -0.18043800962037712,0.4689071783680957],[0.6169286555756925,0.00961938345319455,0.42590724690207227,0.39057345164956947,0.19907003544487653,0.4957146540928189],[-0.6072205669943727,0.39430954416709896,0.3038644014916453, -0.15477956133038978,0.3966660481310112,0.4496319890292384],[0.25899073972848086, -0.29612635926759445, -0.46970623040654336, -0.5617499017932381,0.42428511178276024,0.3592049901572456],]);let a = eigenvectors.dot(&eigenvalues);let a = a.dot(&eigenvectors.t());println!("{:?}", a);}
$ rustc -vV
rustc 1.72.0 (5680fa18f 2023-08-23)
binary: rustc
commit-hash: 5680fa18feaa87f3ff04063800aec256c3d4b4be
commit-date: 2023-08-23
host: aarch64-apple-darwin
release: 1.72.0
LLVM version: 16.0.5

Running this give this panic & backtrace:

$ RUST_BACKTRACE=1 cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/unaligned-ndarray`
thread 'main' panicked at 'misaligned pointer dereference: address must be a multiple of 0x10 but is 0x13df040d8', ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:395:43
stack backtrace:
0: rust_begin_unwind
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/panicking.rs:593:5
1: core::panicking::panic_nounwind_fmt
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/panicking.rs:96:14
2: core::panicking::panic_misaligned_pointer_dereference
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/panicking.rs:175:5
3: matrixmultiply::gemm::gemm_packed::{{closure}}::{{closure}}
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:395:43
4: std::thread::local::LocalKey<T>::try_with
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/thread/local.rs:270:16
5: std::thread::local::LocalKey<T>::with
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/thread/local.rs:246:9
6: matrixmultiply::gemm::gemm_packed::{{closure}}
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:395:23
7: matrixmultiply::threading::RangeChunkParallel<G>::for_each
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/threading.rs:220:25
8: matrixmultiply::gemm::gemm_packed
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:384:5
9: matrixmultiply::gemm::gemm_loop::{{closure}}
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:327:21
10: matrixmultiply::threading::RangeChunkParallel<G>::for_each
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/threading.rs:222:13
11: matrixmultiply::gemm::gemm_loop
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:310:13
12: <matrixmultiply::gemm::GemmParameters<T> as matrixmultiply::kernel::GemmSelect<T>>::select
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:211:13
13: matrixmultiply::dgemm_kernel::detect
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/dgemm_kernel.rs:65:20
14: matrixmultiply::gemm::dgemm
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/matrixmultiply-0.3.7/src/gemm.rs:91:5
15: ndarray::linalg::impl_linalg::mat_mul_general
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ndarray-0.15.6/src/linalg/impl_linalg.rs:527:13
16: <ndarray::ArrayBase<S,ndarray::dimension::dim::Dim<[usize; 2]>> as ndarray::linalg::impl_linalg::Dot<ndarray::ArrayBase<S2,ndarray::dimension::dim::Dim<[usize; 2]>>>>::dot
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ndarray-0.15.6/src/linalg/impl_linalg.rs:286:9
17: ndarray::linalg::impl_linalg::<impl ndarray::ArrayBase<S,ndarray::dimension::dim::Dim<[usize; 2]>>>::dot
at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ndarray-0.15.6/src/linalg/impl_linalg.rs:257:9
18: unaligned_ndarray::main
at ./src/main.rs:22:13
19: core::ops::function::FnOnce::call_once
at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
thread caused non-unwinding panic. aborting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions