cplex от MATLAB с использованием parfor - PullRequest
0 голосов
/ 06 февраля 2020

У меня довольно масштабная проблема оптимизации, хотя сама проблема довольно проста. Это просто квадратичная c + линейная задача с линейными ограничениями. Так что проблема решаема с помощью cplexqp. Масштаб проблемы составляет около 1300 переменных, но мне нужно решить ~ 200 независимых задач.

Если я просто наберу l oop более 200 раз и вызову cplexqp как обычно, то для решения всех потребуется около 16 минут. проблемы. Я подумал об использовании параллельных вычислений, поэтому я изменил l oop на parfor, и теперь это занимает около 14 минут. Я бы подумал, что мы получим гораздо больший коэффициент ускорения, учитывая, что у нас 12 ядер и 12 рабочих.

Я убедился, что параллельный рабочий уже инициализирован (поэтому MATLAB не нужно тратить время на их инициализацию) , Я также проверил, что все 12 рабочих потоков были активны в диспетчере задач, и все они использовали нетривиальные объемы ЦП каждый.

Мой вопрос: как вы думаете, cplexqp имеет механизм блокировки, как он может ' не может быть вызвано с более чем одной проблемой в данный момент (из разных потоков?) Что если у меня разные процессы MATLAB? (Например, я могу сохранить входные данные в файл и запустить несколько сеансов MATLAB для использования файла, и каждый сеанс будет знать, какой индекс проблем нужно решить).

16 минут - это неплохо, но мы можем Мне нужно делать это несколько раз в день (с потенциально разными входами), поэтому мне было интересно, сможем ли мы ускорить процесс еще больше.

TIA

1 Ответ

1 голос
/ 07 февраля 2020

Проблема в том, что по умолчанию CPLEX будет использовать все ядра на вашем компьютере для решения одной проблемы. Таким образом, если вы пытаетесь решить несколько проблем параллельно, вы сильно переподписываете процессоры. Это может привести к общему замедлению.

Поэтому вы должны тщательно выбрать, сколько моделей вы решаете параллельно, и сколько ядер вы разрешаете для каждого решения. Если вы используете parfor, то вам следует использовать параметр Cplex.Param.threads , чтобы ограничить число ядер для одного решения или, альтернативно, выбрать симплексный алгоритм для решения ваших QP.

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

...