使用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
相关产品推荐
相关产品推荐

