Matlab优化

时间:2012-07-20 16:44:31

标签: matlab optimization bsxfun

道歉,如果这太像是“做我的功课”问题。我有点卡住,这是我去的地方。这不是我写的代码,但我现在正在维护它。

我有一个工作,在糟糕的一天运行大约8个小时。我今天描述了它。 91.4%的运行时属于一个子功能,并且在70%的时间内花费在这一行代码上。在配置文件运行中有效调用60000次,因为内部嵌套for循环(不可避免)

    testincrease = ones(183,3021)*.02;
    cRange = (0:177)'; %fix broken syntax highlighting --> '
    pRate = ones(183,3021)*.02;
    lengthA = 0;
    lengthP = 178;
    nSim = 3021;

    tic
    for i  = 1:100
    v_F = @(adj_N,adj_I) (((1+ adj_I+ testincrease(cRange+1,:))./(1 + adj_N + pRate(cRange+1,:))).^...
                repmat([cRange+0.5],[1 nSim]))...
                ./ ...
                (repmat(((1+adj_I+testincrease(lengthA+1,:))./(1 + adj_N+ pRate(lengthA+1,:))), [lengthP 1]).^...
                repmat([repmat(cRange(1), [lengthP 1])], [1 nSim]));
    v=v_F(0,0);
    end
    toc

当前的想法:

我想也许我可以用bsxfun代替repmat(我现在正在尝试)

当cRange(1)= 0时(正如我在测试数据的一部分中所做的那样 - 我放在这里的部分),后半部分只是除以1 - 这是一个昂贵而毫无意义的计算。所以我想使用'if'子句来避免不必要的计算。

拨打另一种语言 - 这对我来说是全新的。可能会尝试一下。显然可以轻松访问java,还可以创建mex文件。在后一种情况下,我认为传递数据的开销将是昂贵的,除非我重写大量的代码而不仅仅是这一行。

如果您有任何其他想法,我将很高兴听到他们。如果不是,我会继续做更多的研究。

编辑:只是注意到函数repmats的最后一行是完全没必要的,因为你可以。^通过标量值而不需要将其更改为矩阵

辅助编辑:到目前为止它是这样的。节省30%。

tic
for i  = 1:100
    if cRange(1) == 0

        v_F = @(adj_N,adj_I) bsxfun(@power,((1+ adj_I+ testincrease(cRange+1,:))./(1 + adj_N + pRate(cRange+1,:))),cRange+0.5);

    else
        v_F = @(adj_N,adj_I) bsxfun(@power,((1+ adj_I+ testincrease(cRange+1,:))./(1 + adj_N + pRate(cRange+1,:))),cRange+0.5)...
            ./ ...
            (repmat(((1+adj_I+testincrease(lengthA+1,:))./(1 + adj_N+ pRate(lengthA+1,:))).^cRange(1), [lengthP 1]));

    end
    v=v_F(0,0);
end
AllChange = toc;

但由于某些原因,bsxfun的变化加速了它在2011年的速度,在2008年我们编译的速度下降了。开溜。

1 个答案:

答案 0 :(得分:2)

建议1 - 尝试重写没有repmat的代码:

repmat会产生大量内存分配和内存副本......因此,如果您要将代码重写为相同的功能但不使用repmat,则可能会大幅提高速度。 (仅供参考...一行代码有4个repmat函数调用...其中一个repmat调用有repmat INSIDE ...它会非常慢。)

建议2 - 尝试重写单行:

将此MASSIVE单行重写为多行。然后重新运行你的探查器。然后,您将能够更清楚地看到导致减速的确切原因!然后你可以修复那段代码。 (专业提示:由于各种原因(可读性,调试,性能等),大量的一个内容有时候不是代码中最好的东西) - Trevor Boyd Smith 17秒前编辑

建议3 - 利用并行化:

我认为您的一行代码中的大多数操作都可以并行化。所以我建议先尝试使用Matlab的并行工具箱。然后,如果仍然不够快...尝试通过外部第三方Matlab GPU加速软件包(如Jacket)使用GPU加速。


(免责声明:这些是一般提示......我自己还没有尝试过任何这些......但是当我有空的时候,我会的。)