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


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

  • 有没有现代的x86(32位或64位)机器 rep movsb 比...慢 rep movsd (要么 rep movsq)?

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

我想从这个问题的角度提出这个问题,希望避免货物过多的测试将记忆分解成未对齐的头/尾和对齐的中间,以便使用 rep movsd 要么 rep movsq 如果这样做没有实际的好处......


2220
2017-09-10 20:48


起源

您对现代机器的性能结果是正确的。 - Alex Brown
它被内存总线带宽限制,而不是cpu。 - Hans Passant
从理论上讲,这可能是正确的,但其他复制方式(例如C循环)的速度要慢2-8倍。因此,花费的cpu时间正在发挥作用。 - R..
有关: 为memcpy增强了REP MOVSB。我想,顺便说一句 agner.org/optimize 据报道,一个错位的起始地址使得整体 rep stos 要么 rep movs 至少在Intel CPU上操作较慢。 - Peter Cordes


答案:


这里有很多基准: 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

哪个表明那里  差别,但它很小。

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

似乎在一些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

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


15
2017-09-10 20:53