Ошибка при использовании parfor в MATLAB

Я запускал программу буквально сотни раз, но недавно обнаружил, что один набор входных параметров вызывает следующую ошибку:

In DElambda at 116
  In parallel_function>make_general_channel/channel_general at 879
  In remoteParallelFunction at 31
??? Error using ==> parallel_function at 598
The session that parfor is using has shut down

Error in ==> CreateCurve at 86
parfor j=1:10

??? The client lost connection to an unknown lab.
This  might be due to network problems, or the interactive matlabpool job might have errored. This is
causing: java.lang.OutOfMemoryError: GC overhead limit exceeded

Это происходит, когда я устанавливаю минимальные и максимальные значения для пространства поиска параметров на min[0;0] и max[1,5;1,5] и устанавливаю размер населения на 10k (это дифференциальная эволюция). Я не трогал другие параметры в любой момент. Всякий раз, когда я пытаюсь запустить его с указанными выше параметрами, я получаю сообщение об ошибке выше.

Однако, когда я уменьшаю размер популяции до 1 тыс., она сходится (к неправильному ответу из-за недостаточного поиска). С другой стороны, когда я использую размер популяции 10 000 с любым другим набором параметров, которые я пробовал, он работал отлично и сходится к правильному решению?

Кажется очень странным?

В настоящее время я повторно запускаю набор параметров проблемы, используя цикл for, а не цикл parfor (и matlabpool отключен), чтобы увидеть, работает ли он лучше. К сожалению, это занимает очень много времени, поэтому я не узнаю результатов какое-то время.

В то же время может кто-нибудь объяснить, что вызывает эту ошибку? И/или подскажите, как отлаживать параллельный код?

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


person Bazman    schedule 17.04.2013    source источник
comment
Как говорит ошибка java.lang.OutOfMemoryError: GC overhead limit exceeded, это нехватка памяти. Не видя кода, трудно сказать, почему эти конкретные входные данные вызывают нехватку памяти.   -  person Oleg    schedule 17.04.2013
comment
Я рад опубликовать код, хотя он довольно большой! Но хотелось бы узнать, как отлаживать такие проблемы.   -  person Bazman    schedule 17.04.2013


Ответы (2)


Как указал @Oleg, более старые версии Parallel Computing Toolbox имели ограничительные ограничения на размер данных для передачи в PARFOR и из него. Это ограничение было исправлено в R2013a, но, к сожалению, страница документа, на которую ссылается @Oleg, не обновлялась. Если можете, попробуйте еще раз, используя R2013a.

person Edric    schedule 18.04.2013

Чтобы избежать нехватки памяти, вам нужен калькулятор и знать ограничения.

Вы ограничены размером 2 ГБ для 64-битной ОС и 600 МБ для 32-битной ОС при каждой передаче данных между клиентом и рабочим. Дополнительные сведения см. в разделе Ограничения размера данных объекта. а также упоминается в parfor().

Затем вам нужно рассчитать (с помощью калькулятора), сколько данных вы передаете в каждом цикле, т.е. размер массивов, созданных кодом.

person Oleg    schedule 17.04.2013
comment
Я использую 64-битную ОС, но не знаю, где в коде возникают ошибки? CreateCurve вызывает несколько других функций. Мне нужно иметь возможность отлаживать в параллельной среде. - person Bazman; 17.04.2013
comment
К сожалению, я могу только предложить переключиться на нормальный формат, поставить несколько точек останова и проверить размер переменных в рабочей области, для чего вы можете использовать мою утилиту wssize(). Вы можете использовать условные точки останова, если подозреваете, что какая-то переменная на самом деле может быть самой тяжелой. - person Oleg; 17.04.2013
comment
Олег, спасибо, а я уже перезапускал в обычном цикле for и баг не появляется? - person Bazman; 18.04.2013
comment
Постоянно появляется с парфором? - person Oleg; 18.04.2013
comment
Да, в значительной степени после такого же количества времени обработки! Тем не менее, оптимизация основана на создании случайных выборок, поэтому трудно думать, что каждый раз создаются одни и те же числа, но трудно знать наверняка. - person Bazman; 18.04.2013