performance - REP 做了什么设置?

标签 performance assembly optimization x86 cpu-architecture

引用英特尔® 64 和 IA-32 架构优化引用手册,第 2.4.6 节“REP 字符串增强”:

The performance characteristics of using REP string can be attributed to two components: startup overhead and data transfer throughput.

[...]

For REP string of larger granularity data transfer, as ECX value increases, the startup overhead of REP String exhibit step-wise increase:

  • Short string (ECX <= 12): the latency of REP MOVSW/MOVSD/MOVSQ is about 20 cycles,
  • Fast string (ECX >= 76: excluding REP MOVSB): the processor implementation provides hardware optimization by moving as many pieces of data in 16 bytes as possible. The latency of REP string latency will vary if one of the 16-byte data transfer spans across cache line boundary:

    • Split-free: the latency consists of a startup cost of about 40 cycles and each 64 bytes of data adds 4 cycles,
    • Cache splits: the latency consists of a startup cost of about 35 cycles and each 64 bytes of data adds 6 cycles.
  • Intermediate string lengths: the latency of REP MOVSW/MOVSD/MOVSQ has a startup cost of about 15 cycles plus one cycle for each iteration of the data movement in word/dword/qword.



(强调我的)

没有进一步提及这种启动成本。它是什么?它有什么作用,为什么总是需要更多时间?

最佳答案

这个patent表明解码器能够确定最后移动到rcx。是立即的,或者是否以某种方式修改了 rcx 中的值在解码器上是未知的。它通过在将立即 mov 解码为 rcx 时设置一个位来实现这一点。并将其称为“快速字符串位”并将立即值存储在寄存器中。该位在解码修改 rcx 的指令时被清除。以一种未知的方式。如果该位被设置,那么它会跳转到一个单独的微码例程中的一个位置,该位置可能是 12 次重复的大小——如果 rcx = 5,它会跳转到重复 7。即它保存的寄存器中的立即值是 5。这是一个不包含微分支的快速实现。如果没有设置它,根据 SGX 论文中讨论了更大阵列的“微码辅助”,那么当 rcx 的值时,它可能会在退休时发出一个陷阱到慢循环微码例程的微指令。是已知的,尽管这更像是一个总是陷阱的“陷阱”uop,而不是可能导致需要“协助”的uop。或者,正如专利所建议的那样(“否则,指令翻译器 206 将控制转移到循环的 REP MOVS 微指令序列”),MSROM 可以改为内联并立即执行慢速例程,并且它只是继续发出重复和循环,直到分支错误预测和最终修正为未采取,微码结束。
我假设常规(循环)MSROM 程序主体中的微分支将由 uop 本身(在操作码中)静态预测,因为这是一个将执行多次并错误预测一次的循环。因此,这种快速方法只会消除序列末尾的分支错误预测以及每次迭代的微分支指令,从而减少了微指令的数量。主要的错误预测发生在 Peter 提到的设置中,这似乎是 P6“快速字符串”的设置(显然与专利中的“快速字符串”一词无关,它出现在 P6 之后),或者实际上是 ERMSB,我think 只发生在专利提到的慢(循环)例程中。在慢例程中,如果 ecx >= 76 ,然后可以对其进行增强并通过初始设置过程,但似乎 ecx需要超过一定的大小才能通过“快速字符串”或 ERMSB 的启动过程的开销实际上更快。这将需要 ecx 的值。被知道,这可能只是一个普通的 ecx可能会误判的比较和跳跃。显然,这种缓慢的例程增强也使用了不同的缓存协议(protocol),as discussed .
微分支错误预测代价高昂,因为它必须 flush the whole pipeline, refetch the rep movs instruction and then resume decoding at the mispredicted micro-ip ,在它可能已经完成解码并且其他微指令在它后面被解码之后返回到 MSROM 程序。 BOB 也可能与微分支错误预测一起使用,它比宏分支错误预测更有益。 RAT 快照可能与每个分支指令的 ROB 条目相关联。

关于performance - REP 做了什么设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902068/

相关文章:

mysql - 优化子查询选择每组最后一条记录

windows - 具有内联 asm 的 Windows x64 平台中的 libsoxr 未编译

c - C中 double 组的优化总和

c# - 将 IEnumerable 转换为 ArrayList O(N) 还是 O(1)?

java - 为什么我的 UART 在 Java 中的性能会有所不同?

c# - 将列表克隆到现有列表中、最小化内存重新分配的最有效方法?

java - 我在将 SearchView 与 RecyclerView 一起应用时遇到问题

macos - 在OSX x64程序集中使用RIP相对寻址

c++ - 虚拟处理器和高级网络 linux 和 windows

ruby-on-rails - Rails 3数据库索引和其他优化