For*_*ber 0 sse x86-64 simd cpu-architecture memory-bandwidth
你好论坛 - 我有一些关于SIMD内在的类似/相关问题我在网上搜索了包括stackoverflow但没有找到好的答案所以请求你的帮助.
基本上我试图理解64位CPU如何在一次读取中获取所有128位,以及这种操作的要求是什么.
加载/存储不直接转到内存(除非您在不可缓存的内存区域上使用它们).甚至NT存储也会进入写入组合填充缓冲区.
加载/存储在执行单元和L1D缓存之间进行.CPU内部具有从高速缓存到执行单元以及从L1D到外部高速缓存的宽数据路径.请参阅如何快速缓存?关于electronics.SE,关于英特尔IvyBridge.
例如,IvB在执行单元和L1D之间具有128b数据路径.Haswell将其扩展到256位.未对齐的加载/存储具有完整的性能,只要它们不跨越缓存行边界即可.Skylake-AVX512将其扩展到512位,因此它可以在一个时钟周期内完成2个64字节加载和64字节存储.(只要L1D缓存中的数据很热).
包括Ryzen在内的AMD CPU处理128b块中的256b向量(即使在执行单元中,与Pentium M之后的Intel不同).较旧的CPU(例如Pentium III和Pentium-M)将128b加载/存储(和矢量ALU)分成两个64位的两半,因为它们的加载/存储执行单元只有64位宽.
内存控制器为DDR2/3/4.总线是64位宽,但使用突发模式,突发大小为64字节(不一定是高速缓存线的大小.)
作为"64位"CPU与任何内部或外部数据总线的宽度无关.这个术语过去曾用于其他CPU,但即便是P5 Pentium也有64位数据总线.(对齐的8字节加载/存储保证原子性早于P5,例如x87或MMX.)在这种情况下,64位指的是指针和整数寄存器的宽度.
进一步阅读:
每个程序员应该了解的内存(但请注意,许多软件预取的东西已经过时,现代CPU具有比Pentium4更好的硬件预取程序).仍然是必不可少的阅读,特别是如果你想了解CPU如何连接到DDR2/3/4内存.
x86标记wiki中的其他性能链接.
针对memcpy增强了REP MOVSB,以获取有关x86内存带宽的更多信息.特别要注意的是,单线程带宽可能受到max_concurrency/latency的限制,而不受DRAM控制器的限制,尤其是在多核Xeon(L3 /内存的延迟较高)上.