Assembly 对于对齐的memcpy和memset REP MOVSD和REP STOSD与临时和非临时ymm/zmm寄存器
我看到了一些内容丰富的帖子,讨论了复制/设置内存的差异方法的优点 所有的帖子都详细介绍了REP MOVSD在各种环境下的利弊,尽管我发现在过于笼统的环境中讨论这个话题,无法得出任何明确的答案 因此,对于x86_64 skylake,我对以下场景感到好奇: 假设在所有场景中,src和dst都是页面对齐的Assembly 对于对齐的memcpy和memset REP MOVSD和REP STOSD与临时和非临时ymm/zmm寄存器,assembly,x86-64,memcpy,memset,Assembly,X86 64,Memcpy,Memset,我看到了一些内容丰富的帖子,讨论了复制/设置内存的差异方法的优点 所有的帖子都详细介绍了REP MOVSD在各种环境下的利弊,尽管我发现在过于笼统的环境中讨论这个话题,无法得出任何明确的答案 因此,对于x86_64 skylake,我对以下场景感到好奇: 假设在所有场景中,src和dst都是页面对齐的 复制16384字节的数据 比较REP MOVSD,ymm块,zmm块 复制2千兆字节的数据 比较REP MOVSD,ymm块与VMOVNTDQ,zmm块与VMOVNTDQ 设置163
- 复制16384字节的数据
- 比较
,REP MOVSD
,ymm块
zmm块
- 比较
- 复制2千兆字节的数据
- 比较
,REP MOVSD
,ymm块与VMOVNTDQ
zmm块与VMOVNTDQ
- 比较
- 设置16384字节的数据
- 比较
,REP STOSD
,ymm块
zmm块
- 比较
- 设置2千兆字节的数据
- 比较
,REP STOSD
,ymm块与VMOVNTDQ
zmm块与VMOVNTDQ
- 比较
memcpy
和REP STOSD
我很好奇,对于这些场景是否有任何硬性的建议(并更好地理解为什么它们是建议)
多谢各位
编辑:我写这篇文章的原因之一是其他文章似乎没有讨论
AVX512
请注意,页面对齐的假设是非常危险的,因为缓冲区通常不对齐页面,并且需要花费大量时间才能达到对齐状态。还考虑到大多数复制的缓冲区实际上少于大约100字节长。你有没有对这些场景策略做过基准测试?对于非常大的传输,最好用DMA控制器来执行复制。@ Fuz是的,但是我认为其他PSOTS对这些情况非常清楚。“EOF你确定吗?”DMA通常涉及从快速内存控制器传输到某个总线上的某个DMA引擎,并且可能比原始内存带宽慢得多。