performance - MATLAB 速度优化

标签 performance matlab parallel-processing

有人可以帮忙吗?我是一位相当有经验的 Matlab 用户,但在加速下面的代码时遇到了问题。

使用 12 个内核,我在所有三个循环中运行一次的最快时间约为 200 秒。实际函数将被调用约 720 次,按照这个速度将花费 40 多个小时来执行。根据 Matlab 分析器,大部分 CPU 时间花在指数函数调用上。我已经设法使用 gpuArray 大大加快了速度,然后在 Quadro 4000 显卡上运行 exp 调用,但这会阻止使用 parfor 循环,因为工作站只有一个显卡,这会抹杀任何 yield 。任何人都可以提供帮助,或者这段代码是否接近使用 Matlab 可以实现的最佳效果?我用 openMP 编写了一个非常粗糙的 c++ 实现,但收效甚微。

提前致谢

function SPEEDtest_CPU

% Variable setup:
% - For testing I'll use random variables. These will actually be fed into 
%   the function for the real version of this code.
sy    = 320;
sx    = 100;
sz    = 32;
A     = complex(rand(sy,sx,sz),rand(sy,sx,sz));
B     = complex(rand(sy,sx,sz),rand(sy,sx,sz));
C     = rand(sy,sx);
D     = rand(sy*sx,1);
F     = zeros(sy,sx,sz);
x     = rand(sy*sx,1);  
y     = rand(sy*sx,1);
x_ind = (1:sx) - (sx / 2) - 1;
y_ind = (1:sy) - (sy / 2) - 1;


% MAIN LOOPS 
%  - In the real code this set of three loops will be called ~720 times!
%  - Using 12 cores, the fastest I have managed is ~200 seconds for one
%    call of this function.
tic
for z = 1 : sz
    A_slice = A(:,:,z);
    A_slice = A_slice(:);
    parfor cx = 1 : sx       
        for cy = 1 : sy       
            E = ( x .* x_ind(cx) ) + ( y .* y_ind(cy) ) + ( C(cy,cx) .* D );                                                          

            F(cy,cx,z) = (B(cy,cx,z) .* exp(-1i .* E))' * A_slice; 
        end       
    end   
end
toc

end

最佳答案

一些需要考虑的事情:

您是否考虑过使用单打?

你能向量化 cx、cy 部分,使它们代表数组操作吗?

考虑更改浮点舍入或信号模式。

关于performance - MATLAB 速度优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178633/

相关文章:

matlab - 在matlab中对列和行使用查找函数

c++ - 在数组中查找最大元素 OpenMP 和 PPL 版本运行速度比串行代码慢得多

html - MVC 2 - 我有一个使用大量 HTML 的控件。我该如何提高性能?

java - Android NDK是否继承Java问题?

Matlab 列到行,同时匹配原始行

OpenCL:SIMT执行模型的基本问题

c# - 跟踪并行 Foreach 线程

c++ - 恒定时间级联计算是否可能?

c++ - 小循环中的大循环总是比大循环中的小循环快吗?

matlab - 在matlab中查找矩阵所有列之间的公共(public)元素