gpt4 book ai didi

performance - MATLAB 速度优化

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:18 25 4
gpt4 key购买 nike

有人可以帮忙吗?我是一位相当有经验的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com