كيفية استخدام movntdqa لتجنب تلوث ذاكرة التخزين المؤقت؟
سؤال
أحاول كتابة وظيفة 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.