2012-03-02 63 views
3

我有权访问12核心机器和一些严重依赖于fftn的matlab代码。我想加快我的代码。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

所以......有没有我可以指定我想有多少处理器用于在Matlab中的FFT的方法吗?

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

+0

会发生什么,如果你的基准'FFT(X,[],1)'和'FFT(X,[],2)'? (可能在更大的矩阵大小上。)那些显示任何并行性吗?如果不是这样,'fftw'库可能根本不使用并行性,并且您可能需要使用不同的MATLAB设置。 – 2012-03-02 23:53:16

+0

考虑在这里回答你自己的问题,让人们可以看到你的调查结果(和潜在投上一票!)... – 2013-07-10 14:00:36

回答

-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

+0

我没有试图让for循环并行运行。我试图让fftn走得更快。矩阵乘法自动使用我所有的核心,但似乎fftn没有。 – dranxo 2012-03-02 07:41:30

+0

in [fftn](http://www.mathworks.es/help/techdoc/ref/fftn。html)据说fftn(X)相当于: Y = X;对于p = 1: :长度(size(X)) Y = fft(Y,[],p); 结束 为什么不尝试在'for'循环中包含parfor?希望能帮助到你。 – 2012-03-02 07:49:55

+0

这些电话是串联在一起的。如果我尝试用parfor并行化,那么我将在Y. – dranxo 2012-03-02 17:38:31