6

式テンプレートを使用して行列/ベクトルの計算を大幅に高速化するC++ライブラリEigenに非常に感銘を受けました。

このライブラリをscalaで複製したいと思います。私の知る限り、scalas型システムはこのようなことを行うのに十分なほど強力ではありませんが、軽量のモジュラーステージングLMSが可能であるはずです。そこにはいくつかのプロジェクトがあるようです(Delight、virtualization-lmsなど)。信頼性とパフォーマンスの観点から、この種のプロジェクトに使用する権利はどれですか?

ありがとう

編集:scala2.10でマクロに出くわしました。多分これは私がここで使いたいものです。

@オムノムノム

重要な部分はhttp://eigen.tuxfamily.org/dox/TopicInsideEigenExample.htmlで説明されています

この例では、ベクトルの加算について説明しています

u = v + w

追加のために一時変数が作成され、この変数がuに割り当てられるため、(ネイティブ)C++では良好なパフォーマンスが得られます。

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i];
for(int i = 0; i < size; i++) u[i] = tmp[i];

Eigenは、テンプレートメタプログラミング(上記のリンクで段階的に説明)を使用して、コンパイル時にこれを次のように削減します。

for(int i = 0; i < size; i++) u[i] = v[i] + w[i];

これは明らかに高速で、追加の変数は必要ありません。

4

1 に答える 1

1

この質問に正しく答えるには、追加の質問をする必要があります。

  1. テンプレートを使用したC++コードのパフォーマンスがScalaコードよりも優れていると本当に確信していますか?最新のベンチマークは、マトリックスの反転においてJavaがC++よりも高速であることを示しています。これは主に、VMとHWの改善によるものです。

  2. 管理されていないメモリ、ダングリングポインター、およびC ++でのコーディングによるエラーとバグの増加に比べて、より高速なマトリックスツールを使用することで得られるビジネス上のメリットはどれくらいですか?

  3. Scalaで小規模で満足のいくパフォーマンスで問題を解決でき、大規模でのみ違いが顕著になる場合、問題(行列/ベクトルの乗算)をで実行できるさまざまなタスクに分割することを検討するのは合理的ではありません。平行?

個人的なメモ:これまでで最も影響力のあるJava開発者の1人でEffectiveJavaの作者であるJoshuaBlochとのメールディスカッションはほとんどありませんでした。彼は、Brian Goletz(Java Concurrency in Practiceの作者であり、 Javaの世界も):あなたの父のフォンノイマンマシンではない:現代のハードウェアのクラッシュコース


メリットがあり、これが重要であり、将来的に問題のサイズが大きくならないため、マルチコア実行のメリットが得られないと結論付けた場合は、おそらくC++を使用する必要があります。それ以外の場合は、2.10-M3以降で利用可能なScalaマクロをご覧ください。

*追加:JavaやC#などのVM上で実行される言語を使用する場合、中間変数を回避することは実際には意味がありません。実際、あなたが正しく説明した記事のように、JVMがJITを使用してJavaバイトコードをアセンブラーに変換する方法には一定の危険があります。手作業で実行できる最適化の多くはすでにJVMによって適用されており、メソッドと変数をFINALと宣言することに注意を払うと、この推論のほとんどは役に立ちません。*

于 2012-05-23T15:37:58.017 に答える