You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rust SSE内联函数做浮点乘法无性能提升的问题排查

关于Rust手动SSE/AVX实现未获性能提升的疑问

我正在用Rust做一项内联函数实验:先生成一个大型float向量,记录所有元素与常数相乘的耗时;随后改用SSE内联函数执行相同操作。在较新的笔记本电脑上处理5000万个float时,两种方式耗时均约23ms;类似的AVX实现甚至更慢,耗时约67ms。我已在计时前完成了输入和输出内存的分配。

普通f32实现方式

let mut rng = rand::thread_rng();
let x: Vec<f32> = (0..N).map(|_| rng.gen::<i16>() as f32).collect();

let mut z_native: Vec<f32> = (0..N).map(|_| 0.0).collect();

let t0 = Instant::now();
for i in 0..N {
    *z_native.get_unchecked_mut(i) = *x.get_unchecked(i) * std::f32::consts::PI;
}
println!("Native {:?}", t0.elapsed());

SSE实现方式

let mut x_sse: Vec<__m128> = vec![];
let y_sse: __m128 = x86_64::_mm_set_ps1(std::f32::consts::PI);
let mut z_sse: Vec<__m128> = vec![];

for i in 0..(N/4) {
    x_sse.push(x86_64::_mm_set_ps(
        x[(i*4)+3], x[(i*4)+2],
        x[(i*4)+1], x[(i*4)+0],
    ));
    z_sse.push(x86_64::_mm_setzero_ps());
}

let t0 = Instant::now();
for i in 0..(N/4) {
    *z_sse.get_unchecked_mut(i) = x86_64::_mm_mul_ps(*x_sse.get_unchecked(i), y_sse);
}
println!("SSE {:?}", t0.elapsed());

我是否忽略了某些关键细节?我了解内存对齐会影响性能,但看到资料说Vec始终会按所含元素的大小对齐。我还会在最后打印随机选择的结果,确保操作未被编译器优化掉。感谢解答!

补充说明:我使用cargo run --release构建,具体编译器标志为Cargo发布模式的默认设置。


内容的提问来源于stack exchange,提问作者John Stanford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:08:30