使用多线程时,Matlab的fftn会变慢吗?

时间:2012-03-02 06:10:50

标签: matlab fftw

我可以访问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');

这给了我这个: Timing results for matrix multiplication and fftn

矩阵乘法的加速很快但是当我使用所有核心时,看起来我的ffts速度差了近3倍。发生了什么事?

作为参考,我的版本是7.12.0.635(R2011a)

编辑:对于采用1D变换的大型2D阵列,我遇到了同样的问题: enter image description here

编辑:问题似乎是fftw没有看到maxNumCompThreads强制执行的线程限制。无论我在哪里设置maxNumCompThreads,我都会让所有的cpus全速运行。

enter image description here

所以...有没有办法在Matlab中指定我想用于fft的处理器数量?

编辑:如果没有在.mex文件中进行一些细致的工作,我似乎无法做到这一点。 http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft有答案。如果某人有一个简单的解决方案会很好......

2 个答案:

答案 0 :(得分:0)

看起来如果没有.mex文件中的一些细心工作,我就无法做到这一点。 http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft有答案。如果某人有一个简单的解决方案会很好......

答案 1 :(得分:-1)

要使用不同的核心,您应该使用并行计算工具箱。例如,您可以使用parfor循环,并且必须将函数作为句柄列表传递:

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

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

更多信息请访问:

High performance computing

Multithreaded computation

Multithreading