0

すべてのグルからの簡単な意見が必要です!

いくつかの行列計算を行うプログラムを開発しました。小さなマトリックスで問題なく動作します。ただし、BIG数千列の行行列の計算を開始すると。それはスピードを殺します。

各行で処理を行い、結果をファイルに書き込み、メモリを解放して2行目の処理を開始し、ファイルに書き込むなどを考えていました。

速度の向上に役立ちますか?この変更を実装するには、大きな変更を加える必要があります。だからこそ、あなたの意見が必要です。どう思いますか?

ありがとう

PS: コルトとジャマ マトリックスについては知っています。社内規定により、これらのパッケージを使用することはできません。


編集済み

私のプログラムでは、すべての行列を 2 次元配列に格納していますが、行列が小さい場合は問題ありません。ただし、数千の列と行がある場合。次に、計算のためにこのすべての行列をメモリに保存すると、パフォーマンスの問題が発生します。行列に浮動値が含まれています。処理のために、メモリ内のすべての行列ストアを読み取り、計算を開始します。計算後、結果をファイルに書き込みます。

4

4 に答える 4

3

メモリは本当にボトルネックですか? そうでない場合、ファイルへの書き込みを停止すると、代替手段よりもはるかに遅くなるからです。おそらくアルゴリズムの制限が発生しているようです。

おそらく、最初にアルゴリズムの最適化を検討する必要があります。

そして、すべてのパフォーマンスの問題について私がいつも言っているように、人に尋ねることは 1 つのことですが、試してみる以外に方法はありません! 実際のパフォーマンスが測定可能であれば、意見は関係ありません。

于 2010-08-27T23:23:34.337 に答える
2

変更を開始する前に、コード内でプロファイリング ツールとタイミング ステートメントを使用して、パフォーマンスの問題がどこにあるかを正確に把握することをお勧めします。

問題ではない何かを「修正」するのに長い時間を費やすことができます。あなたが提案したファイルIOが実際にあなたのコードを遅くすると思います。

コードに、各要素を処理する別のループ内にネストされたループが効果的に含まれている場合、行列のサイズを大きくすると、速度が急速に低下することがわかります。もしそうなら、注目すべき領域は、データを並行して処理し、コードが複数の CPU/コアを利用できるようにすることです。

多次元配列ではなく、疎行列データ構造のより効率的な実装を検討してください (現在使用している場合)。

于 2010-08-27T23:24:17.523 に答える
2

NxN を NxN で乗算すると、2xN^3 の計算が必要になることを覚えておく必要があります。それでも何時間もかからないはずです。2 番目の行列 (約 30%) を転置することで改善が得られるはずですが、実際には何時間もかかるべきではありません。

したがって、N を 2 倍すると、時間が 8 倍になります。さらに悪いことに、キャッシュに収まるマトリックスは非常に高速ですが、数 MB よりも長く、メイン メモリから取得する必要があるため、操作がさらに 2 倍から 5 倍遅くなります。

データをディスクに置くと、計算が本当に遅くなります。これは、martix がメモリに収まらない場合にのみ行うことをお勧めしますが、10 倍から 100 倍遅くなるので、もう少しメモリを購入することをお勧めします。(あなたの場合、マトリックスはメモリに収まるほど小さいはずです)

私は Jama を試しました。これは 1 次元配列ではなく 2 次元配列を使用する非常に基本的なライブラリで、4 年前のラボトップで 7 分かかりました。最新のハードウェアを使用し、複数のスレッドを使用するだけで、この時間を 1 分未満に短縮できるはずです。

編集: Xeon X5570 を使用して、Jama は 2 つの 5000x5000 行列を 156 秒で乗算しました。私が書いた並列実装を使用して、この時間を 27 秒に短縮しました。

于 2010-08-28T07:28:56.833 に答える
1

JDK の jvisualvm でプロファイラーを使用して、時間が費やされている場所を特定します。

アルゴリズムがどのようにスケーリングするかを特定するためにいくつかの簡単な実験を行います。N^3 で実行する場合 (リストを配列で乗算する場合は一般的です)、入力サイズを 2 倍にすると、実行時間が 8 倍になります。

于 2010-08-28T06:27:52.373 に答える