У меня есть код, который структурно похож на следующее в Matlab:Менее строгая альтернатива parfor в matlab?
bestConfiguration = 0;
bestConfAwesomeness = 0;
for i=1:X
% note that providing bestConfAwesomeness to the function helps it stop if it sees the current configuration is getting hopeless anyway
[configuration, awesomeness] = expensive_function(i, bestConfAwesomeness);
if awesomeness > bestConfAwesomeness
bestConfAwesomeness = awesomeness;
bestConfiguration = configuration;
end
end
Там есть немного больше, но основная структура является выше. X
можно получить очень большой. Я пытаюсь запустить этот код параллельно, поскольку expensive_function()
занимает много времени.
Проблема в том, что Matlab не позволит мне просто изменить for
на parfor
, потому что мне не нравится, что я обновляю лучшую конфигурацию в цикле.
До сих пор, что я сделал это:
[allConfigurations, allAwesomeness] = deal(cell(1, X));
parfor i=1:X
% note that this is not ideal because I am forced to use 0 as the best awesomeness in all cases
[allConfigurations{i}, allAwesomeness{i}] = expensive_function(i, 0);
end
for i=1:X
configuration = allConfigurations{i};
awesomeness = allAwesomeness{i};
if awesomeness > bestConfAwesomeness
bestConfAwesomeness = awesomeness;
bestConfiguration = configuration;
end
endfor
Это лучше с точки зрения времени, которое требуется для запуска; однако для больших входов требуется огромное количество памяти, потому что все конфигурации всегда сохраняются. Другая проблема заключается в том, что использование parfor
заставляет меня всегда предоставлять 0
в качестве лучшей конфигурации, даже если лучшие могут быть известны.
Предоставляет ли Matlab лучший способ сделать это?
В принципе, если бы мне не пришлось использовать Matlab и я мог бы сам управлять потоками, у меня был бы один центральный поток, который давал рабочие места рабочим (т. Е. Заставлял их запускать expensive_function(i)
), и как только рабочий вернется, посмотрите на данных, которые он создал, и сравнить их с лучшими, найденными до сих пор, и соответствующим образом обновить их. Не было бы необходимости сохранять все конфигурации, которые, по-видимому, являются единственным способом сделать работу parfor
.
Есть ли способ сделать это в Matlab?
Чтобы иметь возможность использовать ранее знание при вызове 'expensive_function', можно разделить диапазон' parfor' на более мелкие развертки (например, 'я = 1: пол (X/2) ', а затем' i = floor (X/2): X') и использовать наилучшие результаты первых разверток, чтобы выровнять следующие вызовы на 'дорогостоящие_функции'. Обратите внимание, что осуществимость этого решения зависит от компромисса между экономии времени выполнения из-за информированных звонков на «дорогая_функция» и экономии из-за наличия одного «парфора» по сравнению с несколькими последовательными 'parfor'. –
@ H.Muster: Я думал об этом, но это не идеально, потому что «дорогая_функция» может занять много времени для некоторых входов, т. Е. Первая развертка может излишне ждать, пока небольшая часть ее завершится, когда она уже может выполняйте задания с другой стороны – houbysoft
Как я уже сказал, это зависит от трауффа. В качестве обходного пути «дорогая_функция» могла сохранить некоторые результаты в файле. Затем, при каждом вызове, функция может проверить, доступны ли файлы результатов, и если да, используйте эти предварительные знания. –