У меня есть доступ к 12-ядерной машине и некоторому коду Matlab, который сильно зависит от fftn. Я хотел бы ускорить свой код.
Поскольку FFT можно распараллелить, я думаю, что больше ядер поможет, но я вижу обратное.
Вот пример:
X = peaks(1028);
ncores = feature('numcores');
ntrials = 20;
mtx_power_times = zeros(ncores,ntrials);
fft_times = zeros(ncores, ntrials);
for i=1:ncores
for j=1:ntrials
maxNumCompThreads(i);
tic;
X^2;
mtx_power_times(i,j) = toc;
tic
fftn(X);
fft_times(i,j) = toc;
end
end
subplot(1,2,1);
plot(mtx_power_times,'x-')
title('mtx power time vs number of cores');
subplot(1,2,2);
plot(fft_times,'x-');
title('fftn time vs num of cores');
Что дает мне это:
Ускорение матричного умножения отличное, но похоже, что мои fft идут почти в 3 раза медленнее, когда я использую все свои ядра. Что происходит?
Для справки, моя версия 7.12.0.635 (R2011a).
Редактировать: На больших 2D-массивах, использующих 1D-преобразования, возникает та же проблема:
Редактировать: проблема заключается в том, что fftw не видит ограничение потока, которое накладывает maxNumCompThreads. Я заставляю весь процессор работать на полной скорости, независимо от того, что я установил для maxNumCompThreads.
Итак... есть ли способ указать, сколько процессоров я хочу использовать для fft в Matlab?
Изменить: Похоже, я не могу сделать это без тщательной работы с файлами .mex. http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft есть ответ. Было бы неплохо, если бы у кого-то было легкое решение...
fft(X,[],1)
иfft(X,[],2)
? (Возможно, на матрицах гораздо больших размеров.) Показывают ли они какой-либо параллелизм? Если нет, возможно, библиотекаfftw
вообще не использует параллелизм, и вам может понадобиться использовать другую настройку MATLAB. - person Judah Jacobson   schedule 03.03.2012