Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 对于对齐的memcpy和memset REP MOVSD和REP STOSD与临时和非临时ymm/zmm寄存器_Assembly_X86 64_Memcpy_Memset - Fatal编程技术网

Assembly 对于对齐的memcpy和memset REP MOVSD和REP STOSD与临时和非临时ymm/zmm寄存器

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

我看到了一些内容丰富的帖子,讨论了复制/设置内存的差异方法的优点

所有的帖子都详细介绍了REP MOVSD在各种环境下的利弊,尽管我发现在过于笼统的环境中讨论这个话题,无法得出任何明确的答案

因此,对于x86_64 skylake,我对以下场景感到好奇:

假设在所有场景中,src和dst都是页面对齐的

  • 复制16384字节的数据

    • 比较
      REP MOVSD
      ymm块
      zmm块
  • 复制2千兆字节的数据

    • 比较
      REP MOVSD
      ymm块与VMOVNTDQ
      zmm块与VMOVNTDQ
  • 设置16384字节的数据

    • 比较
      REP STOSD
      ymm块
      zmm块
  • 设置2千兆字节的数据

    • 比较
      REP STOSD
      ymm块与VMOVNTDQ
      zmm块与VMOVNTDQ
基于和的glibc实现

对于这两种memset情况,似乎SIMD寄存器用于
memcpy
REP STOSD

我很好奇,对于这些场景是否有任何硬性的建议(并更好地理解为什么它们是建议)

多谢各位


编辑:我写这篇文章的原因之一是其他文章似乎没有讨论
AVX512

请注意,页面对齐的假设是非常危险的,因为缓冲区通常不对齐页面,并且需要花费大量时间才能达到对齐状态。还考虑到大多数复制的缓冲区实际上少于大约100字节长。你有没有对这些场景策略做过基准测试?对于非常大的传输,最好用DMA控制器来执行复制。@ Fuz是的,但是我认为其他PSOTS对这些情况非常清楚。“EOF你确定吗?”DMA通常涉及从快速内存控制器传输到某个总线上的某个DMA引擎,并且可能比原始内存带宽慢得多。