首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用movntdqa避免缓存污染?

如何使用movntdqa避免缓存污染?
EN

Stack Overflow用户
提问于 2009-05-12 05:34:43
回答 1查看 4.4K关注 0票数 13

我正在尝试编写一个memcpy函数,该函数不会将源内存加载到cpu缓存中。这样做的目的是为了避免缓存污染。下面的memcpy函数可以工作,但会像标准的memcpy一样污染缓存。我在visual C++ 2008 express中使用P8700 proccesoor。我使用英特尔vtune查看cpu缓存使用情况。

代码语言:javascript
运行
复制
void memcpy(char *dst,char*src,unsigned size){
    char *dst_end=dst+size;
    while(dst!=dst_end){
        __m128i res = _mm_stream_load_si128((__m128i *)src);
        *((__m128i *)dst)=res;
        src+=16;
        dst+=16;
    }
}

我有另一个版本,有相同的结果-工作,但污染缓存。

代码语言:javascript
运行
复制
void memcpy(char *dst,char*src,unsigned size){

        char *dst_end = dst+size;

        __asm{
        mov edi, dst 
        mov edx, dst_end 
        mov esi,src
        inner_start: 
        LFENCE 
      MOVNTDQA xmm0,    [esi ]
      MOVNTDQA xmm1, [esi+16] 
      MOVNTDQA xmm2, [esi+32] 
      MOVNTDQA xmm3, [esi+48] 
      //19. ; Copy data to buffer 
      MOVDQA [edi], xmm0 
      MOVDQA  [edi+16], xmm1 
      MOVDQA  [edi+32], xmm2 
      MOVDQA  [edi+48], xmm3 
    //  25. ; Increment pointers by cache line size and test for end of loop 
      add esi, 040h 
      add edi, 040h 
      cmp edi, edx 
      jne inner_start 


}
}

更新:这是测试程序

代码语言:javascript
运行
复制
        void test(int table_size,int num_iter,int item_size){
            char *src_table=alloc_aligned(table_size*item_size);//return value is aligned on 64 bytes
            char *dst=alloc_aligned(item_size); //destination is always the same buffer
            for (int i=0;i<num_iter;i++){
                int location=my_rand()%table_size;
                char *src=src_table+location*item_size;//selecting a different src every time
                memcpy(dst,src,item_size);
            }

        }
main(){
       test(1024*32,1024*1024,1024*32)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-12 21:56:00

引用Intel

“流式加载指令旨在加速来自USWC内存类型的数据传输。对于其他内存类型(如可缓存(WB)或不可缓存(UC) ),该指令的行为类似于典型的16字节MOVDQA加载指令。但是,将来的处理器可能会对其他内存类型(如WB)使用流式加载指令,以提示应将预期的高速缓存线直接从内存流式传输到内核,同时最大限度地减少高速缓存污染。”

这就解释了为什么代码不能工作--内存是WB类型的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/851286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档