كيفية استخدام movntdqa لتجنب تلوث ذاكرة التخزين المؤقت؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

أحاول كتابة وظيفة memcpy التي لا تقوم بتحميل ذاكرة المصدر إلى ذاكرة التخزين المؤقت لوحدة المعالجة المركزية. والغرض من ذلك هو تجنب تلوث ذاكرة التخزين المؤقت. تعمل وظيفة memcpy أدناه ، ولكن تلوث ذاكرة التخزين المؤقت مثل memcpy القياسية. أنا أستخدم P8700 Proccesoor مع Visual C ++ 2008 Express. أرى استخدام ذاكرة التخزين المؤقت لوحدة المعالجة المركزية مع Intel Vtune.

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)
}
هل كانت مفيدة؟

المحلول

نقلا عن شركة انتل:

"تهدف تعليمات تحميل الدفق إلى تسريع عمليات نقل البيانات من نوع ذاكرة USWC. بالنسبة لأنواع الذاكرة الأخرى مثل قابلة للتخزين المؤقت (WB) أو غير قابلة للتشكيل (UC) ، تتصرف التعليمات كتعليمات نموذجية MovDQA نموذجية 16 بايت. ومع ذلك ، معالجات مستقبلية قد تستخدم تعليمات تحميل الدفق لأنواع الذاكرة الأخرى (مثل WB) كتلميح مفاده أنه يجب بث خط ذاكرة التخزين المؤقت المقصود من الذاكرة مباشرة إلى القلب مع تقليل تلوث ذاكرة التخزين المؤقت. "

وهذا ما يفسر سبب عدم عمل الكود - الذاكرة من النوع WB.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top