7

どうすれば matlab で 2 つの行列を高速に乗算できるのだろうと思っていました。2 つの NxN 行列を乗算すると、N^3 の乗算が実行されます。Strassen Algorithmを使用してもN^2.8 の乗算が必要であり、これは依然として多数です。次のテストプログラムを実行していました。

a = rand(2160);
b = rand(2160);
tic;a*b;toc

2160^3=~10^10 ( a*b は約 10^10 の乗算である必要があるため) 2160 が使用されました。

私が得た:

Elapsed time is 1.164289 seconds.

(私は 2.4Ghz ノートブックで実行しており、スレッド化は発生しません) つまり、私のコンピューターは 1 秒強で ~10^10 の操作を行いました。

これはどうしてでしょうか??

4

2 に答える 2

13

それはいくつかのものの組み合わせです:

  • Matlabは確かにマルチスレッドを実行します。
  • コアはベクトル命令で大幅に最適化されています。

これが私のマシンの数値です:Core i7 920 @ 3.5 GHz(4コア)

>> a = rand(10000);
>> b = rand(10000);
>> tic;a*b;toc
Elapsed time is 52.624931 seconds.

タスクマネージャーは、CPU使用率の4つのコアを表示します。

今、いくつかの数学のために:

Number of multiplies = 10000^3 = 1,000,000,000,000 = 10^12

Max multiplies in 53 secs =
    (3.5 GHz) * (4 cores) * (2 mul/cycle via SSE) * (52.6 secs) = 1.47 * 10^12

そのため、Matlabは1 / 1.47 = 68%可能な限り最大のCPUスループットの効率を達成しています。

異常なことは何も見えません。

于 2012-10-04T07:20:09.020 に答える
5

MATLAB でマルチスレッドを使用しているかどうかを確認するには、次のコマンドを使用します。

maxNumCompThreads(n)

これにより、使用するコアの数が n に設定されます。現在、最大周波数が 2.7 GHz の Core i7-2620M を持っていますが、3.4 GHz のターボ モードもあります。CPUには2つのコアがあります。どれどれ:

A = rand(5000);
B = rand(5000);
maxNumCompThreads(1);
tic; C=A*B; toc
Elapsed time is 10.167093 seconds.

maxNumCompThreads(2);
tic; C=A*B; toc
Elapsed time is 5.864663 seconds.

したがって、マルチスレッドがあります。

シングルCPUの結果を見てみましょう。A*B は、約 5000^3 の乗算加算を実行します。したがって、シングルスレッド コードのパフォーマンスは

5000^3*2/10.8 = 23 GFLOP/s

さてCPU。3.4 GHz、および Sandy Bridge は、AVX を使用して 1 サイクルあたり最大 8 FLOP を実行できます。

3.4 [Ginstructions/second] * 8 [FLOPs/instruction] = 27.2 GFLOP/s peak performance

したがって、シングル コアのパフォーマンスは約 85% のピークであり、これはこの問題で予想されることです。

正確なパフォーマンスの見積もりを得るには、CPU の機能を深く調べる必要があります。

于 2012-10-04T07:51:33.540 に答える