【发布时间】:2015-02-27 11:58:44
【问题描述】:
我一直在使用 Xorshift* 随机数生成器,并且遇到了 this 对其属性的探索。引用该网站(强调我的):
xorshift64* 生成器怎么会比 xorshift1024* 生成器慢?
依赖关系。 xorshift64* 生成器的三个异或/移位必须按顺序执行,因为每个都取决于前一个的结果。在 xorshift1024* 生成器中,两个 xor/shift 是完全独立的,可以在 CPU 内部并行化。我还怀疑更大的状态空间使 CPU 可以执行更积极的推测执行(实际上,xorshift128* 生成器比 xorshift1024* 生成器慢)。
CPU 语句内部的这种并行化是什么意思?我认为这意味着 CPU 将使用向量指令同时执行两个异或/移位,但我无法在编译器的汇编输出中看到这一点的证据。这是深度 CPU 流水线的事情吗?或者我应该能够看到生成的汇编器中发生了什么?
【问题讨论】:
-
Superscalar CPUs 有多个执行单元和较长的管道 - 减少串行依赖可以通过保持更多执行单元忙碌来实现更多并行性。因此,如果您有两个 ALU,如果让它们都忙,您可以获得两倍的吞吐量。
-
一个 CPU 在单个代码/线程内有多个执行端口。当指令之间没有依赖关系时,可以在同一时钟上运行多条指令。
-
这不是编译时产生的并行度,而是CPU在运行时看到一个块中的几条指令没有依赖关系时产生的并行度。
-
顺便说一句,这种 CPU 并行称为指令级并行。
-
@didierc 那么如何让CPU看到更多独立的指令呢?他们不是编译时间生成的吗?删除不必要的依赖不是编译器的工作吗?
标签: c++ c performance prng