Maple 9 の性能改善
Maple 9 では、数多くの性能改善が行われ、より高速でメモリ使用量が少なくなりました。
|
高精度整数計算(Long Integer Arithmetic)
|
|
•
|
Maple 9 は、演算数が、kernelopts(gmpthreshold) デジットよりも長い場合、整数計算に対するGNU Multiple Precision (GMP) ライブラリを使用します。GMPは、整数の任意精度の計算に対して非常に高速です。GMPの速度は、基本の計算タイプとして、fullwordsを使用すること、精巧なアルゴリズムを使用すること、多くの異なるCPUに対して最も一般的な内部ループに対する注意深く最適化されたアセンブリコードを含むことなどにより実現されます。GMP ライブラリについての詳細は、 GMP を参照してください。
|
|
つぎの例題は、Maple 8 では実行に 160 秒 かかりますが、Maple 9 ではたった 6 秒で実行されます。
|
|
例題
|
|
>
|
add(1/k^2, k=1..100000):
|
|
|
|
rtable_eval
|
|
•
|
プロシージャ内の Matrix, Vector あるいは、Array からの要素のアクセスは、Maple 9 で、より効率的になりました。これらの構造に対する評価規則、rtables としても知られる構造が変更され、要素が参照される場合、繰り返しにより評価が深くなることを避けることができます。
|
|
rtableに eval() を適用すると、与えられた rtable を変更せずに直ちに返します。各要素に eval() をマップし、コピーを返すリストの場合とは異なります。rtable 要素の評価は、普通、要素が参照されるまで、延期されます。同じ要素が繰り返し参照される場合、これら要素の評価も繰り返されます。同様に、これもリストの場合と対照的で、リストでは、個々の要素が参照される場合、1 レベルの評価にのみ適用される必要があります。コマンド rtable_eval(A) を使用すると、各要素を一度に評価する方法を提供し、リストの場合のように、以後の参照での評価を回避することができます。
|
|
与えられた rtable が完全な評価を必要でないとわかる確かな情報をもつ場合、Mapleは、1 レベルの評価スキームを自動的に使用します。これは、たとえば、データタイプ datatype がハードウェアタイプに設定されている場合、あるいは、rtable が文字 literal データのみを含む場合に行われます。さらに、多くの内部アルゴリズムでは、完全な評価の繰り返しを避けるために、現在、rtable_eval を使用します。
|
|
つぎの例題では、評価が難しい多項式を含む与えられた行列に rtable_eval() がある場合とない場合の O(N^3) 操作のコストを比較します。
|
>
|
F := proc(n) option remember; if n <= 2 then n else x*F(n-1)+F(n-2); fi; end:
M := Matrix(5,5,(i,j)->F(5*i+j)):
dostuff1 := proc(M) local i, j, k, y;
for i from 1 to op([1,1],M) do
for j from 1 to op([1,2],M) do
for k from 1 to op([1,2],M) do
y := M[i,j];
od;
od;
od;
end:
dostuff2 := proc(M) local i, j, k, y;
rtable_eval(M,'inplace');
for i from 1 to op([1,1],M) do
for j from 1 to op([1,2],M) do
for k from 1 to op([1,2],M) do
y := M[i,j];
od;
od;
od;
end:
time(dostuff1(M));
|
| (2.1) |
| (2.2) |
|
|
Freelist の変更点
|
|
•
|
Maple 9 より前に、Mapleは、大きいフリーメモリブロックをストアするために、リンクしたリストを使用していました。 大きなブロックを割り当てるために、リストの線形スキャンを行い、要求を満たすのに十分な大きさをもつ、最初のブロックを見つけます。多くの場合、これで十分でした。しかし、問題のサイズの増大と、gcfreq のより大きな設定が一般的になるにつれ、これら freelist の平均長が増加します。内部的なテストでは、gcfreq が増加するにつれ、実行時間が遅くなる例題を見つけました。(通常、gcfreq の増大により、Maple は高速化します)。この問題は、検索に長い時間がかかった long freelist によるものでした。Maple 9 では、freelist がツリーに置き換わりました。このツリーにより、特にリストが長くなる場合に、高速な検索が可能になります。
|
|
一般には、ツリーの使用に関連する減速はありません。long freelist が問題であった場合に対して、ツリーは、割り当てを大幅に高速化します。Maple 8 で 56 秒かかるテストファイルは、Maple 9 で 9 秒かかります。Maple 8 で実行に 50 秒 かかる他のテストは、たった 8 秒で実行されます。同様に、この変更により、メモリ割り当てが増大するにつれて Maple の性能が低下するという報告についても、解決できます。
|
|
|
ダイナミック ハッシュテーブル
|
|
•
|
Maple 8 のハッシュテーブルは、多くの場合によい性能を与えるように設計されています。しかし、極端な事例で非常に多量のデータがテーブルに挿入される場合、性能が低下します。これを解決するために、Maple 9 では、ダイナミック ハッシュテーブルがあります。 ダイナミック ハッシュテーブルは、これらを再構成することができ、その結果、大容量のデータが挿入される場合でさえ、テーブル操作が高速を維持します。再構成のオーバヘッドにより、ダイナミック ハッシュテーブルは、標準のハッシュテーブルがオーバーロードになるときにのみ使用されます。そのため、ダイナミック ハッシュテーブルを使用しても、減速の原因とはなりません。
|
|
ダイナミック ハッシュテーブルの性能をテストする簡単な方法は、テーブルに数多く挿入と検索を実行することです。つぎの例題は、Maple 8 では実行に 430 秒 かかりますが、Maple 9 では、たった 200 秒で実行されます。
|
>
|
num := 2^22:
a := table():
r := rand( 1..num ):
for i from 1 to num do
a[r()] := r();
end do:
for i from 1 to num do
a[r()]:
end do:
|
|
ダイナミック ハッシュテーブルは、また、Maple メモリマネージャとの相互作用により優れています。 これは、非常に大きいテーブルを扱う際に、メモリ割り当てを大幅に少なくすることが可能であることを意味します。上記の例題では、Maple 8 で 62 Mb を割り当て、Maple 9 で 40 Mbを割り当てます。
|
|
|
LinearSolve
|
|
•
|
LinearAlgebra パッケージの関数 LinearSolve は、追加の新しいソルバをもちます。 これは、オプションのパラメータ、method=hybrid によりアクティブになります。このソルバは、ハードウェア浮動小数点モードでLU分解を行い、続いてソフトフェア浮動小数点モードで、解を繰り返し求め精度を改良します。これは、特に Digits の設定をより高く設定する場合に、ある程度までより効率的になります。
|
|
例題
|
|
>
|
with(LinearAlgebra):
UseHardwareFloats:=false:
m := RandomMatrix(100,outputoptions=[datatype=sfloat]):
v := RandomVector(100,outputoptions=[datatype=sfloat]):
Digits := 40:
st:=time():hsol:=LinearSolve(m,v,method=hybrid):time()-st;
|
| (5.1.1) |
>
|
st:=time():lsol:=LinearSolve(m,v):time()-st;
|
| (5.1.2) |
| (5.1.3) |
| (5.1.4) |
|
|
|
線形代数演算 (LinearAlgebra 演算)
|
|
•
|
Sun と Linux プラットフォームに対する Basic Linear Algebra Subprograms (BLAS) ライブラリは、組み込みアーキテクチュア固有の最適化をもちます。これは、より新しいバージョンの ATLAS BLAS へのアップグレードから期待されるアップデートと同様です。
|
|
以下は、2 つの 1000x1000 float[8] 型の乱数行列の乗算の実行について、Maple 8 とMaple 9 の簡単な比較です。
|
Platform/Arch Maple 8 Maple 9
Linux/PII 8.45 7.46
Linux/PIII 4.38 4.35
Linux/P4 1.96 0.99
Linux/Athlon 3.62 2.55
Linux/Athlon XP 1.77 0.98
Sun/Sparc 45.74 42.28
Sun/Ultra 5.11 3.14
|
|
スパースな数値rtables
|
|
•
|
Array, Matrix, Vector のハードウェアデータタイプで、storage=sparse を使用する場合は、NAG スパース形式が使用されます。内部データ構造は、 インデックスベクトルが、sorted と unsorted ブロックに保持されていることを除いて、Maple の前のバージョンと同じです。resort は、kernelopts (sparse_sort_cutoff) の新しい要素の挿入後、自動的にトリガされます。
|
|
つぎの例題は、Maple 8 では、200 x 200corner スパース行列を初期化するのに、10.200 秒かかりましたが、Maple 9 では、同じマシンで 0.2 秒かかります。
|
|
例題
|
|
>
|
M := Matrix(10000,10000,storage=sparse,datatype=float[8]):
t:=time():
for i from 1 to 200 do
for j from 1 to 200 do
M[i,j]:=i+j:
od:
od:
time()-t;
|
| (7.1.1) |
|
|
|
combinat[randperm]
|
|
•
|
プロシージャ combinat[randperm] が、最適化されました。これは、現在、10 から 20 パーセント高速になり、メモリの使用の大きさがほぼ 1 オーダー少なくなります。
|
|
|
expand
|
|
•
|
大きい冪の展開が高速化される式があります。たとえば、つぎの計算は、Maple 9 では、Maple 8 よりも大幅に高速になります。
|
>
|
time( expand( ((sqrt(5)-1)/2)^10000 ) );
|
| (9.1) |
|
|
参照
|
|
Array, combinat[randperm], Digits, gcfreq, GMP, kernelopts, LinearAlgebra, Matrix, New Maple Features, proc, remember, rtable, rtable_eval, rtable_options/datatype, sparse, time, type/literal, Vector
|
|