Why is sort() taking longer to resolve on multiples of 512?
2 views (last 30 days)
Show older comments
I am using the sort() funtion to sort the columns of massive matrixes. By chance, I discovered that the sort algorithm took a lot longer than expected to run when I used a matrix with 256^3 columns than when using 255^3. After some experimentation I was doumbfunded to discover that using 257^3 columns was also much faster than 256^3. By now, I was really confused, so I i did a little experiment:
for i = 1:10000
test = rand(i,100);
tstart = tic;
sort(test,2);
out(i) = toc(tstart);
end
plot(1:10000,out)
ylabel('Time elapsed/s')
xlabel('nbr of columns')
That gave me this little nice plot, which looks something like an emission spectrum:
The major peaks seem to be at multiples of 512, i.e. 512,1024,1536,2048 etc. Can anyone explain this behaviour? As the peaks are at familiar "digital"-numbers I am guessing this has something to do with the algorithm-implementation.
0 Comments
Answers (3)
Sean de Wolski
on 8 Sep 2014
Edited: per isakson
on 8 Sep 2014
I don't think sort has anything to do with the behavior you are seeing. Look at what happens if you preallocate out
out = zeros(1000,1);
for i = 1:1000
test = rand(i,100);
tstart = tic;
sort(test,2);
out(i) = toc(tstart);
end
plot(1:1000,out)
ylabel('Time elapsed/s')
xlabel('nbr of columns')
Now the out array is not growing on each iteration, you do not see spikes (just expected fluctuations from sorting random numbers).
More information here:
3 Comments
per isakson
on 8 Sep 2014
Edited: per isakson
on 8 Sep 2014
I have reproduced your result with R2013a,64bit,Win7,8GB on a five year old vanilla desktop (Processor Intel® Core™2 Quad CPU Q9400 @ 2.66GHz 2.66 GHz).
out(1,10000) = nan;
for ii = 1:10000
test = rand(ii,100);
tstart = tic;
sort(test,2);
out(ii) = toc(tstart);
end
figure
plot(1:10000,out)
ylabel('Time elapsed/s')
xlabel('nbr of columns')
ff = filtfilt( fir1( 20, 0.03), 1, out );
find( (out-ff) > 0.5*ff )/256
ans =
Columns 1 through 9
1.0000 2.0000 3.0000 3.6680 4.0000 5.0000 5.7695 6.0000 6.5078
Columns 10 through 18
7.0000 7.5000 8.0000 8.0898 9.0000 9.6680 10.0000 11.0000 12.0000
Columns 19 through 27
13.0000 14.0000 15.0000 16.0000 17.0000 18.0000 19.0000 20.0000 21.0000
Columns 28 through 36
22.0000 23.0000 24.0000 25.0000 26.0000 27.0000 28.0000 29.0000 30.0000
Columns 37 through 45
31.0000 32.0000 33.0000 34.0000 35.0000 36.0000 37.0000 38.0000 39.0000
0 Comments
José-Luis
on 8 Sep 2014
Edited: José-Luis
on 8 Sep 2014
Maybe it has something to do with data padding. If you use single precision format, then the jumps come at multiples of 1024. (Shamelessly plagiarizing Per's code):
out(1,10000) = nan;
for ii = 1:10000
test = single(rand(ii,100)); %just changed this
tstart = tic;
sort(test,2);
out(ii) = toc(tstart);
end
figure
plot(1:10000,out)
ylabel('Time elapsed/s')
xlabel('nbr of columns')
ff = filtfilt( fir1( 20, 0.03), 1, out );
find( (out-ff) > 0.5*ff )/256
EDIT
On second thought, it might have nothing to do with Matlab but with your processor's cache size. Maybe 512 bytes happens to be a multiple of some cache-level size and when you fill it completely, it provokes many cache misses and therefore a jump in decreasing performance.
To find the culprit would be difficult without knowing how sort() is implemented, and the results might be different from processor to processor.
2 Comments
See Also
Categories
Find more on Shifting and Sorting Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!