2

ランダムな NxN 行列を生成するために、matlab で小さなループを作成しました。ループは

tic
for i=1:10000
    u=rand(1,10000);
    tau(i,:)=d.*(u(1,:)-0.5);
end
toc

最初にループルーチンを 1 回だけ試しましたが、

    u=rand(1,10000);
    tau=d.*(u(1,:)-0.5);

これにより、0.000169 秒でタウが得られました。ループには約 1.69 秒かかると想定しました。そうではなく、ファンが熱狂して 555.018280 秒かかりました。


a)速度が反復回数に比例しない理由はありますか? b)ルーチンを何度も実行するのに
時間がかかる理由 c) これを高速化する方法 (実際にはより大きな行列を生成したい)。同じ種類の 1'000'000x1'000'000 マトリックス?

4

2 に答える 2

7

まず、行列を事前に割り当てる必要がありますtau。つまり、

  tau = zeros(10000,10000);

それ以外の場合、matlab は十分な空きメモリがある領域に継続的に再割り当てします (=> 十分な空き領域 + ハードコピーのある領域を見つけます)。

一般に、プロセス全体をベクトル化すると、パフォーマンスが向上します。

 u=rand(10000,10000);
 tau=d.*(u-0.5);

編集:とりわけ、以下のコメントで Rody の賢明なアドバイスを聞いてください。(いずれにせよ、のシリアル実行 よりも少し速く実行されると思います)。rand(a,b)arand(1,b)

于 2012-11-19T14:15:54.300 に答える
0

明らかな可能性の 1 つは、メモリ アクセスの量です。テスト ループ用のメモリは完全にキャッシュ内にある可能性がありますが、完全なループによって書き込まれるメモリには多くのメイン メモリ アクセスが必要でした。

これは検証可能な仮説です: 算術を行わずに行列全体を書く時間.

私がMatlabの索引付けを理解していれば、同じ行ではなく同じ列にあるブロックを書き込むように、次元をより速く切り替えることができます。ループ外で u を列ベクトルに変換することも役立つ場合があります。一般に、大規模行列へのアクセスは、可能な限りメモリ順に実行する必要があります。

于 2012-11-19T14:21:10.653 に答える