上海的ZeroMemory

时间:2012-10-08 17:50:39

标签: optimization assembly x86 sse

我需要简单的ZeroMemory实现SSE(SSE2首选) 有人可以帮忙吗?我正在通过SO和网络进行搜索,但没有找到直接答案。

3 个答案:

答案 0 :(得分:4)

ZeroMemory()memset()不够好吗?

免责声明:以下某些内容可能是SSE3。

  1. 通过循环填充任何未对齐的前导字节,直到地址为16
  2. 的倍数
  3. push保存xmm reg
  4. pxor将xmm reg归零
  5. 剩余长度> = 16,
    1. movdqamovntdq执行写入
  6. pop恢复xmm reg。
  7. 填写任何未对齐的尾随字节。
  8. movntdq可能看起来更快,因为它告诉处理器不要将数据带入缓存,但如果要使用数据,这可能会导致性能下降。如果你在释放内存之前擦洗内存可能更合适(就像你使用SecureZeroMemory()那样)。

答案 1 :(得分:1)

我想加速你的代码,而不是完全了解你的CPU如何工作以及瓶颈在哪里。

这里是你的速度优化程序,只是为了展示应该如何制作。

在我的电脑上比你快了大约5倍(清除1MBytes mem块),测试它并询问是否有些想法不清楚:

//edx = memory pointer must be 16 bytes aligned
//ecx = memory count must be multiple of 16 
    xorps       xmm0, xmm0                      //Clear xmm0
    mov         eax, ecx                        //Save ecx to eax
    and         ecx, 0FFFFFF80h                 //Clear only 128 byte pages
    jz          @ClearRest                      //Less than 128 bytes to clear
@Aligned128BMove:
    movdqa      [edx], xmm0                     //Clear first 16 bytes of 128 bytes 
    movdqa      [edx + 10h], xmm0               //Clear second 16 bytes of 128 bytes 
    movdqa      [edx + 20h], xmm0               //...
    movdqa      [edx + 30h], xmm0
    movdqa      [edx + 40h], xmm0
    movdqa      [edx + 50h], xmm0
    movdqa      [edx + 60h], xmm0
    movdqa      [edx + 70h], xmm0
    add         edx, 128                        //inc mem pointer
    sub         ecx, 128                        //dec counter
    jnz         @Aligned128BMove
@ClearRest:
    and         eax, 07Fh                       //Clear the rest
    jz          @Exit
@LoopRest:
    movdqa      [edx], xmm0
    add         edx, 16
    sub         eax, 16
    jnz         @LoopRest
@Exit:

答案 2 :(得分:0)

CPU中的几乎所有晶体管都用于以某种方式尽可能快地进行存储器访问。 CPU在所有内存访问中都做得非常出色,并且指令的运行速度比可能的内存访问速度快得多。

因此,在大多数情况下,尝试击败memset是一项徒劳无益的练习,因为它已经受到记忆速度的限制(正如其他人所说)。