3

12 コアのマシンと、fftn に大きく依存するいくつかの matlab コードにアクセスできます。コードを高速化したい。

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) です。

編集: 1D変換を行う大きな2D配列では、同じ問題が発生します: ここに画像の説明を入力

編集:問題は、fftw が maxNumCompThreads が強制するスレッド制限を認識していないことです。maxNumCompThreads を何に設定しても、すべての CPU がフルスピードで動作します。

ここに画像の説明を入力

それで... Matlabでfftに使用したいプロセッサの数を指定する方法はありますか?

編集: .mex ファイルで慎重に作業しないと、これを行うことができないようです。http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fftに答えがあります。どなたか簡単に直していただけると助かります...

4

2 に答える 2

-1

異なるコアを使用するには、Parallel Computing Toolbox を使用する必要があります。たとえば、parforループを使用でき、関数をハンドルのリストとして渡す必要があります。

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

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

詳細については、次を参照してください。

ハイ パフォーマンス コンピューティング

マルチスレッド計算

マルチスレッド

于 2012-03-02T07:26:57.003 に答える