Notes on Mathematica 7 : Parallelize on Ubuntu

December 8th, 2008 | Categories: math software, mathematica | Tags:

Mathematica 7 includes some very nice support for parallel computing and one of the easiest commands to use is Parallelize.  If you have a multi-core computer (and most of them are these days) then, in some cases, you can get a speedup of a factor of 2 or more simply by wrapping your code with the Parallelize command.  I’ll stress that it’s not always this easy but, when it is, it’s very nice.

To start getting my head around the new command I looked at the following small piece of code which is included in the Mathematica 7 documentation.

data = Table[ PrimeQ[n! + 1], {n, 400, 550}];

This code calculates numbers of the form n!+1 for n between 400 and 550 and tests to see if they are prime or not. Let’s see how long it takes on my dual core 2Ghz Dell XPS M1330:

data = Table[ PrimeQ[n! + 1], {n, 400, 550}]; // AbsoluteTiming

Out[1]={14.092809, Null}

We see from the above that it took just over 14 seconds before we apply any parallelism. Let’s see how much improvement we get by using the Parallelize command:

data = Parallelize[Table[ PrimeQ[n! + 1], {n, 400, 550}]]; // AbsoluteTiming
Out[2]= {21.124572, Null}

Oh dear, something has gone drastically wrong! The parallel calculation is taking 7 seconds (or 50%) longer than the serial calculation. Before writing a bug report to Wolfram, I thought I would dig around a little to try and work out what was going on.

First things first, let’s take a look at how hard Mathematica is pushing the processor in both cases.  I can add a little CPU monitoring applet to my GNOME panel by right clicking on it and selecting add to Panel.  From the resulting list I choose CPU Frequency Scaling Monitor.

When I initially did this, the applet informed me that my CPU was running at 800 Mhz – way below its maximum speed of 2Ghz.  When I click on this applet I get a range of settings that could be applied to my CPU such as On demand, Performance and Powersave along with specific speed settings from 800Mhz to 2 Ghz. The one selected was on demand.

Turning back to Mathematica I run the sequential code again

data = Table[ PrimeQ[n! + 1], {n, 400, 550}]; // AbsoluteTiming
Out[3]={14.117028, Null}

According to the CPU Monitor, my computer was running at 2Ghz (its top speed) during the entire calculation. However, when I ran the Parallelize version, the processor speed remained at 800Mhz the whole time. So, the calculation may well have been running in parallel but each of the 2 cores was only running at 40% of top speed.  The problem seems to lie with Mathematica’s interaction with the on demand setting of the processor manager.

By clicking on the GNOME CPU monitor, I can fix the processor to run at 2Ghz at all times – no fancy processor management here – just the fastest speed my computer can manage.  Let’s see what the results of the two versions of the code are when I do this.

data = Table[ PrimeQ[n! + 1], {n, 400, 550}]; // AbsoluteTiming

Out[4]={14.062377, Null}

data = Parallelize[Table[ PrimeQ[n! + 1], {n, 400, 550}]]; // AbsoluteTiming

Out[5]={7.635570, Null}

That’s more like it! The parallel version is almost twice as fast as the serial version – just as we would expect on a dual core system. So, the moral of the story is to ensure that you don’t have your system set to modify it’s processor speed on demand when trying to make use of the new Parallel features of Mathematica 7.

For the record I am running GNOME 2.24.1 on Ubuntu 8.10 with Mathematica 7.

  1. Gustavo
    December 9th, 2008 at 02:41
    Reply | Quote | #1

    I made your example in my Windows Vista machine
    I did your example in my Vista machine:

    In[1]:= data = Table[PrimeQ[n! + 1], {n, 400, 550}]; // AbsoluteTiming

    Out[1]= {15.6770000, Null}

    In[3]:= data =
    Parallelize[Table[PrimeQ[n! + 1], {n, 400, 550}]]; // AbsoluteTiming

    Out[3]= {10.7520000, Null}

  2. Spitz
    December 12th, 2008 at 17:02
    Reply | Quote | #2

    In[44]:= data = Table[PrimeQ[n! + 1], {n, 400, 550}]; // AbsoluteTiming
    data = Parallelize[Table[PrimeQ[n! + 1], {n, 400, 550}]]; // AbsoluteTiming

    Out[44]= {4.169463, Null}
    Out[45]= {0.642973, Null}

    On Mac Pro Early 2008 (8 core 2.8GHz) and Mathematica 7

  3. Mike Croucher
    December 12th, 2008 at 18:12
    Reply | Quote | #3

    Hi Spitz

    That’s awesome! I have an 8 core Mac in the office but haven’t gotten around to trying Mathematica 7 on it yet – looks like it will be well worth my while!

    Best Wishes,
    Mike

  4. Peter
    March 1st, 2009 at 00:10
    Reply | Quote | #4

    Try unchecking the low priority box. See http://somuchtodosolittletime.tumblr.com/

  5. GHAZAL
    May 11th, 2009 at 07:51
    Reply | Quote | #5

    i want to know how to write Brillouin zones(numeric solution)in mathematica7