Search code examples
matlabparallel-processingparfor

Prevent MATLAB from opening pool


When I have the parallel computing toolbox installed and use parfor in my code, MATLAB starts the pool automatically once it reaches the parfor loop. This however makes it difficult to debug at times, which is why I would like to prevent MATLAB from opening a pool in certain situations. So, how can I tell MATLAB not to open a pool? Obviously I could go through my code and remove all parfor loops and replace them with normal for loops, but this is tedious and I might forget to undo my changes.

edit: To specify, I ideally would like the parfor loop to behave exactly like a for when setting a control or variable or something. That is, I should for example also be able to place breakpoints in the for-loop.


Solution

  • Under Home->parallel->parallel preferences you can deselect the check box "Automatically create a parallel pool (if one doesn't already exist) when parallel keywords are executed." This makes all the parfor loops behave as a normal for loop.

    I'll get back to you if I figure out a way to do this in the code as opposed to using the check box.

    Update turns out it is indeed possible to change the settings through code, although I would not recommend this, as it involves changing MATLAB's preference file. This is taken from the Undocumented MATLAB blog by Yair Altman.

    ps = parallel.Settings;
    ps.Pool
    ans = 
      PoolSettings with properties:
                                AutoCreate: 1
                    RestartOnClusterChange: 1
        RestartOnPreferredNumWorkersChange: 1
                               IdleTimeout: 30
                       PreferredNumWorkers: 12
    

    where you need to change the AutoCreate switch to 0.

    As alternative I'd suggest wrapping everything inside your parfor in a function, thus calling

    parfor 1:N
        output = function(..)
    end
    

    Now modify your script/function to have a Parallel switch on top:

    if Parallel
        parfor 1:N
            output = function(..)
        end
    else
        for 1:N
            output = function(..)
        end
    end
    

    You can edit and debug the function itself and set your switch on top of your program to execute in parallel or serial.