У меня есть доступ к 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)
Редактировать: На больших двумерных массивах с одномерными преобразованиями у меня возникает та же проблема:
Редактировать: Кажется, проблема в том, что fftw не видит поток, ограничивающий то, что предписывает maxNumCompThreads. Я получаю все процессоры на полной скорости, независимо от того, на что я установил maxNumCompThreads.
Итак ... есть ли способ указать, сколько процессоров я хочу использовать для fft в Matlab?
Редактировать: Похоже, я не могу сделать это без некоторой тщательной работы в файлах .mex. http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft есть ответ. Было бы хорошо, если бы у кого-то было легко исправить ...