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 的时序结果

矩阵乘法的加速非常好,但是当我使用所有内核时,我的 ffts 似乎慢了近 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

0

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

于 2013-07-10T17:55:47.230 回答
-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 回答