Geheugenhiërarchie en prestaties

Waarom treden bij het transponeren van een grote matrix (b[j][i] = a[i][j]) vaak veel cachemisses op, en welke combinatie met een gangbare oplossing is juist?

  1. AReden is dat er veel wordt gerekend. Oplossing is floating point door integers vervangen
  2. BReden is dat het lezen verspreid verloopt. Oplossing is alleen de schrijfkant aaneengesloten maken
  3. CReden is dat lezen of schrijven in kolomrichting plaatsvindt. Oplossing is transponeren per blok
Antwoord en toelichting tonen

Antwoord: C. Reden is dat lezen of schrijven in kolomrichting plaatsvindt. Oplossing is transponeren per blok

Bij transponeren geldt dat als a rijgewijs wordt gelezen, b kolomgewijs wordt geschreven, en omgekeerd; een van beide is dus altijd een verspreide toegang. Als de matrix in kleine blokken wordt verdeeld die in de cache passen en binnen een blok wordt getransponeerd, kunnen ingelezen regels volledig worden benut voordat verder wordt gegaan, waardoor het aantal misses sterk afneemt. Alleen de schrijfkant aaneengesloten maken laat het lezen verspreid, en lost dus de kern niet op. Het is ook geen kwestie van rekenwerk.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Geheugenhiërarchie en prestaties

  1. Welke eigenschap geldt in de geheugenhiërarchie van een gangbare computer voor hogere niveaus (dichter bij de CPU)?
  2. Waarom moeten cacheprestaties niet alleen op missratio, maar ook op gemiddelde geheugentoegangstijd worden vergeleken?
  3. Wanneer twee programma's afwisselend op dezelfde core worden uitgevoerd, kunnen ze trager zijn dan wanneer elk afzonderlijk draait. Welke verklaring is vanuit de cache bezien het meest passend?
  4. Welk voorbeeld illustreert temporele lokaliteit het best?
  5. 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?

Vergelijkingen bij dit onderwerp