C言語関係掲示板

過去ログ

No.348.処理速度の向上とメモリーの節約方法について

[戻る] [ホームページ]
No.2244

処理速度の向上とメモリーの節約方法について
投稿者---よっち(2002/07/30 17:26:10)


膨大な大きさの行列のN乗計算(といってもちょっと普通の計算方法ではなく、0*X=X*0==0,X*Y=Y*X==X+Y、という計算など条件によって計算方法がかわるのですが、)をしたいのですが、あまりにも大きいため計算に時間がかかってしまいます。また、メモリーも節約したいので0をなくした構造体を使用しています。
というわけで、ちょっとうまくやりたいことを説明できないのですが、単純に行列などの繰り返し文を多用するプログラムの処理速度を速くするコツとメモリーを節約するコツなどありましたら教えてください。

ちなみにプログラム等は下記に置いておくので良かったら見てください。
http://wwwsv1.u-aizu.ac.jp/~m5061210/matrix/


No.2245

Re:処理速度の向上とメモリーの節約方法について
投稿者---shelly(2002/07/30 17:58:17)


220行目のmemsetはずすだけでもちょっとは速くなるんじゃないかな?
ループがある程度まわるのなら、ですけど。

行列計算は経験がないので、他の方を待ちます。
ピンポイントにどこの部分が遅いとか、メモリを実際どれくらい消費しているかとか、調べてみてますか?
調査することからはじめてみてはどうでしょう。


No.2252

Re:処理速度の向上とメモリーの節約方法について
投稿者---kikk(2002/07/31 16:57:37)


ども。


高速化や省メモリの必要性の議論はおいておくとして。
ほとんどの場合は、アルゴリズムがどうしようもないものでない限り、
メモリと速度はトレードオフになります。

(他の方のレスにもありますが)まず、ボトルネックやメモリ消費量の検討を
してください。コンパイル時に必要なオプションを指定した後、tcovかgcov
で各行の実行回数が得られます。たくさん実行されているところを重点的に
攻めてください。また静的なメモリ消費量はmemでわかります(使わなくても
だいたいはわかりますが)。

それと(正しく動くことが確認できたあとで)コンパイラの最適化を最強に
してください。gccでは普通は-O2か-O3で足りますが、全部ONになるわけでは
ないようなので、別途必要なものをONにしてください。なお、実数の場合に
精度を犠牲にするオプションもあるので注意してください。


疎行列の格納方法は検索すればいくつかでてきますが、基本的には非零成分
のリンクリストになるようです。詳細は、数値解析や有限要素法の本を
あたってください。

ざっとみたところ、そういうふうに作ってあるようですが、行列のべき乗
計算の部分で、普通の配列表現に戻しているようですが、そのまま計算
できると思います。
#コード中に乗算が1回も出てこないのは何か特別な条件がある?

それと最内周ループで関数を呼ぶのはどうかと思います。どうしても関数に
したいならば引数付きマクロかインライン関数を使ってみてください。また
ループ中の条件分岐が多いのでどうにかしてループの外に追い出してみて
ください。
#最内周ループの中身は最初に書くといいかもしれません


もっと速度がほしい場合はループ展開をしてください。コンパイラでの展開
は効かないことがありますので。あと、2進アルゴリズムの適用を検討して
ください。配列でデータを保持しているならさらにキャッシュの話がある
のですが、今回は無理でしょう。


これからさらにいろいろ手をいれるかもしれませんが、そのまえにコードの
見通しをもっとよくしておいたほうがよろしいかと。


では。

No.2261

Re:処理速度の向上とメモリーの節約方法について
投稿者---よっち(2002/08/01 13:31:29)


ありがとうございました。
ご指摘のあったように、まずいろいろ調べてみたいと思います。
また何かあったら、よろしくお願いします。