Hauptspeicherbandbreitenmessung

Ich möchte die Hauptspeicherbandbreite messen und während ich nach der Methodik suche, habe ich festgestellt,

  1. Viele benutzen die Funktion bcopy , um Bytes von einer Quelle zum Ziel zu kopieren und dann die Zeit zu messen, die sie als Bandbreite angeben.
  2. Andere Wege, dies zu tun, sind das Zuweisen und Anordnen und Durchlaufen des Arrays (mit einem gewissen Schritt) - das gibt im Grunde die Zeit, das gesamte Array zu lesen.

Ich habe versucht, (1) für Datengröße von 1 GB und die Bandbreite, die ich bekam, ist 700 MB/sec '(Ich habe rdtsc , um die Anzahl der Zyklen für die Kopie zu zählen). Aber ich vermute, dass dies nicht korrekt ist, da meine RAM-Konfiguration wie folgt ist:

  1. Geschwindigkeit: 1333 MHz
  2. Busbreite: 32bit

Laut Wikipedia berechnet sich die theoretische Bandbreite wie folgt:

Taktgeschwindigkeit * Busbreite * # Bits pro Taktzyklus pro Zeile (2 für ddr 3   RAM) 1333 MHz * 32 * 2 ~ = 8 GB/Sek.

Also meins ist völlig anders als die geschätzte Bandbreite. Irgendeine Idee von was mache ich falsch?

=========

Eine andere Frage ist, dass bcopy sowohl Lesen als auch Schreiben beinhaltet. Bedeutet das, dass ich die berechnete Bandbreite durch zwei teilen soll, um nur die Lese- oder nur die Schreibbandbreite zu erhalten? Ich möchte bestätigen, ob die Bandbreite nur die Umkehrung der Latenz ist? Bitte schlagen Sie andere Möglichkeiten vor, um die Bandbreite zu messen.

2
Sie scheinen die Bedeutung des Caching auf aktuellen Rechnern vergessen zu haben. Und wie definieren Sie Ihre Speicherbandbreite? Aus der Sicht eines Programmierers ist es im Wesentlichen was memcpy bekommt. Wahrscheinlich haben Sie auch andere Prozesse auf Ihrem Computer (so zusätzliche Kontextwechsel, etc.). Ich verstehe nicht, was Sie genau messen wollen !!
hinzugefügt der Autor Basile Starynkevitch, Quelle
Basiles Kommentar geht auf den Kern der Sache ein ... moderne Verbraucher-PCs sind wild komplizierte Tiere und die Leistung, die Sie sehen, hängt sehr davon ab, was Sie tun. Es gibt mehrere Cache-Ebenen. Verzweigungsvorhersage, spekulativ Ausführen von Pipelines in der CPU; unterbricht; andere Prozesse; DMA-Peripheriegeräte, die (mehrere!) Busse verwenden möchten; usw. ... Diese Frage hätte bei meinem Apple] [+] viel mehr Sinn ergeben.
hinzugefügt der Autor dmckee, Quelle

1 Antworten

Ich kann die Wirksamkeit von bcopy nicht kommentieren, aber der einfachste Ansatz ist die zweite Methode, die Sie angegeben haben (mit einem Schritt von 1). Außerdem verwirren Sie Bits mit Bytes in Ihrer Speicherbandbreitengleichung. 32 Bits = 4 Bytes. Moderne Computer verwenden 64 Bit breite Speicherbusse. Also Ihre effektive Übertragungsrate (unter der Annahme von DDR3-Technologie)

1333Mhz * 64Bit/(8Bits/Byte) = 10666MB/s (auch als PC3-10666 klassifiziert)

Der 1333Mhz hat bereits die 2 Übertragung/Uhr berücksichtigt.

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

Versuchen Sie es erneut mit dem Array-Zugriff. Malloc 1GB und durchquere das Ganze. Sie können jedes Element des Arrays summieren und es ausdrucken, damit Ihr Compiler es nicht für toten Code hält.

Etwas wie das:

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
hinzugefügt