Hi, On Sunday, November 9, 2014 5:34:46 AM UTC+1, Erik Schnetter wrote: > > How large is length(x)? > in the example on the gist, size(x) = 10000, 60. So the sumsq() needs to be performed over 60 values, admittedly not a lot.
What are the overheads? Is the external library call, or does BLAS.dot() need to do a whole load of admin to figure out the correct approach? > What BLAS implementation is providing sum_sq? > > -erik > > On Sat, Nov 8, 2014 at 6:22 PM, David van Leeuwen > <[email protected] <javascript:>> wrote: > > No, the problem is not optimizing the inner loop---I understand that the > > @inbounds works a bit faster (which is probably why sumsq() works faster > > outside the loop). > > > > The problem is that `sumsq()` is about 10 times as slow as `mydot()` > when it > > is used in the inner loop. I don't understand why. They should be > similar > > in performance, but maybe there is some overhead in calling a function > from > > a module that completely kille the inner loop, which is not there when I > use > > (my own) function living in the same global name space. > > > > ---david > > > > On Saturday, November 8, 2014 11:45:07 AM UTC+1, Simon Danisch wrote: > >> > >> I used the advice from: > >> http://julia.readthedocs.org/en/latest/manual/performance-tips/ > >> Which means mydot looks like this now: > >> function mydot{T}(x::Array{T}) > >> s = zero(T) > >> @simd for i =1:length(x) > >> @inbounds s += x[i]*x[i] > >> end > >> s > >> end > >> > >> This leads to the same timing on my machine. > >> Is that what you're looking for? > >> > >> Am Samstag, 8. November 2014 10:20:39 UTC+1 schrieb David van Leeuwen: > >>> > >>> Hello, > >>> > >>> I had a lot of fun optimizing some inner loops in the couple of few > days. > >>> Generally, I was able to churn out a last little bit of performance by > >>> writing out broadcast!()s that appeared in the inner loop. > >>> > >>> However, when I tried to replace a final inner-loop vector operation > by a > >>> BLAS equivalent, or one from NumericExtensions, execution time shot up > >>> enormously. I don't understand why this is, I have the feeling it > might be > >>> related to cache-behaviour in the CPU and/or difference in inlining. > >>> > >>> I've tried to isolate the behaviour in this gist, where I have kept > the > >>> structure and dimensioning of the original task in place but replaced > some > >>> operations by rand!(). In the gist, the main focus is the difference > >>> between mydot()---which is just an implementation of sumsq()---and the > >>> NumericExtensions version sumsq(). > >>> > >>> Plain usage of sumsq() is a bit faster than mydot(), but inside the > inner > >>> loop it is about 10x as slow on my machine (a mac laptop). Does > anyone know > >>> what might be going on here? > >>> > >>> Thanks, > >>> > >>> ---david > > > > -- > Erik Schnetter <[email protected] <javascript:>> > http://www.perimeterinstitute.ca/personal/eschnetter/ >
