Performance 优化多维阵列性能-MATLAB

Performance 优化多维阵列性能-MATLAB,performance,matlab,multidimensional-array,Performance,Matlab,Multidimensional Array,多维数组中的通信开销(parfor)和速度预分配(for) 在以下脚本中,我在**指示的位置收到两条警告 变量已索引但未切片。。。(第二个parfor循环中由**显示的数组A)-是什么导致了这种情况,如何避免这种情况 变量似乎会在每个循环上更改大小。。。(for循环中**显示的数组Sol)-可能我做得不对,但预分配内存没有起作用 编辑:我最初的想法是预先分配数组(如第一个parfor循环中所做的),以便更快地执行脚本的其余部分(完整版本的脚本重复各种数组操作,类似于第二个parfor和for循环

多维数组中的通信开销(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);