【发布时间】:2022-01-17 00:02:53
【问题描述】:
至少有2种表达方式,
a ? b : c
假设 true 全部开启 (0xff...),false 全部关闭 (0)。
第一个是,
(a & b) | (~a & c)
第二个是,
(a & (b ^ c)) ^ c
SSE 指令的相关序列分别是,
andxx
andnxx
orxx
和
xorxx
andxx
xorxx
您更喜欢哪种方式,为什么?
【问题讨论】:
-
第一个依赖链较短:
andxx和andnxx可以并行运行。 -
考虑到 chaches 和管道,他们需要多少时钟? -- OT:我还需要看到使用“-1”或“~0”(全为)作为
true的 C 编译器实现。 -
如果
b和c在编译时是已知的或者是循环不变量,第二个版本将节省一个微操作,如果不是,它增加了依赖链。如果你有 SSE4,大多数时候你应该使用blendvps/blendvpd或pblendvb -
与How to use bitwise operations to assign specific bits of a byte according to two other bytes? (bit blend according to a mask) 几乎重复,我比较了关键路径延迟。 (我不认为
mov指令可以保留原始值。)我认为它实际上是该指令的副本以及一些关于 SSE 和性能的相关问答。 -
是的,刚刚看到你的答案。我打算使用的其他副本是Merge bit sequences a and b according to a mask(用于 SSE4.1 混合)和What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?(用于评估短序列的性能:dep 链的延迟、前端成本和后端 uops。)