Performance 优化多维阵列性能-MATLAB
多维数组中的通信开销(parfor)和速度预分配(for) 在以下脚本中,我在**指示的位置收到两条警告Performance 优化多维阵列性能-MATLAB,performance,matlab,multidimensional-array,Performance,Matlab,Multidimensional Array,多维数组中的通信开销(parfor)和速度预分配(for) 在以下脚本中,我在**指示的位置收到两条警告 变量已索引但未切片。。。(第二个parfor循环中由**显示的数组A)-是什么导致了这种情况,如何避免这种情况 变量似乎会在每个循环上更改大小。。。(for循环中**显示的数组Sol)-可能我做得不对,但预分配内存没有起作用 编辑:我最初的想法是预先分配数组(如第一个parfor循环中所做的),以便更快地执行脚本的其余部分(完整版本的脚本重复各种数组操作,类似于第二个parfor和for循环
您的预分配不正确-您需要在一次呼叫中完成每项操作
A = rand(2, 2, N);
X = rand(2, 1, N);
Sol1 = zeros(1, 1, N);
Sol2 = zeros(1, 1, N);
Sol = zeros(2, 1, N); % not really needed actually.
在PARFOR循环中,可以使用MATLAB理解为切片的语法来避免“广播”A
parfor i = 1:N
tmp = A(:, :, i);
Sol1(1, :, i) = tmp(1,:) * X(:, 1, i);
Sol2(1, :, i) = tmp(2,:) * X(:, 1, i);
end
最后,我认为您可以将其作为一个向量化连接来执行,如下所示:
Sol = [Sol1; Sol2];
编辑
在GPU上,您可以使用在一次调用中完成整个任务,如下所示:
Ag = gpuArray.rand(2,2,N);
Xg = gpuArray.rand(2,1,N);
Sol = pagefun(@mtimes, Ag, Xg);
你是如何预分配内存的?@bdecaf我刚刚意识到我在第一个parfor循环中所做的(我的预分配想法)是完全错误的!为多维数组预分配的最佳方法是什么?基本上我是
NaN(3,4,5,…)
,只需将维度的大小按顺序写在其中(你可以对零或一做同样的操作-但我更希望看到什么时候还没有分配值)。谢谢你,几乎快了45%!我注意到,一次完成整个矩阵乘法比将其分解为第1行x列和第2行x列,并像我上面所做的那样连接起来更快。因此,对优化脚本的以下部分有何建议<代码>t2=tic;parfori=1:N Sol(:,:,i)=A(:,:,i)*X(:,:,i);终末toc(t2)代码>还有,值得一提的是,我的最终目标是在GPUThanks上运行这个并行代码,pagefun
真的很有帮助,我得到了巨大的加速!是否可以使用其他GPU就绪功能而不是@mtimes
?例如,我想计算Ag(1,:,N)
的norm
,是否可以使用pagefun
进行计算?我可以问一下:您对norm
的哪个版本最感兴趣?
Ag = gpuArray.rand(2,2,N);
Xg = gpuArray.rand(2,1,N);
Sol = pagefun(@mtimes, Ag, Xg);