Использование командного файла для открытия нескольких экземпляров файлов MATLAB, которые просто нагружают процессор на 100% - PullRequest
0 голосов
/ 09 декабря 2018

Итак, по сути, это вопрос о том, как более эффективно использовать ваш многоядерный процессор.

У меня есть сценарий оптимизации (написанный на matlab), который будет вызывать 20 экземпляров matlab для оценки функций.Результаты будут сохранены в виде файла .mat, а затем сценарий оптимизации получит эти результаты и выполнит какую-то другую работу.Сначала я вызываю 20 экземпляров matlab, используя встроенную функцию matlab «system» для вызова командного файла, который затем открывает 20 экземпляров matlab для оценки функций.

Код, который я использую в командном файле:

(   start matlab -nosplash -nodesktop -minimize -r "Worker01;exit"
ping -n 5 127.0.0.1 >nul    

start matlab -nosplash -nodesktop -minimize -r "Worker02;exit"
ping -n 5 127.0.0.1 >nul

...... % repeat the pattern 

    start matlab -nosplash -nodesktop -minimize -r "Worker19;exit"
ping -n 5 127.0.0.1 >nul 

start matlab -nosplash -nodesktop -minimize -r "Worker20;exit"
ping -n 5 127.0.0.1 >nul )  | set /P "="

Все команды «Пуск» включены в скобки, следующие за командой

"| set/P"="" 

, потому что яхочу, чтобы мой сценарий оптимизации продолжился после всех 20 оценок.Я изучил эту технику из моего другого вопроса, но я не совсем понимаю, что она на самом деле делает.Если вы также можете объяснить это, я был бы очень признателен.

В любом случае, это способ достижения параллельных вычислений в Matlab 2007, который не имеет оригинальной функции параллельных вычислений.Однако я обнаружил, что это неэффективный способ запуска 20 экземпляров одновременно, поскольку после открытия примерно 12 экземпляров загрузка моего процессора (сервера xeon, доступно 14 ядер) достигает 100%.Моя теория заключается в том, что открытие большего количества экземпляров, чем может обработать процессор, сделает процессор менее эффективным.Поэтому я думаю, что лучшая стратегия будет выглядеть следующим образом:

  1. запускать первые 12 экземпляров;
  2. запускать следующий (ые) список (ы) в списке после завершения любого текущего запущенного экземпляра.(Несмотря на то, что рабочие открываются примерно в одно и то же время и выполняют одну и ту же работу, они все равно имеют тенденцию заканчивать работу в разное время.)

Это обеспечит полное использование вычислительной мощности (использование процессора всегда100%) все время без перегрузки процессора.

Как мне достичь этой стратегии в командном файле?Если пакетный файл трудно достичь этого, может PowerS сделать это?

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

Спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Я думаю, что это в PowerShell ...

<#
keep a queue of all jobs to be executed

keep a list of running jobs

number of running jobs cannot exceed the throttle value
#>

$throttle = 12

$queue = New-Object System.Collections.Queue
$running = New-Object System.Collections.Generic.List[System.Diagnostics.Process]

# generate x number of queue commands
# runs from 1 to x
1..20 | ForEach-Object {
    # the variable $_ contains the current number

    $program = "matlab"
    $args = "-nosplash -nodesktop -minimize -r `"Worker$_;exit`""

    # args will be
    # -nosplash -nodesktop -minimize -r "Worker1;exit"
    # -nosplash -nodesktop -minimize -r "Worker2;exit"
    # etc

    # save it
    $queue.Enqueue(@($program, $args))
}

# begin executing jobs
while($queue.Count) {
    # remove jobs that are done
    $running.Where({ $_.HasExited }) |
        ForEach-Object { [void]$running.Remove($_) }

    if($running.Count -ge $throttle) {
        # busy, so wait
        Start-Sleep -Milliseconds 50
    }
    else {
        # ready for new job
        $cmd = $queue.Dequeue()
        [void]$running.Add([System.Diagnostics.Process]::Start($cmd[0], $cmd[1]))
    }
}

# wait for rest to be done
while($running.Where({ !$_.HasExited }).Count) {
    Start-Sleep -Milliseconds 50
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...