gpt4 book ai didi

c++ - 条件与运算符?

转载 作者:IT老高 更新时间:2023-10-28 23:01:55 28 4
gpt4 key购买 nike

在 GCC(4.8.2 版)手册中,声明如下:

-ftree-loop-if-convert-stores:
Attempt to also if-convert conditional jumps containing memory writes. This transformation can be unsafe for multi-threaded programs as it transforms conditional memory writes into unconditional memory writes. For example,

   for (i = 0; i < N; i++)
if (cond)
A[i] = expr;

is transformed to

   for (i = 0; i < N; i++)
A[i] = cond ? expr : A[i];

potentially producing data races.

不过,我想知道,使用 operator?if 语句相比,是否能提高性能。

  • 在第一段代码中,A[i] 设置为 expr only 如果条件满足。如果不满足,则跳过语句内的代码。
  • 在第二个中,A[i] 似乎是不管条件写的;该条件仅影响其设置的值。

通过使用operator?,我们也在做检查;但是,在不满足条件的情况下,我们会增加一些开销。我错过了什么吗?

最佳答案

这里说的是条件跳转被转换为条件移动指令,即cmove指令族。它们提高了速度,因为它们不会像跳转那样停止处理器流水线。

使用跳转指令,您事先不知道要加载哪些指令,因此使用预测并在管道中加载分支。如果预测正确,一切都很好,下一条指令已经在管道上执行。但是,在跳转评估之后,如果预测错误,则流水线中的所有后续指令都将无用,因此必须释放流水线,并加载正确的指令。现代处理器包含 16-30 级管道,并且分支错误预测会严重降低性能。条件移动绕过了这一点,因为它们不会在程序流中插入分支。

But does cmove always write?

来自 Intel x86 指令集引用:

The CMOVcc instructions check the state of one or more of the status flags in the EFLAGS register [..] and perform a move operation if the flags are in a specified state (or condition). [..] If the condition is not satisfied, a move is not performed and execution continues with the instruction following the CMOVcc instruction.

编辑

在进一步研究 gcc 手册后,我感到困惑,因为据我所知,编译器不会优化将 C 代码转换为另一个 C 代码,而是使用控制流图等内部数据结构,所以我真的不知道是什么他们的意思是他们的榜样。我想它们是指生成的新流的 C 等效项。我不确定这个优化是否是关于生成 cmoves.

编辑 2

由于 cmove 使用寄存器而不是内存进行操作,因此

if (cond)
A[i] = expr

无法生成cmove

不过这个

 A[i] = cond ? expr : A[i];

可以。

假设我们在 bx 中有 expr 值。

load A[i] into ax
cmp // cond
cmove ax, bx
store ax into &A[i]

所以为了使用 cmove 你必须读取 A[i] 值并在 cond if false 时将其写回,这与 if 语句不等价,而是与三元运算符等价。

关于c++ - 条件与运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743041/

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