Итак, по сути, это вопрос о том, как более эффективно использовать ваш многоядерный процессор.
У меня есть сценарий оптимизации (написанный на 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%.Моя теория заключается в том, что открытие большего количества экземпляров, чем может обработать процессор, сделает процессор менее эффективным.Поэтому я думаю, что лучшая стратегия будет выглядеть следующим образом:
- запускать первые 12 экземпляров;
- запускать следующий (ые) список (ы) в списке после завершения любого текущего запущенного экземпляра.(Несмотря на то, что рабочие открываются примерно в одно и то же время и выполняют одну и ту же работу, они все равно имеют тенденцию заканчивать работу в разное время.)
Это обеспечит полное использование вычислительной мощности (использование процессора всегда100%) все время без перегрузки процессора.
Как мне достичь этой стратегии в командном файле?Если пакетный файл трудно достичь этого, может PowerS сделать это?
Пожалуйста, покажите действительный код и объясните.Я не программист, поэтому я не очень разбираюсь в кодировании.
Спасибо.