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

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


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) эквивалентен: У = Х; для p = 1: длина (размер (X)) Y = fft (Y, [], p); end Почему бы вам не попробовать включить parfor в цикл for? Надеюсь, поможет. - person Luis Andrés García; 02.03.2012
comment
Эти вызовы выполняются последовательно. Если я попытаюсь распараллелить это с помощью parfor, то у меня будет состояние гонки на Y. - person dranxo; 02.03.2012
comment
Луис, чтобы пояснить ответ rcompton: fftn для многомерных сигналов применяет fft в первом направлении сигнала, затем применяет fft к результату во втором направлении сигнала и так далее. Этот процесс является последовательным и не может быть распараллелен напрямую. - person Judah Jacobson; 03.03.2012