gpt4 book ai didi

performance - 为什么reshape这么快? (剧透 : Copy-on-Write)

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:51 25 4
gpt4 key购买 nike

我有一个很大的矩阵 A,它有 1GB 的 double 值,当我将它重新整形为不同的维度时,它的速度快得令人难以置信。

A=rand(128,1024,1024);
tic;B=reshape(A,1024,128,1024);toc

Elapsed time is 0.000011 seconds.

怎么会这么快?另一个观察结果是,在运行该代码并存储两个 1GB 的矩阵后,MATLAB 使用的内存比应有的少:MATLAB 使用的内存:1878 MB(1.969e+09 字节)

最佳答案

良好性能的解释

Matlab 使用 copy-on-write只要有可能。如果您编写类似 B=A 的表达式,MATLAB 不会复制 A,而是变量 AB 都是对同一数据结构的引用。仅当修改两个变量之一时,MATLAB 才会创建一个副本。

现在来看reshape 的特殊情况。在这里看起来 A 和 B 不一样,但在内存中它们是一样的。保存数据的底层数组不受 reshape 操作的影响,无需移动任何内容:all(A(:)==B(:))。调用 reshape 时 MATLAB 必须做的一切就是创建一个新的引用并用矩阵的新维度对其进行注释。 reshape 矩阵只不过是创建对输入数据的新引用,它用新维度进行注释。 reshape 的运行时间小于 1µs 或大约是 B=A 等两个简单赋值所需的时间。对于所有实际应用,零时间操作。

>> tic;for i=1:1000;B=reshape(A,1024,128,1024);end;toc
Elapsed time is 0.000724 seconds.
>> tic;for i=1:1000;B=A;end;toc
Elapsed time is 0.000307 seconds.

不知道这样的引用到底有多大,但我们可以假设它在几个字节以内。

其他零成本运营

已知的几乎零成本的函数(运行时和内存):

  • B=reshape(A,sz)
  • B=A(:)
  • B=A.' - 仅适用于向量
  • B=A' - 仅适用于实数向量,without the attribute complex .请改用 .'
  • B=permute(A,p) - 仅适用于 all(A(:)==B(:)) 的情况。1
  • B=ipermute(A,p) - 仅适用于 all(A(:)==B(:)) 的情况。1
  • B=挤压(A) 1
  • shiftdim - 仅适用于 all(A(:)==B(:)) 的情况,即:1
    • 用于删除主要的单一维度。
    • 与第二负输入一起使用
    • 在没有第二个输入参数的情况下使用。

“昂贵”的函数,尽管它们不涉及内存中的表示(all(A(:)==B(:)) 为真)

  • 左侧索引:B(1:numel(A))=A; 2
  • (:) 之外的右侧索引,包括 B=A(1:end);B=A(:,:,:) ; 2

1 在 1µs 和 1ms 之间,运行时间明显比 reshape 慢。可能是因为一些恒定的计算开销。内存消耗几乎为零,运行时与输入大小无关。没有此注释的操作的运行时间低于 1µs,大致相当于 reshape

2 OCTAVE 零成本

写这篇文章时最初使用的是 MATLAB 2013b。用 MATLAB 2019b 确认了数字。

关于performance - 为什么reshape这么快? (剧透 : Copy-on-Write),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36062574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com