Matlab's fftn gets slower with multithreading?

≯℡__Kan透↙ 提交于 2020-01-13 13:50:10

问题


I have access to a 12 core machine and some matlab code that relies heavily on fftn. I would like to speed up my code.

Since the fft can be parallelized I would think that more cores would help but I'm seeing the opposite.

Here's an example:

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');

Which gives me this:

The speedup for matrix multiplication is great but it looks like my ffts go almost 3x slower when I use all my cores. What's going on?

For reference my version is 7.12.0.635 (R2011a)

Edit: On large 2D arrays taking 1D transforms I get the same problem:

Edit: The problem appears to be that fftw is not seeing the thread limiting that maxNumCompThreads enforces. I'm getting all the cpus going full speed no matter what I set maxNumCompThreads at.

So... is there a way I can specify how many processors I want to use for an fft in Matlab?

Edit: Looks like I can't do this without some careful work in .mex files. http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft has an answer. It would be nice if someone has an easy fix...


回答1:


Looks like I can't do this without some careful work in .mex files. http://www.mathworks.com/matlabcentral/answers/35088-how-to-control-number-of-threads-in-fft has an answer. It would be nice if someone has an easy fix...




回答2:


To use different cores, you should use the Parallel Computing Toolbox. For instance, you could use a parfor loop, and you have to pass the functions as a list of handles:

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

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

More info is available at:

High performance computing

Multithreaded computation

Multithreading



来源:https://stackoverflow.com/questions/9528833/matlabs-fftn-gets-slower-with-multithreading

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!