Fftn на Matlab става по-бавен с многопоточност?

Имам достъп до 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');

Което ми дава следното: Резултати от времето за умножение на матрици и fftn

Ускоряването за матрично умножение е страхотно, но изглежда, че моите 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 има отговор. Би било хубаво, ако някой има лесно решение...


person dranxo    schedule 02.03.2012    source източник
comment
Какво се случва, ако сравните fft(X,[],1) и fft(X,[],2)? (Вероятно при много по-големи размери на матрицата.) Те показват ли някакъв паралелизъм? Ако не, библиотеката fftw може изобщо да не използва паралелизъм и може да се наложи да използвате различна настройка на MATLAB.   -  person Judah Jacobson    schedule 03.03.2012
comment
Помислете дали да отговорите на въпроса си тук, така че хората да могат да видят резултатите от вашето разследване (и евентуално да гласуват!)...   -  person Alex Feinman    schedule 10.07.2013


Отговори (2)


Изглежда, че не мога да направя това без внимателна работа с .mex файлове. http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft има отговор. Би било хубаво, ако някой има лесно решение...

person dranxo    schedule 10.07.2013

За да използвате различни ядра, трябва да използвате Parallel Computing Toolbox. Например, можете да използвате parfor цикъл и трябва да предава функциите като списък с манипулатори:

function x = f(n, i)
  ...
end

m = ones(8);
parfor i=1:8
  m(i,:) = f(m(i,:), i);
end

Повече информация е достъпна на:

Високопроизводителни изчисления

Многонишково изчисление

Многопоточност

person Luis Andrés García    schedule 02.03.2012
comment
Не се опитвам да накарам for цикъла да работи паралелно. Опитвам се да направя fftn по-бърз. Матричното умножение автоматично използва всичките ми ядра, но изглежда, че fftn не го прави. - person dranxo; 02.03.2012
comment
в fftn се казва, че fftn(X) е еквивалентен на: Y = X; за p = 1:дължина(размер(X)) Y = fft(Y,[],p); end Защо не опитате да включите parfor в този цикъл "for"? Дано помогне. - person Luis Andrés García; 02.03.2012
comment
Тези повиквания се правят към fft последователно. Ако се опитам да паралелизирам това с parfor, тогава ще имам състояние на състезание на Y. - person dranxo; 02.03.2012
comment
Луис, за да изясня отговора на rcompton: fftn за многомерни сигнали прилага fft в първата посока на сигнала, след това прилага fft към резултата във втората посока на сигнала и т.н. Този процес е последователен и не може да се паралелизира директно. - person Judah Jacobson; 03.03.2012