Măsurarea lățimii de bandă a memoriei principale

Vreau să măsoară lățimea de bandă a memoriei principale și, în timp ce caut metodologia, am constatat că,

  1. funcția bcopy "folosită pentru a copia octeți dintr-o sursă la destinație și apoi a măsura timpul pe care îl raportează ca lățime de bandă.
  2. Alte modalități de a face acest lucru sunt de a aloca și de a array și de a merge prin matrice (cu unele pasde) - acest lucru oferă în principiu timp pentru a citi întreaga matrice.

Am încercat să fac (1) pentru o dimensiune a datelor de 1GB și lățimea de bandă pe care am obținut este '700MB/sec' (am folosit rdtsc pentru a număra numărul de cicluri scoase pentru copie). Dar bănuiesc că acest lucru nu este corect deoarece configurația mea RAM este după cum urmează:

  1. Viteză: 1333 MHz
  2. Lățimea busului: 32bit

După Wikipedia, lățimea teoretică a benzii se calculează după cum urmează:

viteza ceasului * lățimea busului * # biți pe ciclu de ceas pe linie (2 pentru ddr 3   ram) 1333 MHz * 32 * 2 ~ = 8 GB/sec.

Deci mea este complet diferită de lățimea de bandă estimată. Ai vreo idee despre ce fac greșit?

=========

O altă întrebare este că bcopy implică citirea și scrierea. Deci, înseamnă că ar trebui să împart lățimea de bandă calculată cu două pentru a obține numai citirea sau doar lățimea de bandă de scriere? Aș dori să confirm dacă lățimea de bandă este doar inversa latenței? Vă rugăm să sugerați orice alte modalități de măsurare a lățimii de bandă.

2
Se pare că ați uitat importanța cache-ului pe mașinile curente. Și cum vă definiți lățimea de bandă a memoriei? Din punctul de vedere al unui programator, este în esență ceea ce primește memcpy. De asemenea, probabil că aveți alte procese care rulează pe mașina dvs. (astfel încât comutatoarele de context suplimentare, etc.). Nu înțeleg ce vreți să măsurați exact!
adăugat autor Basile Starynkevitch, sursa
Comentariul lui Basile se îndreaptă spre inima problemei ... PC-urile moderne pentru consumatori sunt fiare feroce de complicate și performanța pe care o vedeți depinde în mod intim de ceea ce faceți. Există nivele multiple de cache; predicție ramură, conducte speculative de execuție în CPU; întrerupe; alte procese; Periferice DMA care doresc să folosească magistralele (multiple!); etc ... această întrebare ar fi făcut mult mai mult sens pe Apple meu] [+.
adăugat autor dmckee, sursa

1 răspunsuri

Nu pot comenta cu privire la eficacitatea bcopy, dar abordarea cea mai directă este cea de-a doua metodă pe care ați spus-o (cu un pas de 1). În plus, sunteți biți confuzi cu octeți în ecuația de lățime de bandă a memoriei. 32 biți = 4 biți. Calculatoarele moderne folosesc autobuze de memorie de 64 biți. Deci, rata de transfer efectivă (presupunând tehnologie DDR3)

1333Mhz * 64bit/(8bits/byte) = 10666MB/s (de asemenea clasificat ca PC3-10666)

1333Mhz are deja 2 transfer/ceas.

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

În ceea ce privește rezultatele dvs., încercați din nou cu accesul la matrice. Malloc 1GB și traversați întregul lucru. Puteți să sintetiți fiecare element al matricei și să îl imprimați, astfel încât compilatorul să nu creadă că este cod mort.

Ceva de genul:

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
adăugat