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?
- AReden is dat er veel wordt gerekend. Oplossing is floating point door integers vervangen
- BReden is dat het lezen verspreid verloopt. Oplossing is alleen de schrijfkant aaneengesloten maken
- 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.