rocrand/rocarray: bindgen enum types for Windows ABI; edition-2024 unsafe blocks in rocblas wrappers

Windows/MSVC bindgen emits C enums with only non-negative values as
signed c_int (i32) where Linux GCC/Clang emit c_uint (u32). Two classes
of failure surfaced only on the MSVC build:

E0308 (enum signedness, 31 sites, all in rocrand):
- rocrand/mod.rs: rng_type, ordering, direction_vector_set constants
  were hand-typed "u32"; retype to the exact bindgen aliases
  rocrand_rng_type / rocrand_ordering / rocrand_direction_vector_set.
- rocrand/generator.rs: PseudoRng::new/new_host and QuasiRng::new take
  rocrand_rng_type; Generator::set_ordering takes rocrand_ordering.
- rocarray/random.rs: RandomUtils::seeded_generator rng_type param
  follows PseudoRng::new (rocrand_rng_type).
These are no-ops on Linux (c_uint == u32) and correct on MSVC (i32).

E0133 (edition 2024 unsafe_op_in_unsafe_fn, 17 sites): the rocblas
level1/2/3 thin forwarders are "pub unsafe fn" but called their unsafe
trait method with no "unsafe { }" block. MSVC denies this lint as a hard
error; wrap each forwarding call. Required identically on both platforms.

rocblas enum args (rocblas_operation/fill/side/diagonal) already convert
via From impls in types.rs and stay correct on both ABIs; rocfft enums
are already bindgen-typed. Generated bindings.rs left untouched.

Verified: cargo check Finishes on Linux for both --features macros and
default features; zero E0308, zero E0133.
This commit is contained in:
2026-06-21 21:45:37 -07:00
parent 8e7a802800
commit 3089482c2d
6 changed files with 249 additions and 199 deletions
+4 -1
View File
@@ -414,7 +414,10 @@ pub struct RandomUtils;
impl RandomUtils {
/// Create a seeded generator for reproducible results
pub fn seeded_generator(seed: u64, rng_type: u32) -> Result<PseudoRng> {
pub fn seeded_generator(
seed: u64,
rng_type: crate::rocrand::bindings::rocrand_rng_type,
) -> Result<PseudoRng> {
let mut generator = PseudoRng::new(rng_type)?;
generator.set_seed(seed)?;
generator.initialize()?;
+6 -2
View File
@@ -77,7 +77,9 @@ pub unsafe fn scal_strided_batched<T>(
where
T: ScalStridedBatchedType,
{
T::rocblas_scal_strided_batched(handle, n, alpha, x, incx, stride_x, batch_count)
unsafe {
T::rocblas_scal_strided_batched(handle, n, alpha, x, incx, stride_x, batch_count)
}
}
//==============================================================================
@@ -133,7 +135,9 @@ pub unsafe fn copy_batched<T>(
where
T: CopyBatchedType,
{
T::rocblas_copy_batched(handle, n, x, incx, y, incy, batch_count)
unsafe {
T::rocblas_copy_batched(handle, n, x, incx, y, incy, batch_count)
}
}
/// Copy vectors in a strided batch
+29 -19
View File
@@ -1914,7 +1914,9 @@ pub unsafe fn spr<T>(
where
T: SprType,
{
T::rocblas_spr(handle, uplo, n, alpha, x, incx, AP)
unsafe {
T::rocblas_spr(handle, uplo, n, alpha, x, incx, AP)
}
}
// Similar functions and traits for spr, spr2, syr, syr2
@@ -1944,9 +1946,11 @@ pub unsafe fn hemm<T>(
where
T: HemmType,
{
T::rocblas_hemm(
handle, side, uplo, m, n, alpha, A, lda, B, ldb, beta, C, ldc,
)
unsafe {
T::rocblas_hemm(
handle, side, uplo, m, n, alpha, A, lda, B, ldb, beta, C, ldc,
)
}
}
/// Hermitian rank-k update
@@ -1973,7 +1977,9 @@ pub unsafe fn herk<T, R>(
where
T: HerkType<ScalarType = R>,
{
T::rocblas_herk(handle, uplo, transA, n, k, alpha, A, lda, beta, C, ldc)
unsafe {
T::rocblas_herk(handle, uplo, transA, n, k, alpha, A, lda, beta, C, ldc)
}
}
pub unsafe fn syr_batched<T>(
@@ -1990,7 +1996,9 @@ pub unsafe fn syr_batched<T>(
where
T: SyrBatchedType,
{
T::rocblas_syr_batched(handle, uplo, n, alpha, x, incx, A, lda, batch_count)
unsafe {
T::rocblas_syr_batched(handle, uplo, n, alpha, x, incx, A, lda, batch_count)
}
}
/// Strided batched symmetric rank-1 update
@@ -2010,19 +2018,21 @@ pub unsafe fn syr_strided_batched<T>(
where
T: SyrStridedBatchedType,
{
T::rocblas_syr_strided_batched(
handle,
uplo,
n,
alpha,
x,
incx,
stride_x,
A,
lda,
stride_A,
batch_count,
)
unsafe {
T::rocblas_syr_strided_batched(
handle,
uplo,
n,
alpha,
x,
incx,
stride_x,
A,
lda,
stride_A,
batch_count,
)
}
}
/// Batched symmetric rank-2 update
+163 -143
View File
@@ -57,9 +57,11 @@ pub unsafe fn gemm<T>(
where
T: GemmType,
{
T::rocblas_gemm(
handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc,
)
unsafe {
T::rocblas_gemm(
handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc,
)
}
}
/// Batched matrix-matrix multiplication
@@ -106,23 +108,25 @@ pub unsafe fn gemm_batched<T>(
where
T: GemmBatchedType,
{
T::rocblas_gemm_batched(
handle,
transa,
transb,
m,
n,
k,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
unsafe {
T::rocblas_gemm_batched(
handle,
transa,
transb,
m,
n,
k,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
}
}
/// Strided batched matrix-matrix multiplication
@@ -175,26 +179,28 @@ pub unsafe fn gemm_strided_batched<T>(
where
T: GemmStridedBatchedType,
{
T::rocblas_gemm_strided_batched(
handle,
transa,
transb,
m,
n,
k,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
unsafe {
T::rocblas_gemm_strided_batched(
handle,
transa,
transb,
m,
n,
k,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
}
}
/// General matrix-matrix multiplication with extended precision
@@ -2016,22 +2022,24 @@ pub unsafe fn hemm_batched<T>(
where
T: HemmBatchedType,
{
T::rocblas_hemm_batched(
handle,
side,
uplo,
m,
n,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
unsafe {
T::rocblas_hemm_batched(
handle,
side,
uplo,
m,
n,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
}
}
/// Strided batched Hermitian matrix-matrix multiplication
@@ -2057,25 +2065,27 @@ pub unsafe fn hemm_strided_batched<T>(
where
T: HemmStridedBatchedType,
{
T::rocblas_hemm_strided_batched(
handle,
side,
uplo,
m,
n,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
unsafe {
T::rocblas_hemm_strided_batched(
handle,
side,
uplo,
m,
n,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
}
}
/// Batched Hermitian rank-k update
@@ -2096,20 +2106,22 @@ pub unsafe fn herk_batched<T, R>(
where
T: HerkBatchedType<ScalarType = R>,
{
T::rocblas_herk_batched(
handle,
uplo,
transA,
n,
k,
alpha,
A,
lda,
beta,
C,
ldc,
batch_count,
)
unsafe {
T::rocblas_herk_batched(
handle,
uplo,
transA,
n,
k,
alpha,
A,
lda,
beta,
C,
ldc,
batch_count,
)
}
}
/// Strided batched Hermitian rank-k update
@@ -2132,22 +2144,24 @@ pub unsafe fn herk_strided_batched<T, R>(
where
T: HerkStridedBatchedType<ScalarType = R>,
{
T::rocblas_herk_strided_batched(
handle,
uplo,
transA,
n,
k,
alpha,
A,
lda,
stride_A,
beta,
C,
ldc,
stride_C,
batch_count,
)
unsafe {
T::rocblas_herk_strided_batched(
handle,
uplo,
transA,
n,
k,
alpha,
A,
lda,
stride_A,
beta,
C,
ldc,
stride_C,
batch_count,
)
}
}
/// Hermitian rank-k update with two matrices
@@ -2190,9 +2204,11 @@ pub unsafe fn herkx<T, R>(
where
T: HerkxType<ScalarType = R>,
{
T::rocblas_herkx(
handle, uplo, trans, n, k, alpha, A, lda, B, ldb, beta, C, ldc,
)
unsafe {
T::rocblas_herkx(
handle, uplo, trans, n, k, alpha, A, lda, B, ldb, beta, C, ldc,
)
}
}
/// Batched Hermitian rank-k update with two matrices
@@ -2215,22 +2231,24 @@ pub unsafe fn herkx_batched<T, R>(
where
T: HerkxBatchedType<ScalarType = R>,
{
T::rocblas_herkx_batched(
handle,
uplo,
trans,
n,
k,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
unsafe {
T::rocblas_herkx_batched(
handle,
uplo,
trans,
n,
k,
alpha,
A,
lda,
B,
ldb,
beta,
C,
ldc,
batch_count,
)
}
}
/// Strided batched Hermitian rank-k update with two matrices
@@ -2256,25 +2274,27 @@ pub unsafe fn herkx_strided_batched<T, R>(
where
T: HerkxStridedBatchedType<ScalarType = R>,
{
T::rocblas_herkx_strided_batched(
handle,
uplo,
trans,
n,
k,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
unsafe {
T::rocblas_herkx_strided_batched(
handle,
uplo,
trans,
n,
k,
alpha,
A,
lda,
stride_A,
B,
ldb,
stride_B,
beta,
C,
ldc,
stride_C,
batch_count,
)
}
}
/// Trait for types that can be used with herkx
+4 -4
View File
@@ -19,7 +19,7 @@ pub trait Generator {
}
/// Set the ordering of the generator
fn set_ordering(&mut self, ordering: u32) -> Result<()> {
fn set_ordering(&mut self, ordering: bindings::rocrand_ordering) -> Result<()> {
unsafe { Error::from_status(bindings::rocrand_set_ordering(self.as_ptr(), ordering)) }
}
@@ -56,7 +56,7 @@ impl PseudoRng {
///
/// let generator = PseudoRng::new(rng_type::XORWOW).unwrap();
/// ```
pub fn new(rng_type: u32) -> Result<Self> {
pub fn new(rng_type: bindings::rocrand_rng_type) -> Result<Self> {
let mut generator = ptr::null_mut();
unsafe {
Error::from_status(bindings::rocrand_create_generator(&mut generator, rng_type))?;
@@ -67,7 +67,7 @@ impl PseudoRng {
}
/// Create a new host-side pseudorandom number generator of the specified type.
pub fn new_host(rng_type: u32) -> Result<Self> {
pub fn new_host(rng_type: bindings::rocrand_rng_type) -> Result<Self> {
let mut generator = ptr::null_mut();
unsafe {
Error::from_status(bindings::rocrand_create_generator_host(
@@ -315,7 +315,7 @@ pub struct QuasiRng {
impl QuasiRng {
/// Create a new quasirandom number generator of the specified type.
pub fn new(rng_type: u32) -> Result<Self> {
pub fn new(rng_type: bindings::rocrand_rng_type) -> Result<Self> {
let mut generator = ptr::null_mut();
unsafe {
Error::from_status(bindings::rocrand_create_generator(&mut generator, rng_type))?;
+43 -30
View File
@@ -19,53 +19,66 @@ pub use generator::{Generator, PseudoRng, QuasiRng};
/// Convenient re-exports of random number generator types
pub mod rng_type {
use super::bindings;
use super::bindings::{self, rocrand_rng_type};
pub const PSEUDO_DEFAULT: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_DEFAULT;
pub const XORWOW: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_XORWOW;
pub const MRG32K3A: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MRG32K3A;
pub const MTGP32: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MTGP32;
pub const PHILOX4_32_10: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_PHILOX4_32_10;
pub const MRG31K3P: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MRG31K3P;
pub const LFSR113: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_LFSR113;
pub const MT19937: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MT19937;
pub const THREEFRY2_32_20: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY2_32_20;
pub const THREEFRY2_64_20: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY2_64_20;
pub const THREEFRY4_32_20: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY4_32_20;
pub const THREEFRY4_64_20: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY4_64_20;
pub const PSEUDO_DEFAULT: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_DEFAULT;
pub const XORWOW: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_XORWOW;
pub const MRG32K3A: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MRG32K3A;
pub const MTGP32: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MTGP32;
pub const PHILOX4_32_10: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_PHILOX4_32_10;
pub const MRG31K3P: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MRG31K3P;
pub const LFSR113: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_LFSR113;
pub const MT19937: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_MT19937;
pub const THREEFRY2_32_20: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY2_32_20;
pub const THREEFRY2_64_20: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY2_64_20;
pub const THREEFRY4_32_20: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY4_32_20;
pub const THREEFRY4_64_20: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_PSEUDO_THREEFRY4_64_20;
pub const QUASI_DEFAULT: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_DEFAULT;
pub const SOBOL32: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SOBOL32;
pub const SCRAMBLED_SOBOL32: u32 =
pub const QUASI_DEFAULT: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_DEFAULT;
pub const SOBOL32: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SOBOL32;
pub const SCRAMBLED_SOBOL32: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SCRAMBLED_SOBOL32;
pub const SOBOL64: u32 = bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SOBOL64;
pub const SCRAMBLED_SOBOL64: u32 =
pub const SOBOL64: rocrand_rng_type = bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SOBOL64;
pub const SCRAMBLED_SOBOL64: rocrand_rng_type =
bindings::rocrand_rng_type_ROCRAND_RNG_QUASI_SCRAMBLED_SOBOL64;
}
/// Convenient re-exports of ordering constants
pub mod ordering {
use super::bindings;
use super::bindings::{self, rocrand_ordering};
pub const PSEUDO_BEST: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_BEST;
pub const PSEUDO_DEFAULT: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_DEFAULT;
pub const PSEUDO_SEEDED: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_SEEDED;
pub const PSEUDO_LEGACY: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_LEGACY;
pub const PSEUDO_DYNAMIC: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_DYNAMIC;
pub const QUASI_DEFAULT: u32 = bindings::rocrand_ordering_ROCRAND_ORDERING_QUASI_DEFAULT;
pub const PSEUDO_BEST: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_BEST;
pub const PSEUDO_DEFAULT: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_DEFAULT;
pub const PSEUDO_SEEDED: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_SEEDED;
pub const PSEUDO_LEGACY: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_LEGACY;
pub const PSEUDO_DYNAMIC: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_PSEUDO_DYNAMIC;
pub const QUASI_DEFAULT: rocrand_ordering =
bindings::rocrand_ordering_ROCRAND_ORDERING_QUASI_DEFAULT;
}
/// Re-export direction vector constants
pub mod direction_vector_set {
use super::bindings;
use super::bindings::{self, rocrand_direction_vector_set};
pub const VECTORS_32_JOEKUO6: u32 =
pub const VECTORS_32_JOEKUO6: rocrand_direction_vector_set =
bindings::rocrand_direction_vector_set_ROCRAND_DIRECTION_VECTORS_32_JOEKUO6;
pub const SCRAMBLED_VECTORS_32_JOEKUO6: u32 =
pub const SCRAMBLED_VECTORS_32_JOEKUO6: rocrand_direction_vector_set =
bindings::rocrand_direction_vector_set_ROCRAND_SCRAMBLED_DIRECTION_VECTORS_32_JOEKUO6;
pub const VECTORS_64_JOEKUO6: u32 =
pub const VECTORS_64_JOEKUO6: rocrand_direction_vector_set =
bindings::rocrand_direction_vector_set_ROCRAND_DIRECTION_VECTORS_64_JOEKUO6;
pub const SCRAMBLED_VECTORS_64_JOEKUO6: u32 =
pub const SCRAMBLED_VECTORS_64_JOEKUO6: rocrand_direction_vector_set =
bindings::rocrand_direction_vector_set_ROCRAND_SCRAMBLED_DIRECTION_VECTORS_64_JOEKUO6;
}