pub fn softmax_rows(x: &mut [f32], rows: usize, cols: usize)
In-place row-wise softmax in f32, max-subtracted for stability.