2012-05-03 8 views
5

私は、行列/ベクトル計算で膨大なスピードアップを得るために式テンプレートを使用するC++ライブラリEigenにかなり感心しています。スカラLMSは線形代数Libを書く

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

ありがとうございました

編集:私はscala 2.10のマクロを見つけました。多分、これは私がここで使いたいものです。重要な部分はhttp://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html

例で説明されて

OM-NOM-NOM @

はベクトル加算

u = v + w 

は以降(ネイティブ)C++での良好な性能を持っていないことを説明します加算のために一時変数が作成され、この変数はuに割り当てられます。

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

固有が速く明らかにされ、余分な変数を必要としません

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

にコンパイル時にこれを減らすために(上記のリンクで段階的に説明した)テンプレートメタプログラミングを使用しています。

+0

すぐに表現テンプレートのメカニズムを記述すると、役立つ可能性があります。 –

答えて

1

が正しくこの質問に答えるために、あなた自身の余分な質問をする必要があります。

  1. はあなたのテンプレートとC++のコードはScalaのコードよりも良好に動作することを本当によろしいですか?現代のベンチマークでは、JavaはC++よりも行列反転で高速です。これは主に、VMとHWの改善によるものです。

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

  3. スケーラの小規模で満足できるパフォーマンスで問題が解決でき、その差が大きい場合にのみ有意差がある場合、問題(行列/ベクトル乗算)を異なるタスクに分割することは妥当ではありませんこれは並行して実行できますか?

個人的なメモ:私はジョシュア・ブロック、これまでで最も影響力のJava開発者の1と効果的なジャワの著者でいくつかの電子メールの議論を持っていた、と彼はブライアンGoletzによって興味深いプレゼンテーションの(作者の方に私を指摘していますJavaの実践での同時実行性と同様にJavaの世界では非常に影響力のある):Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware

あなたは利益があると、これは重要であり、それは将来的にあなたの問題のSIZが成長しないだろうと結論付けた場合

yマルチコア実行の恩恵を受ける必要はありませんが、おそらくC++にとどまる必要があります。それ以外の場合は、2.10-M3から利用可能なScala Macrosをご覧ください。

*追加:中間変数を避けることは、JavaやC#などのVMのトップで実行される言語を使用するときには意味がありません。実際、あなたが正しく記述した記事が示すように、JVMがJITを使ってどのようにJavaバイトコードをアセンブラに変換するかには、ある種の危険があります。手作業で実行できる最適化の多くはすでにJVMによって適用されており、メソッドと変数の宣言を最終的に行う場合は、この推論の大半は無駄です。 *

+0

コメントありがとうございます。 C++がまだJavaより高速であるかどうかは疑問です。 [link](https://github.com/mikiobraun/jblas/wiki/Java-Native-Code-Background)にはいくつかのヒントがあり、JNIを使​​って使用できるマグマのようなプロジェクトがあります。 しかし、私の質問は異なっています。一時変数と不要な計算(たとえば、単位行列の乗算)を避けることについての詳細です。 –

関連する問題