Warum ist das transponieren einer matrix von 512x512 viel langsamer als transponieren einer matrix von 513x513?

Nach der Durchführung einiger Experimente, die auf quadratische Matrizen in verschiedenen Größen, ein Muster kam. Immer, transponieren einer matrix der Größe 2^n langsamer ist als die Umsetzung einer Größe 2^n+1. Für kleine Werte von n, der Unterschied ist nicht bedeutend.

Große Unterschiede auftreten, jedoch über einen Wert von 512. (zumindest für mich)

Disclaimer: ich kenne die Funktion tatsächlich nicht transponieren der matrix wegen der doppelten vertauschen von Elementen, aber es macht keinen Unterschied.

Folgt der code:

#define SAMPLES 1000
#define MATSIZE 512

#include <time.h>
#include <iostream>
int mat[MATSIZE][MATSIZE];

void transpose()
{
   for ( int i = 0 ; i < MATSIZE ; i++ )
   for ( int j = 0 ; j < MATSIZE ; j++ )
   {
       int aux = mat[i][j];
       mat[i][j] = mat[j][i];
       mat[j][i] = aux;
   }
}

int main()
{
   //initialize matrix
   for ( int i = 0 ; i < MATSIZE ; i++ )
   for ( int j = 0 ; j < MATSIZE ; j++ )
       mat[i][j] = i+j;

   int t = clock();
   for ( int i = 0 ; i < SAMPLES ; i++ )
       transpose();
   int elapsed = clock() - t;

   std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES;
}

Ändern MATSIZE können uns ändern die Größe (duh!). Ich veröffentlichte zwei Versionen auf ideone:

In meiner Umgebung (MSVS 2010 -, full-Optimierungen), der Unterschied ist ähnlich :

  • Größe 512 - Durchschnitt 2.19 ms
  • Größe 513 - Durchschnitt 0.57 ms

Warum ist das passiert?

  • Dein code sieht cache-unfreundlich zu mir.
  • und es ist.
  • Es ist so ziemlich das gleiche Problem wie in dieser Frage: stackoverflow.com/questions/7905760/...
  • Pflege zu elavorate, @CodesInChaos? (Oder sonst jemand.)
  • Wie zu Lesen, die akzeptierte Antwort?
  • Ja, ich sah, was Sie meinte. Ich lese in Kommentaren zuerst.
  • Ich habe versucht den code mit gcc 4.6.1 in ubuntu 11.10 mit der Standard-Optimierung(O0-Niveau), 513*513 matrix ist langsamer als die 512*512 ein,(2.62 ms für die Größe 513, und 2,45 ms für Größe 512), mit Optimierung-O1 oder oben, Zeit für 512 2.08 ms, und für die 513 ist 0,56 ms. cpu: Intel(R) Core(TM) i3 530 2.93 GHz. kann das jemand erklären?
  • Es ist ein bisschen sinnlos zu Messen, alles ohne Optimierungen. Mit Optimierungen deaktiviert ist, wird der generierte code wird übersät sein mit den nebensächlichen Müll, verstecken sich andere Engpässe. (z.B. Speicher)

Schreibe einen Kommentar