2

当内存分析以下测试时,感兴趣的行上只有一个(相对)小分配(可能是缓冲结果以添加完整列),因此我认为这是一个就地操作,其中乘法的每个结果组件被直接添加到目标矩阵 A 的对应元素。

A = rand(4000);
B = rand(4000,40);
C = rand(40,4000);

A = A + (B*C); % Line of interest

eigs(A,1) % to ensure the computation of A is actually done

然而,在更复杂的情况下(例如,在循环之前有其他操作的循环中),此行创建了一个完整的临时(大小为 A)用于

B*C

我想知道为什么会这样。在大规模设置中,这可能决定 Matlab 是否出现内存不足。可能是我高估了 JIT,它甚至没有在测试用例中进行就地操作;或者正如我所希望的,也有一些技巧可以推动 JIT 就地执行更复杂的代码。

编辑

简单的测试用例:

简单的测试用例

复杂的测试用例:

复杂的测试用例

(如果你想知道,这里:R= N= 29008)

复杂代码:

复杂代码

尽管有内存分析器输出,我可以看到htop内存使用量在第 244 行期间出现峰值,其大小W约为 6GB。

htop在第 244 行:

在第 244 行期间

htop第 244 行之后:

244行外使用示例

4

1 回答 1

0

简单地使用TaskManager (我正在使用 Windows 7),我得到一个内存峰值,大小为B*C有或没有for循环:

内存分析

function [] = toto()
%[
    A = rand(6000);
    B = rand(6000);
    C = rand(6000);

    pause(10);
    %for k = 1:10,
        A = A + (B*C); % Line of interest
    %end
    pause(10);

    eigs(A,1) % to ensure the computation of A is actually done
%]

您确定内存分析htop足够准确还是测试相关?

于 2014-05-28T12:12:54.430 回答