2016-12-16 2 views
0

У меня есть алгоритм myAlgo(), который использует параметр par1 для анализа набора данных (около 1000 файлов .mat). Путь к файлам .mat - это некоторый массив ячеек, который я передаю также myAlgo(). Функция myAlgo() содержит классы и другие функции. Для каждого значения par1 Мне нужно протестировать все 1000 файлов .mat. Так что было бы намного быстрее, если бы я мог использовать параллельный цикл, поскольку у меня есть независимая (?) Проблема.Matlab parfor и файлы ввода

Я использую следующий код parfor:

par1 = linespace(1,10,100); 
myFiles % cell array with the .mat file location 
myResult = zeros(length(par1),1); 

parfor k=1:length(par1) 
    myPar = par1(k); 
    myResult(k) = myAlgo(myPar, myFiles); 
end 

% do something with myResult 

.

function theResult = myAlgo(myPar, myFiles) 
    for ii=1:length(myFiles) 
     tempResult = initAlgo(myPar, myFiles(ii)); 
    end 
    theResult = sum(tempResult); 
end 

Таким образом, для каждого параметра в par1 я делаю то же самое. К сожалению, время обработки не уменьшается. Но если я проверю рабочую нагрузку процессора (i5), все ядра будут активны.

Теперь мой вопрос: возможно ли, что parfor не работает в этом случае, потому что каждый рабочий, инициализированный parfor, должен получить доступ к папке с 1000 файлами .mat. Поэтому они не могут выполнять свою работу в одно и то же время. Правильно? Так есть способ справиться с этим?

ответ

1

Прежде всего, проверьте, есть ли у вас лицензия для инструментария параллельных вычислений (PCT). Если у вас его нет, parfor will behave just like a normal for loop WITHOUT actually parallel processing (for compatibility reasons)..

Во-вторых, не забудьте открыть parpool first.

Другой проблемой может быть то, что вы используете параллельную обработку для внешнего цикла с 100 итерациями, но не для большего внутреннего цикла с 1000 итерациями. Вы должны перефразировать свою проблему как один большой цикл, который позволяет parfor распараллелить задачи 100 * 1000 = 100000, а не только 100 внешних циклов. This excellent post прекрасно объясняет проблему и предлагает несколько решений.

+0

Вы правы. Это делает его, вероятно, медленнее. Но на самом деле 'parfor' даже не работает в приведенном выше примере. Это связано с тем, что каждый процесс требует доступа к файлам .mat одновременно? – Samuel

+0

Это должно сделать это намного медленнее. Вы пытались изменить структуру цикла? Насколько мне известно, параллельное чтение файлов не должно быть проблемой, в соответствии с этим сообщением он может быть даже быстрее в некоторых случаях: https://de.mathworks.com/matlabcentral/answers/20863-parfor-file-reading Что вы имеете в виду «даже не работает»? Было ли сообщение об ошибке? BTW Вы инициализировали параллельную обработку с использованием parpool? – mzunhammer

+0

Ошибка отсутствует. Но если я измеряю время «для» и «parfor», то нет существенной разницы. Если я использую пример веб-сайта MATLAB, который сравнивает обе петли, то есть огромная разница в вычислительном времени. Так что это работает. Но я не могу инициализировать параллельную обработку с использованием parpool. Если я попробую, я получаю сообщение об ошибке лицензии. – Samuel

Смежные вопросы