【发布时间】:2014-01-11 15:25:17
【问题描述】:
在 GCC(4.8.2 版)手册中,声明如下:
-ftree-loop-if-convert-stores:
也尝试 if-convert 包含内存的条件跳转 写道。这种转换对于多线程来说可能是不安全的 程序,因为它将条件内存写入转换为 无条件内存写入。例如,for (i = 0; i < N; i++) if (cond) A[i] = expr;转化为
for (i = 0; i < N; i++) A[i] = cond ? expr : A[i];可能产生数据竞争。
不过,我想知道使用 operator? 与 if 语句相比是否会提高性能。
- 在第一段代码中,
A[i]设置为expr仅满足条件。如果不满足,则跳过语句内的代码。 - 在第二个中,
A[i]似乎不管条件都写了;该条件仅影响其设置的值。
通过使用operator?,我们也在做检查;但是,在不满足条件的情况下,我们会增加一些开销。我错过了什么吗?
【问题讨论】:
-
我认为第二种形式更快,因为它避免了branch prediction 失败的任何机会。详情请见this previous question。
-
这是一个灰色地带,因为它混合了供应商的多线程模型、代码生成和 C。您需要了解所有这三个模型才能理解这一点。
-
只写可读的代码。不要尝试让优化器成为第二个客人。在完成这项任务方面,这比你或我要好得多
-
非常令人担忧:测试同一输入数组上的两个结构,我得到
1000000 loops: #1 = 4.428852 sec, #2 = 5.061400 sec。 (当然不使用标志。)这需要检查生成的汇编程序... -
(在我的测试中)唉:第一个转换为
testb $1, (%rdx); je LBB1_5; movb %dil, (%rsi),第二个转换为相同的代码,但也有额外的写入,中间有额外的跳转。这并没有说明什么新鲜事。
标签: c++ c gcc if-statement conditional-operator