gpt4 book ai didi

c++ - 执行顺序

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:01 25 4
gpt4 key购买 nike

我希望确保所请求的计算完全按照我指定的顺序执行,而不会对编译器或CPU(包括链接器、汇编程序和您能想到的任何其他东西)进行任何更改。
运算符从左到右的关联性在C语言中是假定的
我在C中工作(可能也对C++解决方案感兴趣),它指出,对于相等优先级的操作,存在一个假定的左到右运算符关联性,因此
a = b + c - d + e + f - g ...;
相当于
a = (...(((((b + c) - d) + e) + f) - g) ...);
一个小例子
但是,请考虑以下示例:

double a, b = -2, c = -3;
a = 1 + 2 - 2 + 3 + 4;
a += 2*b;
a += c;

如此多的优化机会
对于许多编译器和预处理器来说,它们可能足够聪明,能够识别出“ + 2 - 2”是冗余的,并对此进行优化。类似地,他们可以认识到“ += 2*b”后面的“ += c”可以使用单个FMA编写。即使它们在FMA中没有优化,它们也可以切换这些操作的顺序等。此外,如果编译器没有进行这些优化,CPU很可能会决定执行一些无序的操作,并决定它可以在“ += c”之前执行“ += 2*b”等操作。
由于浮点运算是非关联的,因此每种类型的优化都可能导致不同的最终结果,如果在某个地方内联了以下内容,则可能会注意到这一点。
为什么要担心浮点关联性?
对于我的大多数代码,我希望尽可能多地进行优化,而不关心浮点关联性或位重复性,但偶尔会有一个小片段(类似于上面的示例),我希望不受限制,完全受人尊重。这是因为我用的是一种数学方法,它确实需要一个可重复的结果。
我能做些什么来解决这个问题?
想到了一些想法:
禁用编译器优化和无序执行
我不希望这样,因为我希望我的其他99%的代码得到极大的优化。(这好像是割下我的鼻子来羞辱我的脸)。我也很可能没有权限更改我的硬件设置。
使用pragma
编写程序集
代码片段很小,这可能是合理的,尽管我对此不是很有信心,特别是在调试的时候。
把它放在一个单独的文件中,尽可能不优化地单独编译,然后使用函数调用链接
不稳定变量
在我看来,这些只是为了确保内存访问得到尊重和优化,但也许它们会被证明是有用的。
通过明智地使用指针访问所有内容
也许吧,但这看起来像是可读性、性能和等待发生的错误方面的灾难。
如果有人能想出任何可行的解决方案(无论是从我提出的任何想法还是其他方面),那将是理想的。在我看来,“pragma”选项或“function call”似乎是最好的方法。
最终目标
把一小堆简单的、基本上普通的C代码标记为受保护的、不可触及的(实际上大多数)优化,同时允许对其余代码进行大量优化,包括CPU和编译器的优化。

最佳答案

用汇编语言编写这段关键代码。
你现在的处境很不寻常。大多数情况下,人们希望编译器进行优化,因此编译器开发人员不会花太多精力在避免优化的方法上。即使使用你得到的knobs(pragmas、独立编译、间接指令等等),你也永远无法确定某些东西不会被优化。您提到的一些不受欢迎的优化(例如,常量折叠)在现代编译器中无论如何都无法关闭。
如果你使用汇编语言,你可以确保你得到的正是你写的。如果你用别的方法做,你就没有那么大的信心。

关于c++ - 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54713704/

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