2

単純なマトリックス ベンチマーク テストでは、Revolution Analytics R 2.13.2の LU 分解がマトリックス乗算よりも 5 倍近く遅いことが示されています。理論と長年の実践により、LU は の 1/3 から 2/3 の時間になるはずですA*A

Revo R と Matlab は、このテストに Intel の Math Kernelを使用しています。R 2.14.1カーネルを使用していません。すべてが 64 ビットです。

この異常は、以下の表 2 に示されています。これは、 について正規化された表 1A*Aです。他にも(明らかな)異常がありますが、LU が最も目立つ異常です。

                        Table 1 (secs)

                    A*A     LU     A\b    Det   Inv
----------------------------------------------------
R 2.14.1           0.757   0.43   0.45   0.20  1.11
Revo R 2.13.2      0.063   0.35   0.11   0.03  0.14
Matlab 2011b       0.062   0.08   0.10   0.07  0.16
----------------------------------------------------
Averaged over 20 runs on a 1000x1000 random matrix


                       Table 2 (normalized)

                    A*A     LU     A\b    Det   Inv
----------------------------------------------------
R 2.14.1             1     0.57   0.19   0.26  1.47
Revol R 2.13.2       1     4.67*  1.58   1.33  2.17
Matlab 2011b         1     0.67   1.72   0.61  1.68
----------------------------------------------------
Note: x = A\b in Matlab is x <- solve(A,b) in R.

更新: Simon Urbanek のアドバイスに従い、 ; に置き換えLUP = expand(lu(Matrix(A)));ましたlu(A)。Revo R列は現在

                    Revol R 2.13.2

              A*A    LU     A\b    Det   Inv
            ---------------------------------
  time       0.104  0.107  0.110  0.042  0.231  
  norm time  1.000  1.034  1.060  0.401  2.232 

秒単位の時間

Dell Precision 690, 2 x Intel®  Xeon® E53405 CPU @ 2.33GHz,
16GB ram, 2 Processors, 8 Cores and 8 Threads, 
Windows 7 Prof., 64-bit

テーブルと使用されたコードを含む進行中のレポートはこちらです。


更新 2 :

行列分解のみをテストするように行列ベンチマークを変更しました。これらは、他のすべての行列アルゴリズムが構築される基盤であり、これらが不安定な場合、他のすべてのアルゴリズムも不安定になります。

新品に変えました

Lenovo ThinkPad X220, Intel Core i7-2640M CPU @ 2.80GHz, 
8GB ram, 1 Processor, 2 Cores and 4 Threads
Windows 7 Professional, 64-bit.

:Core i7プロセッサにはIntel のターボ ブーストが搭載されており、高い需要を感知すると、クロック レートが最大 3.5 GHz まで上がります。私の知る限り、Turbo Boost は 3 つのシステムのいずれにおいてもプログラム (マー) の制御下にありません。

これらの変更により、結果がより有用になることを願っています。

                          Table 3. Times(secs)

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)   eig(A)   Total
-----------------------------------------------------------------------------
R 2.14.1         0.904    0.157    0.260    0.568    4.260    6.967    13.11
Revol R 2.13.2   0.121    0.029    0.062    0.411    1.623    3.265     5.51   
Matlab 2011b     0.061    0.014    0.033    0.056    0.342    0.963     1.47       
-----------------------------------------------------------------------------
                    Times(secs) averaged over 20  runs



                          Table 4. Times(normalized)

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)  eig(A)   Total
----------------------------------------------------------------------------
R 2.14.1         1.000    0.174    0.288    0.628    4.714    7.711   14.52
Revol R 2.13.2   1.000    0.237    0.515    3.411   13.469   27.095   45.73
Matlab 2011b     1.000    0.260    0.610    0.967    5.768   16.774   25.38
----------------------------------------------------------------------------
                     Times(secs) averaged over 20  runs  

表 4 から、疑似異常が消失し、すべてのシステムが理論の予測どおりに動作することがわかります。

                          Table 5. Times/Matlab Times

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)  eig(A)   Total
----------------------------------------------------------------------------
R 2.14.1          15      11         8       10       12       7        9
Revol R 2.13.2     2       2         2        7        5       3        4
----------------------------------------------------------------------------
                         Rounded to the nearest integer

4

1 に答える 1

5

FWIW は、分解の時間を測定するのではなく、行列を常に変換することによって作成されるオーバーヘッドです。通常のRでは:

# actual lu call
> system.time(lu(A))
   user  system elapsed 
  0.136   0.000   0.139 
# your code
> system.time(expand(lu(Matrix(A))))
   user  system elapsed 
  0.536   0.000   0.537 

そのため、自分でオーバーヘッドを作成している可能性があります。これは、分解が速い場合に特に重要です。また、R 自体のパフォーマンスは、使用する BLAS によって大きく異なるため、"R" のパフォーマンスについて理解することは曖昧であることに注意してください。

system.time(補足として-ベンチマークで使用したい場合がありますmicrobenchmark-Rパッケージにも興味があります)

于 2012-01-16T05:16:52.837 に答える