# Can you do this calculation any faster?

2 views (last 30 days)
Henrik on 15 Oct 2014
Commented: Sean de Wolski on 22 Oct 2014
Hi there
I am trying to optimize some code, an example is given below. In my code, v_ustar etc are calculated elsewhere, and depend on q. This piece of code needs to run in a quite large loop (larger than the 1:1000 given as example here), and I don't think vectorization of the entire loops is possible due to RAM issues. N is typically 16, but can be larger as well.
I use Ubuntu and MATLAB R2014a (I will probably upgrade to R2014b soon)
N=16;
for q=1:1000
%generate some random test data
v_ustar=rand(2*N,N,N);
vstar_u=rand(2*N,N,N);
u_ustar=rand(2*N,N,N);
vstar_v=rand(2*N,N,N);
F=...
repmat(reshape(v_ustar,[2*N 1 N N]),[1 2*N 1 1]).*...
repmat(reshape(conj(vstar_u), [1 2*N N N]),[2*N 1 1 1])-...
repmat(reshape(u_ustar,[2*N 1 N N]),[1 2*N 1 1]).*...
repmat(reshape(conj(vstar_v), [1 2*N N N]),[2*N 1 1 1]);
F=reshape(F,4*N^2,[]).';
end
Henrik on 15 Oct 2014
Thanks, this seems to give quite an increase in performance! If you post this as an answer I will accept it (I don't think comments can be accepted).

Sean de Wolski on 15 Oct 2014
Edited: Sean de Wolski on 15 Oct 2014
Another (small) improvement you can make here is to pull some of the static computations out of the loop. For example
[2*N 1 N N]
Doesn't change at all so it's being recomputed 1000x. Instead, create a variable out of it outside of the loop and then reference this variable everywhere inside it.
What do you actually end up doing with F after the loop?
I also wouldn't be surprised if splitting the F calculation into a few separate lines might help the JIT accelerator.
##### 2 CommentsShowHide 1 older comment
Sean de Wolski on 22 Oct 2014
When you have a really long line of code like this:
F=...
repmat(reshape(v_ustar,[2*N 1 N N]),[1 2*N 1 1]).*...
repmat(reshape(conj(vstar_u), [1 2*N N N]),[2*N 1 1 1])-...
repmat(reshape(u_ustar,[2*N 1 N N]),[1 2*N 1 1]).*...
repmat(reshape(conj(vstar_v), [1 2*N N N]),[2*N 1 1 1]);
F=reshape(F,4*N^2,[]).';
The JIT might not do as good a job optimizing it. If you break each piece, i.e. each line of repmat, into its own variable and then multiply the four variables, it might do a better job optimizing each piece.