help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Norm problem in Octave 3.4.0 (Mac?)


From: Moo
Subject: Re: Norm problem in Octave 3.4.0 (Mac?)
Date: Thu, 31 Mar 2011 18:01:02 -0600

On Thu, Mar 31, 2011 at 8:39 AM, Vic Norton <address@hidden> wrote:
I have compared the speed of the instructions "norm(x)" and
"sqrt(sum(x .* x))" on Thomas Treichl's Octave.app (3.2.3) and Julien
Salort's Octave.app (3.4.0). These versions of octave can be found at
http://sourceforge.net/projects/octave/files/Octave%20MacOSX%20Binary/
2011-03-27
binary of Octave 3.4.0 (2011-03-27)
2009-10-03 binary of Octave 3.2.3 (2010-11-23)

Here is a summary of the results I observed.
1. Octave 3.4.0 is a bit slower than Octave 3.2.3 on sqrt(sum(x .* x)).
2. On Octave 3.2.3, norm(x) is a bit faster than sqrt(sum(x .* x)). This
  is as it should be since NRM2 is a BLAS.
3. On Octave 3.4.0, sqrt(sum(x .* x)) is four times as fast as norm(x).
  This is not as it should be for the reason cited in 2.
4. norm(x) on Octave 3.2.3 is nine times as fast as norm(x) on Octave
  3.4.0.

My test script and my results appear below.

Regards,

Vic

The test script. The two different shebang lines placed at the top
test the two different versions of octave.
  #!/usr/local/bin/octave323

  # norm2test.m

  #!/usr/local/bin/octave323
  #!/usr/local/bin/octave340

  ntests = 20; n = 1e6; x = rand(n, 1);
  test1 = zeros(ntests, 1); test2 = zeros(ntests, 1);

  for i = 1 : ntests
    tic;
    norm(x);
    test1(i) = toc;
  endfor
  for i = 1 : ntests
    tic;
    sqrt(sum(x .* x));
    test2(i) = toc;
  endfor

  printf ("norm2 speed test - octave %s\n", version);
  printf ("%40s\n","ellapsed times");
  printf ("%30s%10s\n", "mean", "stdv");
  printf ("%-20s", "norm(x)");
  printf ("%10.2e", mean(test1));
  printf ("%10.2e", std(test1));
  printf ("\n");
  printf ("%-20s", "sqrt(sum(x .* x))");
  printf ("%10.2e", mean(test2));
  printf ("%10.2e", std(test2));
  printf ("\n");


The output.
---
GNU Octave, version 3.2.3
Copyright (C) 2009 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "i386-apple-darwin8.11.1".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Report bugs to <address@hidden> (but first, please read
http://www.octave.org/bugs.html to learn how to write a helpful report).

For information about changes from previous versions, type `news'.

norm2 speed test - octave 3.2.3
                       ellapsed times
                       mean      stdv
norm(x)               7.06e-03  2.62e-05
sqrt(sum(x .* x))     1.06e-02  1.98e-03
---


I copied your test code and ran it in Octave 3.4.0, compiled myself with all the libraries, running in Ubuntu 10.04.  Here's my numbers.  I didn't get an order of magnitude difference like you did, but it was roughly 3x faster for vector size n=1e6 (these are my typical results):

                          ellapsed times
                          mean      stdv
norm(x)               7.89e-04  2.82e-05
sqrt(sum(x .* x))     2.66e-04  4.30e-05

I noticed you didn't change the value for n in your tests.  Just out of curiosity I upped it to n=1e7; my reults were:

                          ellapsed times
                          mean      stdv
norm(x)               7.81e-02  1.95e-04
sqrt(sum(x .* x))     8.11e-02  3.94e-04

For n=1e8:

                          ellapsed times
                          mean      stdv
norm(x)               7.89e-01  1.30e-02
sqrt(sum(x .* x))     8.56e-01  2.29e-02


Another curious thing happens for me when you pause slightly between iterations:

  for i = 1 : ntests
    tic;
    norm(x);
    test1(i) = toc;
    pause(0.01)
  endfor
  for i = 1 : ntests
    tic;
    sqrt(sum(x.*x));
    test2(i) = toc;
    pause(0.01)
  endfor

For n=1e6 the results ended up noticeably different:

                          ellapsed times
                          mean      stdv
norm(x)               1.28e-02  3.68e-03
sqrt(sum(x .* x))     9.49e-03  2.79e-03

I'm no expert in the inner workings of Octave, but maybe this can help draw some conclusions? Can you try putting pauses in at the end of your loops like I did and see the results?

reply via email to

[Prev in Thread] Current Thread [Next in Thread]