どのようにキャッシュ汚染を避けるためにmovntdqaを使用するには?

StackOverflow https://stackoverflow.com/questions/851286

  •  21-08-2019
  •  | 
  •  

質問

私は、CPUのキャッシュに元のメモリをロードしませんmemcpy関数を記述しようとしています。目的は、キャッシュ汚染を避けるためです。 memcpy関数は、以下の動作しますが、標準のmemcpyが行うようにキャッシュを汚染します。私は、Visual C ++ 2008のExpressでP8700のproccesoorを使用しています。私はインテルのインテル®VTuneとCPUのキャッシュの使用を参照してください。

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;
    }
}

私は同じ結果を持っている別のバージョン、持っている - 。作品が、キャッシュを汚染する

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 


}
}

更新:これはテストプログラムです。

        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)
}
役に立ちましたか?

解決

<のhref = "http://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-から引用ロード」のrel = "noreferrer">インテルでます:

  

「ストリーミングロード命令であります   データ転送を高速化するためのもの   USWCメモリタイプから。他のために   このようなキャッシュ可能としてメモリタイプ(WB)または   キャッシュ不可(UC)、命令   典型的な16バイトのMOVDQAとして振る舞います   ロード命令。しかし、将来の   プロセッサは、ストリーミング負荷を使用することができます   他のメモリタイプのための指示   (例えば、WBなど)ヒントとして   意図したキャッシュラインがストリーミングされるべき   メモリから直接コアの一方に   キャッシュ汚染を最小限に抑えることができます。」

コードが動作しない理由を

これは説明する - メモリが型WBのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top