当内存分析以下测试时,感兴趣的行上只有一个(相对)小分配(可能是缓冲结果以添加完整列),因此我认为这是一个就地操作,其中乘法的每个结果组件被直接添加到目标矩阵 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 行:
htop
第 244 行之后: