gpt4 book ai didi

c - 为什么 GCC 不优化求和循环中的内存写入?

转载 作者:行者123 更新时间:2023-12-04 00:17:33 24 4
gpt4 key购买 nike

鉴于以下 C 代码,为什么 GCC(版本 10.1,x86-64,-O3)在循环内写入内存,而不是在求和期间仅使用两个寄存器并仅在最后将结果写入内存?

void sum(unsigned int l, int *as, int *r) {
r[0] = 0;
r[1] = 0;
for (int i = 0; i < l; i++) {
r[0] += as[2 * i];
r[1] += as[2 * i + 1];
}
}

生成的指令here .

我的猜测是,这种行为与“考虑到”并发性的 GCC 有关。您可以有另一个线程,例如在执行求和时从同一地址的内存读取。
这是真正的(也是唯一的)原因吗?它甚至可能由 C 标准定义吗?

最佳答案

编译器不知道asr是否指向同一个数组,所以它不知道r[0] += as[2 * i];不会改变as[2 * i + 1]的值,r[1] += as[2 * i + 1]中需要这个值];,对于 r[0]r[1]as 的各种元素之间的其他交互也类似。

您可以通过将函数声明更改为 void sum(unsigned int l, int * 限制为,int * 限制 r)

关于c - 为什么 GCC 不优化求和循环中的内存写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62803560/

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