15

データの大きな配列を乗算およ​​び除算する最速の方法が必要です。

私はこれを読みました(Ben Voigtがここに書いた):

現在のバージョンでは、.NET は MMX、SSE、または AVX を使用していません。

(...)

最新の C++ コンパイラは、SIMD の使用を許可するだけでなく、通常のコードを SIMD 命令に自動ベクトル化できます。

.

私が必要だと思う:

  • ベクトル演算による SSE サポート (一度に 4 つの float を乗算するため)

  • マルチスレッドのサポート (C# スレッドと何らかの形で衝突しないソリューション/ライブラリ)

使用できるライブラリ/dll はありますか?

編集: Octave の代替案はありますか? 除算、乗算の 2 つの操作だけが必要です。Octaveとは何か、それがどのように機能するかを正しく理解していれば、出力を解析する必要があります...高速にはなりません...


「何を試しましたか」と「なぜシンプルを使いたくないのか」によるとfor

これは、ニューラル ネットワークのトレーニングに必要です。ネットワーク (現在) には 50 を超える入力、多くのニューロン (それぞれ 50 以上の重み) があります。学習データには、100.000 行以上、それぞれ 50 以上のフィールドが含まれます。各ニューロン入力には、少数 (少なくとも 5 回) の乗算演算が必要です。

必要な学習エポックの数はわかりませんが、乗算演算のみをベンチマークしようとしたところ、Intel Core Duo T2500 2.0GHz CPU でエポックあたり約 16 秒という結果が得られました。

もちろん、より高速なコンピューターを購入することもできますが、新しいコンピューターは私の数時間の作業よりも価値があるので、論理的に見えることを願っています...

4

4 に答える 4

8

この質問を見て、C# で GOTO BLAS ライブラリを使用する方法を探しました。GOTO ライブラリ (邪悪なプログラミング キーワードではなく、作者にちなんで名付けられた) は、特定の CPU アーキテクチャ (Opteron、Xeon、など)

おそらく、 Math.NET Numericsが必要であることがわかります。

MSDNの説明から:

Math.NET Numerics は、.NET Framework の標準的なオープン ソース数学ライブラリになることを目指しています。科学、工学、および日常使用における数値計算の方法とアルゴリズムを提供します。Math.NET Numerics でカバーされる機能には、特殊関数、線形代数、確率モデル、統計、乱数、補間、および積分変換 (FFT) が含まれます。Math.NET Numerics は、.NET 4.0、Silverlight 4、および Mono で実行される完全に管理された実装を提供します (ただし、他のプラットフォーム用にコンパイルできます)。また、並列化されたマネージド実装を提供し、ネイティブ BLAS/LAPACK ライブラリ (GotoBLAS、Intel MKL、および AMD ACML) を使用した最適化をサポートします。

于 2013-01-07T16:06:16.603 に答える
7

あなたのベクトルが巨大なN次元配列/ベクトルであると仮定します

C# のような遅い言語を使用していて、巨大な配列の乗算と除算を行い、すべてのプロセッサを使用してできるだけ早くそれを実行する必要がある場合は、C# インターフェイスと GNU Octave を使用します。GNU octave はベクトル化された言語であるため、行列の乗算は、ネストされた for ループを実行するよりも桁違いに少ないリソースを使用します。

したがって、GNU Octave でいくつかのカスタム スクリプトを定義して、2 つの 50 次元配列を掛け合わせてから、C# でオクターブを呼び出してパラメーターを渡すようにします。次に、C# で結果を収集します。

GNU Octave は、本書のすべてのトリックを利用して、行列計算をできるだけ少ないリソースでできるだけ早く完了できるように設計されています。

http://en.wikibooks.org/wiki/Octave_Programming_Tutorial/Getting_started

他の誰かが、C# と Octave をインターフェースする方法を尋ねてきました:

オクターブと C# のインターフェース

編集: 計算に 10 分以上かかり、処理時間を短縮することが非常に重要でない限り、この余分な作業をすべて行うことは意味がありません。

于 2013-01-04T16:03:54.583 に答える
4

次のようなものを見つけました: Microsoft Research Accelerator v2

Accelerator は、GPU やマルチコア CPU などの並列プロセッサを使用して実行を高速化する高レベルのデータ並列ライブラリです。

興味深い機能 (M$ サイトから貼り付け):

  • DX9 GPU と CUDA に加えて、32 ビットと 64 ビットの両方のマルチコア CPU での実行。
  • 単一の Accelerator インスタンス内の複数のデバイスで実行する機能

残念ながら私はそれを使用することはできません.商用利用は無料ではなく、費用がいくらかかるのか尋ねたくもありません...おそらく私には高すぎます.

于 2013-01-04T17:39:49.360 に答える
0

.NET のオープン ソース代替ランタイムである Mono で実行する余裕がある場合は、Mono.Simd (http://docs.go-mono.com/index.aspx?link=N:Mono.Simd) を使用できます。 )、構造体の周りで SIMD を使用できるようにしますが、JIT がメソッド呼び出しを SIMD 操作にインライン化する Mono でのみ使用できます。

于 2013-01-07T16:19:41.720 に答える