关于x86字符串指令性能的可靠信息?

R..*_*R.. 12 optimization performance x86 assembly

常见的widsom 在执行相同的操作时rep movsbrep movsd(或在64位上rep movsq)慢得多.但是,我已经在一些现代机器上进行了测试,并且在大量缓冲区大小(10字节到2兆)之间的运行时间相同(达到测量噪声).到目前为止,我刚刚在2台机器(32位Intel Atom D510和64位AMD FX 8120)上进行了测试.

  • 是否有rep movsbrep movsd(或rep movsq)更慢的现代x86(32位或64位)机器?

  • 如果没有,那么差异显着的最后一台机器是什么,它有多重要?

我想从这个问题的角度来看这个问题是为了避免货物过多的一系列测试将记忆分解成未对齐的头/尾和对齐中间以便使用rep movsd或者rep movsq如果这样做没有实际的好处......

har*_*old 15

这里有很多基准:instlatx64.atw.hu

例如(英特尔酷睿2双核E6700):

REP MOVSB   BW in L1D:13.04 B/c  34829MiB/s
REP MOVSW   BW in L1D:13.29 B/c  35493MiB/s
REP MOVSD   BW in L1D:13.40 B/c  35783MiB/s
Run Code Online (Sandbox Code Playgroud)

这表明有有差别,但它是很小的.

SandyBridge的这个有点奇怪:

REP MOVSB   BW in L1D:25.50 B/c  86986MiB/s
REP MOVSW   BW in L1D:18.09 B/c  61721MiB/s
REP MOVSD   BW in L1D:27.47 B/c  93693MiB/s
Run Code Online (Sandbox Code Playgroud)

似乎在一些Atoms上有很大的不同(似乎已经与D5xx一起消失了,所以你只是错过了它):

REP MOVSB   BW in L1D: 0.53 B/c    990MiB/s
REP MOVSW   BW in L1D: 1.93 B/c   3598MiB/s
REP MOVSD   BW in L1D: 3.74 B/c   6960MiB/s
Run Code Online (Sandbox Code Playgroud)

我没有发现任何可以被认为是新的东西的巨大差异.