1

オンラインで行列の乗算/反転のベンチマークを見つけようとしています。私のC++実装は、現在38秒で100 x 100のマトリックスを反転できますが、私が見つけたこのベンチマークと比較すると、私の実装のパフォーマンスは本当にひどいものです。それが超最適化されたものなのか、それとも実際に200 x 200の行列を約0.11秒で簡単に反転できるのかわからないので、結果を比較するためのベンチマークをもっと探しています。あなたはいくつかの良いリンクを神にしていますか?

更新 乗算コードにバグを見つけました。これは結果には影響しませんでしたが、無駄なサイクルの無駄を引き起こしていました。今、私の反転は20秒で実行されます。まだまだ時間がかかりますので、どんなアイデアでも大歓迎です。

皆さんありがとうございます

4

7 に答える 7

4

この種の操作は、キャッシュに非常に敏感です。L1 および L2 キャッシュにある変数に対して、ほとんどの作業を行いたいと考えています。このドキュメントのセクション 6 を確認してください。

http://people.redhat.com/drepper/cpumemory.pdf

彼は、キャッシュに最適化された方法で行列乗算を最適化する方法を説明し、パフォーマンスを大幅に改善します。

于 2009-02-05T18:16:46.290 に答える
3

巨大な行列オブジェクトを値で渡しているかどうかを確認します (行列全体をコピーするとコストがかかる可能性があるため)。
可能であれば参照渡し。

行列と C++ に関することは、可能な限りコピーを避けたいということです。
したがって、メインオブジェクトにはおそらく「マトリックスデータ」が含まれているのではなく、マトリックスに関するメタデータとデータ部分へのポインター (何かスマートにラップされている) が含まれている必要があります。したがって、オブジェクトをコピーするときは、データ全体ではなく小さなチャンクのみをコピーします (例については、文字列の実装を参照してください)。

于 2009-02-05T18:11:48.093 に答える
2

そもそもなぜ独自の行列ライブラリを実装する必要があるのでしょうか? すでに発見したように、同じことを行う非常に効率的なライブラリが既に利用可能です。そして、人々が C++ をパフォーマンス言語と考えるのを好むのと同様に、それは言語が本当に得意な場合にのみ当てはまります。C++ で非常に遅いコードを書くのは非常に簡単です。

于 2009-02-05T18:16:24.497 に答える
1

プロファイリングしてみましたか?

このペーパー(pdf) に従って、LU 分解を使用した 100x100 行列の計算には 1348250 (浮動小数点演算) が必要になります。コア 2 は、約 20 Gflops (プロセッサ メトリック) を実行できます。したがって、理論的に言えば、1 ミリ秒で反転を行うことができます。

コードがなければ、大きなギャップの原因を断定するのはかなり困難です。ループのアンローリング、値のキャッシュ、SEE、スレッド化などのマイクロ最適化を試した私の経験から、スピードアップのみが得られますが、これはせいぜい現在の一定の要因にすぎません(おそらく十分です)。

しかし、桁違いの速度向上が必要な場合は、アルゴリズムを確認する必要があります。LU 分解の実装にバグがある可能性があります。もう 1 つの見るべき場所は、データの編成です。別の編成を試して、行/列の要素をまとめてください。

于 2009-02-06T05:18:54.737 に答える
1

それが超最適化されたものなのか、それとも本当に 200 x 200 のマトリックスを約 0.11 秒で簡単に反転できるのかはわかりません。

MATLAB は、汗をかくことなくそれを行います。行列反転 (LU 分解など) 用のLAPACKルーチンを実装していますか?

于 2009-02-05T18:04:15.600 に答える
0

LINPACKベンチマークは、線形代数の問題の解決に基づいています。さまざまなマシンや言語で利用できます。多分彼らもあなたを助けることができます。

LINPACKC++ライブラリもここで入手できます。

于 2009-02-05T17:51:24.033 に答える
0

double** ** の代わりに ** **を使用して実際に約 7 秒短縮しましlong doubleたが、精度の半分を失ったので、それは大したことではありません。

于 2009-02-05T18:02:02.513 に答える