gpt4 book ai didi

c - 为什么 C/RUST 中的一个加法运算在结果 ASM 中有 3 个 double 浮点加法工具?

转载 作者:行者123 更新时间:2023-11-29 08:34:15 24 4
gpt4 key购买 nike

简单的C代码,只有一次 double 加法。

void test(double *a, double *b, long n) {
for (long j = 0; j < n; j++)
for (long i = 0; i < n; i++) {
b[i] = b[i] + a[j];
}
}

在编译器资源管理器中获取 ASM 结果:https://godbolt.org/z/tJ-d39

有一个addpd和两个addsd。两者都是 double 相关的。

另一个类似的 rust 代码,得到了更多的 double 添加工具:https://godbolt.org/z/c49Wuh

pub unsafe fn test(a: &mut [f64], b: &mut [f64], n: usize) {
for j in 0..n {
for i in 0..n {
*b.get_unchecked_mut(i) = *b.get_unchecked_mut(i) + *a.get_unchecked_mut(j);
}
}
}

最佳答案

尝试 compiling without optimizations你只会得到一条 addsd 指令。 C 代码中的两个额外添加是由于自动矢量化。特别是如果您查看反汇编的第 34 和 37 行,您将看到 vector 内存访问。 addpd 是矢量化代码的主要添加项,两个 addsd 用于处理边界条件。

Rust 代码中的额外指令是由于循环展开。

正如@Peter Cordes 所指出的,gcc 在-O3 优化时默认不会进行循环展开,而LLVM(Rust 编译器所基于的)会进行。因此,C 代码和 Rust 代码之间存在差异。

关于c - 为什么 C/RUST 中的一个加法运算在结果 ASM 中有 3 个 double 浮点加法工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com