将数据写入 PCIe 设备时,可以使用写入组合映射来提示 CPU 应生成针对该设备的 64 字节 TLP。
是否可以对读取做类似的事情?以某种方式提示 CPU 读取整个缓存行或更大的缓冲区,而不是一次读取一个字?
英特尔有关于从视频 RAM 复制到主内存的白皮书;这应该类似,但要简单得多(因为数据适合 2 或 4 个向量寄存器)。
它表示 NT 加载会将整个缓存行数据从 WC 内存拉入 LFB:
普通加载指令以与指令请求大小相同的单位从 USWC 内存中提取数据。相比之下,诸如 MOVNTDQA 之类的流式加载指令通常会将完整的高速缓存行数据拉到 CPU 中的特殊“填充缓冲区”。随后的流加载将从该填充缓冲区中读取,从而产生更少的延迟。
使用AVX2_mm256_stream_load_si256()或 SSE4.1/AVX1 128 位版本。
填充缓冲区是有限的资源,因此您肯定希望编译器生成 asm,它可以连续执行 64 字节缓存行的两个对齐加载,then存储到常规内存中。
如果您一次处理多个 64 字节块,请参阅 Intel 的白皮书,了解有关使用在 L1d 中保持热状态的小型反弹缓冲区的建议,以避免将存储与 NT 负载混合到 DRAM。 (L1d 驱逐到 DRAM,就像 NT 存储一样,也需要行填充缓冲区,LFB)。
注意_mm256_stream_load_si256()没用at allWC 以外的内存类型。 NT 提示在当前硬件上被忽略,但与常规负载相比,它无论如何都会花费额外的 ALU uop。有prefetchnta
,但那是完全不同的野兽。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)