有关于 AVX2 收集延迟的数据吗?
(例如访问单个缓存行的 _mm256_i32gather_ps 指令)
实际上,这确实取决于硬件。如果您查看 Agner Fog 的“指令表”,您会发现 Zen1 和 Zen2 没有列出延迟,但 VGATHERDPS 的吞吐量互为 13-20 和 9-16。对于英特尔处理器,我们有:
xmm ymm
Processor throughput latency throughput latency
-------------------------------------------------------
Haswell 9 12
Broadwell 6 7
Skylake 4 12 5 13
SkylakeX 4 12 5 13
Coffee Lake 4 12 5 13
此外,Intel 网站
关于英特尔架构上的收集指令,有一个极其奇怪的细节:它们是可在任何内存类型上工作的非临时负载,但与普通的非临时负载不同,它们不仅避免污染 L2 和 L3 数据缓存 - 它们还不会导致一级 TLB 缓存发生变化。 (不过,他们似乎确实更新了二级 TLB 缓存。)
所以答案是:即使从所有读取访问相同的缓存行,最终每个读取不仅会丢失缓存,而且每个读取都会触发页面遍历以补偿丢失的 TLB 条目。如果数据尚未预取并且使该指令变得极其情境化,那么给您带来的延迟比我所知道的任何其他指令都要糟糕。