首页 > 解决方案 > 在 std 运算符重载上选择性地强制优化

问题描述

对于我拥有的代码,我可以有选择地强制执行很多__attribute__令人惊奇的事情。但是,我想有选择地更改我无权访问的功能。我试图将它放入这样的包装器中,天真地希望它会“继承”它并做我想做的事情(当然它没有这样做,因为代码的编译顺序与调用顺序不同):

std::atomic_int32_t safeValue;

__attribute((optimize("-O3"),always_inline))
inline void setAtomic()  {
    safeValue = 10;
}

当使用 -O0 编译时,它仍然会导致跳转到具有大量开销的通用实现。在我的目标平台(RISC-V)中,有原子指令,而且速度非常快。只是我想在执行 -O0 构建时调试我的应用程序,但不必浪费每个原子操作的性能,因为我将调试应用程序本身,而不是在工具链中正确实现原子操作时。

开销不小: https ://godbolt.org/z/aqWKrbT8v

当我启用 -O1 时,它变得好多了: https ://godbolt.org/z/naf7Y6dqo

只是我想成为我的 O0 构建,以便在我执行原子功能时接近 O1。我知道我要问的很奇怪,但是 C++ 具有像朋友这样的功能,所以影响超出我们控制/范围的东西的想法并不完全与标准格格不入。在这种情况下,我想调整操作数 = 重载的优化方式,而无需访问代码。

我拼命尝试推送设置然后弹出它们:https ://godbolt.org/z/qajWos6v7

但这当然不起作用(因为这些东西的编译顺序与它们被调用的顺序不同)

所以我想知道是否有一些解决方案,或者一些肮脏的(但不是太极端)的解决方法,或者答案是否定的。从技术上讲,我可以访问 STD,我可以在那里更改它,过去我用各种 gcc/gdb 调整重新编译了工具链,但感觉不对。

我没有尝试的一个想法是拥有子原子实现,它将继承原子,并用我的函数覆盖运算符重载。不确定这是否是一种方法,或者我的想法完全错误。

与此同时,我的解决方案是拥有自己的原子函数实现,其中我的 C 函数(甚至不是 C++)与手工程序集内联(连同正确的破坏者https://gcc.gnu.org/onlinedocs/gcc/Using -Assembly-Language-with-C.html效果很好)。只是当 std 已经内置了一些东西时,重新实现功能感觉不对,只是我没有像我想要的那样调整它的控制权。

标签: c++

解决方案


相关定义可能在#include <atomic>. 您需要将其放在源文件的顶部,由

#pragma GCC push_options
#pragma GCC optimize ("O3")
#include <atomic>
#pragma GCC pop_options

https://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html

当然,这根本不是“选择性的”,正如您的标题所要求的那样,但它很容易测试并且更有可能解决您的实际问题。


推荐阅读