After conducting some experiments on square matrices of different sizes, a pattern came up. Invariably, transposing a matrix of size 2^n
is slower than transposing one of size 2^n+1
. For small values of n
, the difference is not major.
Big differences occur however over a value of 512. (at least for me)
Disclaimer: I know the function doesn’t actually transpose the matrix because of the double swap of elements, but it makes no difference.
Follows the 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;
}
Changing MATSIZE
lets us alter the size (duh!). I posted two versions on ideone:
- size 512 – average 2.46 ms – http://ideone.com/1PV7m
- size 513 – average 0.75 ms – http://ideone.com/NShpo
In my environment (MSVS 2010, full optimizations), the difference is similar :
- size 512 – average 2.19 ms
- size 513 – average 0.57 ms
Why is this happening?