Geheugenhiërarchie en prestaties
Een tweedimensionale C-array a[i][j] wordt doorlopen met j als binnenste lus. Dit is doorgaans sneller dan met i als binnenste lus. Wat is de reden?
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
sum += a[i][j];
- AOmdat de array rij-voor-rij is opgeslagen, worden opeenvolgende adressen achtereenvolgens gelezen en worden de cacheregels effectief benut
- BOmdat de compiler de optellingen in de lus samenvoegt en verwijdert, zodat de berekening zelf tijdens de uitvoering wordt overgeslagen
- COmdat met j als binnenste lus de TLB helemaal niet meer wordt geraadpleegd en vertaling van virtueel naar fysiek adres niet nodig is
Antwoord en toelichting tonen
Antwoord: A. Omdat de array rij-voor-rij is opgeslagen, worden opeenvolgende adressen achtereenvolgens gelezen en worden de cacheregels effectief benut
Tweedimensionale arrays in C worden rij-voor-rij (row-major) opgeslagen, zodat a[i][0], a[i][1], ... in het geheugen naast elkaar liggen. Met j als binnenste lus worden opeenvolgende adressen gelezen, zodat de rest van de cacheregel van 64 byte die bij één miss is binnengehaald direct wordt gebruikt. Met i als binnenste lus worden telkens adressen gelezen die een hele rij uit elkaar liggen; van elke regel wordt dan maar een klein deel benut voordat deze wordt verdrongen. De TLB blijft in gebruik; adresvertaling is niet overbodig geworden.