FFTN Matlab становится медленнее с многопоточностью? - PullRequest
3 голосов
/ 02 марта 2012

У меня есть доступ к 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');

Что дает мне это: Timing results for matrix multiplication and fftn

Ускорение умножения матриц велико, но, похоже, мои FFT идут почти в 3 раза медленнее, когда я использую все свои ядра. Что происходит?

Для справки моя версия 7.12.0.635 (R2011a)

Редактировать: На больших двумерных массивах с одномерными преобразованиями у меня возникает та же проблема: enter image description here

Редактировать: Кажется, проблема в том, что fftw не видит поток, ограничивающий то, что предписывает maxNumCompThreads. Я получаю все процессоры на полной скорости, независимо от того, на что я установил maxNumCompThreads.

enter image description here

Итак ... есть ли способ указать, сколько процессоров я хочу использовать для fft в Matlab?

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2013

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

0 голосов
/ 02 марта 2012

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

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

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

Более подробная информация доступна по адресу:

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

Многопоточные вычисления

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

...