任何memcpy()实现是否使用多个处理器寄存器?

时间:2018-04-02 23:39:27

标签: c optimization implementation memcpy cpu-registers

根据我的知识,

to_date(column,"%yyyy-%mm-%dd") 通常作为循环实现:

memcpy()

使用所有可用的CPU寄存器会更有意义吗?!至少对于大型副本?!

// Pseudo code - for illustration only
while(len--)
  ++*dst=++*src;

所以问题是。 // Pseudo code - for illustration only register srcA,dstA register srcB,dstB register srcC,dstC while(len-=numreg) { *dstA=*srcA; *dstB=*srcB; *dstC=*srcC; } 实现是否具体考虑了可用的寄存器,还是留给了编译器?!

2 个答案:

答案 0 :(得分:1)

  

使用所有可用的CPU寄存器会更有意义吗?!在   最小的副本?!

真。

最快的实现将使用寄存器在汇编程序中编码:

   void X_aligned_memcpy_sse2(void* dest, const void* src, const unsigned long size)
    {

      __asm
      {
        mov esi, src;    //src pointer
        mov edi, dest;   //dest pointer

        mov ebx, size;   //ebx is our counter 
        shr ebx, 7;      //divide by 128 (8 * 128bit registers)


        loop_copy:
          prefetchnta 128[ESI]; //SSE2 prefetch
          prefetchnta 160[ESI];
          prefetchnta 192[ESI];
          prefetchnta 224[ESI];

          movdqa xmm0, 0[ESI]; //move data from src to registers
          movdqa xmm1, 16[ESI];
          movdqa xmm2, 32[ESI];
          movdqa xmm3, 48[ESI];
          movdqa xmm4, 64[ESI];
          movdqa xmm5, 80[ESI];
          movdqa xmm6, 96[ESI];
          movdqa xmm7, 112[ESI];

          movntdq 0[EDI], xmm0; //move data from registers to dest
          movntdq 16[EDI], xmm1;
          movntdq 32[EDI], xmm2;
          movntdq 48[EDI], xmm3;
          movntdq 64[EDI], xmm4;
          movntdq 80[EDI], xmm5;
          movntdq 96[EDI], xmm6;
          movntdq 112[EDI], xmm7;

          add esi, 128;
          add edi, 128;
          dec ebx;

          jnz loop_copy; //loop please
        loop_copy_end:
      }
    }

来源:  Very fast memcpy for image processing?

Blog: Improving memcpy for large memory copies

How to increase performance of memcpy

答案 1 :(得分:0)

首先你的伪代码是错的,因为你忘了增加指针。当你考虑它时,你的优化就没有任何意义了。

另一个问题是你不能复制任何标准函数必须的任意数量的字节。

当然,你可以使用特定的处理器功能编写高度优化的快速内存移动功能,但它几乎不能替代标准的memcpy功能