2013-04-17 1 views
0

Я был запуск программы буквально сотни раз, но в последнее время установлено, что один набор входных параметров приводит следующее сообщение об ошибке:Ошибка при помощи 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 (это дифференциальная эволюция). Я не затронул другие параметры в любой момент. Всякий раз, когда я пытаюсь запустить его с указанными выше параметрами, я получаю ошибку выше.

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

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

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

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

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

+0

Как ошибка 'java.lang.OutOfMemoryError: превышение верхнего предела GC' говорит, что это из памяти. Не видя кода, трудно сказать, почему эти конкретные входные данные вызывают нехватку памяти. – Oleg

+0

Я счастлив опубликовать код его довольно большой, хотя! Но хотелось бы узнать, как отлаживать такие проблемы. – Bazman

ответ

1

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

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

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

+0

Я использую 64-разрядную ОС, но я не знаю, где в коде создаются ошибки? CreateCurve вызывает несколько других функций. Мне нужно иметь возможность отлаживать параллельную среду. – Bazman

+0

К сожалению, я могу предложить только переключиться на нормальный, поместить некоторые точки останова и проверить размер переменных в рабочей области, для которых вы можете использовать мою утилиту ['wssize()'] (http://www.mathworks.co .uk/matlabcentral/fileexchange/26250-дисплей-WS-переменного размер в т.п.н.-MB-или-ГБ /). Вы можете использовать условные брекеты, если вы подозреваете, что какая-то переменная может быть самой тяжелой. – Oleg

+0

Спасибо, Олег, но я уже заново использовал обычный цикл, и ошибка не появилась? – Bazman

2

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