gpt4 book ai didi

c++ - 如何不优化 - 愚蠢函数的机制

转载 作者:IT老高 更新时间:2023-10-28 21:57:24 25 4
gpt4 key购买 nike

我正在寻找一种编程技术,以确保用于基准测试的变量(没有可观察到的副作用)不会被编译器优化掉

This提供了一些信息,但我最终使用了 folly以及以下功能

/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER

#pragma optimize("", off)

template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}

#pragma optimize("", on)

#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum));
}
#endif

我想使用上面的,但我对它的工作原理知之甚少。我最感兴趣的是非 VC++ 部分和为什么/如何行

asm volatile("" : "+r" (datum));

创建一个不可优化的上下文或为什么人们会选择实现这样的事情。这两种方法之间的比较也会很有趣(我不知道 pragma optimize 是如何工作的,但它看起来像一个更清洁的解决方案 - 虽然不可移植)

最佳答案

没有禁用优化的标准方法,因此,如果您需要禁用优化,您将受限于您的实现碰巧提供的任何内容。除非您找到支持这两种方法的编译器,否则比较这两种方法是没有意义的。

无论如何,在 GCC 中,

asm volatile("" : "+r" (datum));

表示将用户提供的未经验证的汇编代码嵌入到GCC生成的汇编中。第一个字符串文字 ("") 包含要注入(inject)的汇编代码。它是空的,所以实际上根本没有发出任何代码。

: 之后的部分告诉 GCC 汇编代码的效果。 "+r"(datum) 表示 GCC 应该假定汇编代码读取和修改 datum。即使它没有。这样做的原因是,任何最终在 datum 中存储值的早期计算都不能因为不必要而被丢弃。同时,由于对datum 的潜在修改,汇编代码本身不能因为不必要而被丢弃。 volatile 还将汇编代码标记为不能被优化掉的代码,as documented here :

GCC's optimizers sometimes discard asm statements if they determine there is no need for the output variables. Also, the optimizers may move code out of loops if they believe that the code will always return the same result (i.e. none of its input values change between calls). Using the volatile qualifier disables these optimizations. [...]

确实,使用两种不同的方法来防止汇编代码被删除似乎有点过分,但我想最好确定一下。

r 约束意味着代码并不关心 GCC 提供哪些寄存器供汇编代码使用,is documented here :

‘r’
    A register operand is allowed provided that it is in a general register.

+ 修饰符意味着代码可以读取和写入datumis documented here :

‘+’
    Means that this operand is both read and written by the instruction. [...]

关于c++ - 如何不优化 - 愚蠢函数的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287064/

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