Я пытаюсь вычислить серию спектров параллельно, используя parfor
, но мои циклы parfor
дают сбой.
Я вполне уверен, что сбой произошел не из-за невозможности предварительного выделения переменных, а из-за того, что Matlab вычисляет спектр по-другому:
Вот простой скрипт, демонстрирующий проблему (в Ubuntu и R2012b):
% allocate the data and objects
mtm = spectrum.mtm;
data = rand(3000,1);
Fs = 500;
fprintf('Entering for loop\n');
for i = 1:5
h = psd(mtm, data, 'Fs', Fs);
end
fprintf('Entering parfor loop\n');
parfor i = 1:10
h = psd(mtm, data, 'Fs', Fs);
end
Цикл for
выполняется правильно, однако ошибки parfor
отсутствуют. Вот результат:
Вход в цикл
Вход в цикл parfor
Предупреждение: PSD заменен объектами SPECTRUM. PSD все еще работает, но может быть удален в будущем. Вместо этого используйте SPECTRUM (или его функциональную форму PWELCH).
В psd, 33, параллельная_функция> make_general_channel / channel_general, 885 дюймов remoteParallelFunction at 30 Ошибка при использовании parallel_function (строка 589)
Требуется векторный ввод (строка или столбец).
Стек ошибок: psd.m на 37
Кто-нибудь сталкивался с этим раньше? Есть ли лучший способ распараллелить спектральные вычисления?
1 ответ
После консультации со службой поддержки Mathworks проблема решена путем перемещения создания объекта spectrum.mtm
внутрь цикла parfor
.
Это работает
fprintf('Entering parfor loop\n');
parfor i = 1:10
mtm = spectrum.mtm;
h = psd(mtm, data, 'Fs', Fs);
end
Это не
mtm = spectrum.mtm;
fprintf('Entering parfor loop\n');
parfor i = 1:10
h = psd(mtm, data, 'Fs', Fs);
end
Основная проблема заключается в том, что spectrum.mtm
является объектом simulink, а не объектом Matlab, и объекты simulink не могут использоваться в циклах parfor
.
Похожие вопросы
Новые вопросы
matlab
MATLAB - это высокоуровневая языковая и интерактивная среда программирования для численных расчетов и визуализации, разработанная MathWorks. Не используйте оба тега [matlab] и [octave], если явно не задан вопрос о сходстве или различии между ними. При использовании этого тега, пожалуйста, укажите версию MATLAB, с которой вы работаете (например, R2017a).
spectrum
, как подсказывает сообщение об ошибке?psd
h
. Это создает состояние параллельной гонки, когда каждая параллельная задача пытается одновременно выполнить запись вh
. Попробуйте изменитьh=psd(...)
наh(i)=psd(...)
, чтобы результат каждой итерации сохранялся в отдельном месте. Однако я подозреваю, что вы действительно хотите распараллелить вычисления внутри функцииpsd
, так ли это?