Подтвердить что ты не робот

Предотвратить открытие MATLAB пула

Когда у меня установлен пакет параллельных вычислений и я использую parfor в моем коде, MATLAB запускает пул автоматически после достижения цикла parfor. Однако это затрудняет отладку, поэтому я хочу, чтобы MATLAB не открывал пул в определенных ситуациях. Итак, как я могу сказать MATLAB, чтобы не открывать пул? Очевидно, я мог бы пройти через свой код и удалить все циклы parfor и заменить их на обычные циклы for, но это утомительно, и я могу забыть отменить мои изменения.

edit: Чтобы указать, я бы идеально хотел, чтобы цикл parfor вел себя точно так же, как при установке элемента управления или переменной или чего-то еще. То есть, я должен, например, также иметь возможность размещать точки останова в for-loop.

4b9b3361

Ответ 1

В разделе "Параллельные" параллельные параллельные настройки вы можете снять флажок "Автоматически создавать параллельный пул (если он еще не существует) при выполнении параллельных ключевых слов". Это заставляет все циклы parfor вести себя как обычный цикл for.

Я вернусь к вам, если я выясню способ сделать это в коде, а не использовать этот флажок.

Update оказывается, что действительно можно изменить настройки с помощью кода, хотя я бы не рекомендовал этого, так как это связано с изменением файла настроек MATLAB. Это взято из недокументированного блога MATLAB от Яира Альтмана.

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

где вам нужно изменить переключатель AutoCreate на 0.

В качестве альтернативы я бы предложил обернуть все внутри parfor в функции, тем самым позвонив

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

Теперь измените вашу функцию script/, чтобы включить Parallel:

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

Вы можете отредактировать и отладить сам function и установить свой переключатель поверх вашей программы для выполнения параллельно или последовательно.

Ответ 2

Как и обычный синтаксис

parfor i = 1:10

вы также можете использовать

parfor (i = 1:10, N)

где N - максимальное количество рабочих, которые будут использоваться в цикле. N может быть переменной, заданной другими частями кода, поэтому вы можете эффективно включить и выключить parallelism, установив переменную N в 1 или 0.


Изменить: чтобы быть ясным, это контролирует только число рабочих, на которых выполняется код (и если N равно нулю, пул вообще запущен). Если пул не существует, код будет выполняться на клиенте. Тем не менее, код остается циклом parfor, который не имеет ту же семантику, что и цикл for - существуют ограничения на код цикла для циклов parfor, которые не существуют для for, и нет гарантии того порядка, в котором выполняются итерации цикла.

Когда вы используете parfor, вы делаете больше, чем просто "ускорите это, пожалуйста". Вы говорите MATLAB: "Я могу гарантировать вам, что итерации этого цикла независимы и могут выполняться в любом порядке, так что вы будете в порядке, если попытаетесь распараллелить его". Поскольку вы гарантировали, что MATLAB может ускорить работу, используя другую семантику, чем это сделало бы для цикла for.

Единственный способ полностью получить поведение цикла for - использовать for, и если вам нужно переключаться назад и вперед для целей отладки, вам нужно будет прокомментировать и раскомментировать for/parfor ( или, возможно, использовать блок if/else, переключаясь между a for и a parfor в зависимости от некоторой переменной).

Ответ 3

Я думаю, что путь здесь не отключить parfor, а скорее позволить ему вести себя как простой for.

Это должно быть возможно, установив число рабочих в 1.

parpool(1)

В зависимости от вашего кода вы можете просто сделать это один раз, прежде чем запускать код, или, возможно, вам нужно сделать это (условно) каждый раз, когда вы устанавливаете количество работников в любом месте вашего кода.