Ana hafıza bant genişliği ölçümü

Ana hafıza bant genişliğini ölçmek istiyorum ve metodoloji ararken bunu buldum,

  1. birçoğu bir kaynaktan hedefe bayt kopyalamak ve sonra bant genişliği olarak bildirdikleri süreyi ölçmek için ' bcopy ' işlevini kullandı.
  2. Bunu yapmanın diğer yolları, diziyi ayırmak ve dizmek ve dizinde dolaşmaktır (bazı adımlarla) - bu temelde dizinin tamamını okumak için zaman verir.

1GB veri boyutu için (1) yapmaya çalıştım ve elde ettiğim bant genişliği '700MB/sn' (kopya için geçen döngü sayısını saymak için rdtsc kullandım). Ancak RAM yapılandırmamın aşağıdaki gibi olduğu için bunun doğru olmadığından şüpheleniyorum:

  1. Hız: 1333 MHz
  2. Veriyolu genişliği: 32bit

Wikipedia'ya göre teorik bant genişliği şöyle hesaplanır:

saat hızı * veriyolu genişliği * # hat başına saat döngüsü başına # bit (ddr 3 için 2   ram) 1333 MHz * 32 * 2 ~ = 8 GB/sn.

Bu yüzden benimki tahmini bant genişliğinden tamamen farklı. Neyi yanlış yapıyorum hakkında fikrin var mı?

=========

Diğer bir soru ise, bcopy hem oku hem de yazmayı içerir. Öyleyse hesaplanan bant genişliğini sadece okuma veya yalnızca yazma bant genişliğini almak için ikiye bölmem gerektiği anlamına mı geliyor? Bant genişliğinin sadece gecikmenin tersi olup olmadığını onaylamak isterim. Lütfen bant genişliğini ölçmenin başka yollarını da önerin.

2
Mevcut makinelerde önbelleğe almanın önemini unutmuş gibisiniz. Peki hafıza bant genişliğini nasıl tanımlarsın? Bir programcının bakış açısından, esasen memcpy'nin aldığı şeydir. Ayrıca, makinenizde çalışan başka işlemleriniz de vardır (bu nedenle ekstra bağlam anahtarları vb.). Tam olarak ne ölçmek istediğini anlamıyorum !!
katma yazar Basile Starynkevitch, kaynak
Basile'nin yorumu konunun kalbine gidiyor ... modern tüketici bilgisayarları oldukça karmaşık canavarlardır ve gördüğünüz performans yakından yaptıklarınıza bağlıdır. Birden fazla önbellek seviyesi vardır; Şube öngörücü, spekülatif CPU'daki boru hatlarını yürüten; keser; diğer işlemler; (Çoklu!) Otobüsleri kullanmak isteyen DMA çevre birimleri; vb ... Bu soru Apple'ımda çok daha anlamlı olurdu] [+.
katma yazar dmckee, kaynak

1 cevap

Bcopy'nın etkinliği hakkında yorum yapamam, ancak en basit yaklaşım belirttiğiniz ikinci yöntemdir (1 adımla). Ek olarak, bellek bant genişliği denkleminizde bitleri bayt ile karıştırıyorsunuz. 32 bit = 4 bayt. Modern bilgisayarlar 64 bit genişliğinde bellek otobüsleri kullanır. Yani etkili transfer hızınız (DDR3 teknolojisini varsayarsak)

1333MHz * 64bit/(8 bit/byte) = 10666MB/s (PC3-10666 olarak da sınıflandırılır)

1333MHz'de zaten 2 faktörü/saati var.

Check out the wiki page for more info: http://en.wikipedia.org/wiki/DDR3_SDRAM

Sonuçlarınızla ilgili olarak, dizi erişimini tekrar deneyin. Malloc 1GB ve her şeyi çapraz. Dizinin her bir elemanını toplayabilir ve yazdırabilirsiniz, böylece derleyiciniz bunun ölü kod olduğunu düşünmez.

Bunun gibi bir şey:

double time;
int size = 1024*1024*1024;
int sum;
*char *array = (char*)malloc(size);
//start timer here
for(int i=0; i < size; i++)
  sum += array[i];
//end timer
printf("time taken: %f \tsum is %d\n", time, sum);
0
katma