SORU
19 Mayıs 2011, PERŞEMBE


Neden büyük performans 2048x2048 karşı 2047x2047 dizi çarpma darbe var mı?

Daha önce de belirttiğim gibi bazı matris çarpma kıyaslama yapacağım Why is MATLAB so fast in matrix multiplication?

Şimdi iki 2048x2048 matrislerin çarpılması, C arasında büyük bir fark olduğunda, başka bir sorun var# ve diğerleri. Ben sadece 2047x2047 matrisleri çarpma çalıştığınızda, normal görünüyor. Ekledi karşılaştırılması için bazı diğerleri de.

1024x1024 - 10 saniye.

1027x1027 - 10 saniye.

2047x2047 - 90 saniye.

2048x2048 - 300 saniye.

2049x2049 - 91 saniye. (update)

2500x2500 - 166 saniye

Üç ve 2k dava ile 2k için yarım dakika bir fark var.

2dim dizileri kullanarak

//Array init like this
int rozmer = 2048;
float[,] matice = new float[rozmer, rozmer];

//Main multiply code
for(int j = 0; j < rozmer; j  )
{
   for (int k = 0; k < rozmer; k  )
   {
     float temp = 0;
     for (int m = 0; m < rozmer; m  )
     {
       temp = temp   matice1[j,m] * matice2[m,k];
     }
     matice3[j, k] = temp;
   }
 }

CEVAP
19 Mayıs 2011, PERŞEMBE


Bu muhtemelen L2 önbelleği çatışmalar ile ilgisi vardır.

Önbellek matice1 sıralı olarak erişilen oldukları için sorun değildir özlüyor. Tam bir sütun matice2 için ancak L2 (i.uyar e ne zaman erişim matice2[0, 0], matice2[1, 0], matice2[2, 0] ... vs, hiçbir şey alamaz tahliye) orada hiçbir sorun önbellek özlüyor ile matice2 ya.

Bunun için önbellek satırı şöyle olacaktır (X >daha şimdi Eğer değişkenin bayt adresi X ise daha derin önbelleğe nasıl gidecek, >6) & (L - 1). Ben senin önbelleğinde hatlarının toplam sayıdır. Hep 2 Güç. Altı 2^6 == 64 bayt önbellek satırı, standart boyutta olmasından kaynaklanır.

Şimdi bu ne anlama geliyor? Eğer X ve Y adresi Adres olursa iyi anlamına gelir ve (X ^< . 6) - (Y ^< . 6) L (2 bazı büyük güç yani) ile bölünebilen, aynı cacheline depolanacak.

2048 arasındaki fark nedir senin soruna geri dönmüş ve 2049,

2048 zaman boyutu vardır:

sen &matice2[x, k)] ve &matice2[k y] fark (&matice2[x, k)] >eğer >6) - (&matice2[k y] ^< . 6) 2048 * 4 (Sal boyut) ile bölünebilir. 2 büyük bir güç.

Böylece boyutuna bağlı olarak sizin L2 edecek çok şey var önbellek satırı çatışmalar, ve sadece küçük bir bölümünü kullanmak sizin L2 saklamak için bir sütun, böylece alışkanlık aslında olması mümkün deposu tam sütun önbelleği, böylece sen-ecek almak kötü performans.

Boyutu 2049, o zaman fark daha az çatışmalar olacak böylece 2 güç değildir 2049 * 4 ve sütun güvenle önbellek içine sığar.

Şimdi yapabileceğiniz birkaç şey vardır, bu teoriyi test etmek için:

Bu matice2 [, 4096 razmor] gibi dizi matice2 dizinizi tahsis ve razmor = 1024, 1025 veya herhangi bir boyut ile çalıştırın ve önce ne karşılaştırıldığında çok kötü performans görmelisiniz. Bu zorla birbirleriyle çatışma için tüm sütunları hizalamak çünkü.

Sonra matice2 [, 4097 razmor] deneyin ve herhangi bir boyut ile çalıştırın ve çok daha iyi performans görmelisiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS

    ASUS

    22 EKİM 2005
  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • The Verge

    The Verge

    8 AĞUSTOS 2006