Имам достъп до 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');
Което ми дава следното:
Ускоряването за матрично умножение е страхотно, но изглежда, че моите ffts вървят почти 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