• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:処理速度を早くしたい!)

処理速度を早くしたい!

このQ&Aのポイント
  • 画像処理ソフトの処理速度が遅くて困っています。原因はメモリ不足とHDDへの頻繁なアクセスだと思われます。質問Aでは、メモリの使用状況を確認するツールを教えていただきたいです。質問Bでは、DLLの展開方法についてアドバイスをいただきたいです。質問Cでは、threadプログラムとopenMPの共存について教えていただきたいです。
  • 画像処理ソフトの処理速度が遅いのは、メモリ不足とHDDへの頻繁なアクセスが原因です。質問Aでは、メモリ使用状況を確認するツールを教えてほしいです。質問Bでは、DLLの展開方法についてアドバイスをいただきたいです。質問Cでは、threadプログラムとopenMPが共存できるか教えてほしいです。
  • 画像処理ソフトの処理速度を早くしたいです。問題の原因はメモリ不足とHDDへの頻繁なアクセスです。質問Aでは、メモリの使用状況を確認するツールを教えてほしいです。質問Bでは、DLLの展開方法についてアドバイスをいただきたいです。質問Cでは、threadプログラムとopenMPの共存について教えてほしいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

現役PGを退いて数年経つとは言え基礎知識が無さ過ぎです。 基本的な部分はWindows2000時点(9年前)からさほど変わっていません。 1)本当にVistaは64bitバージョンなのでしょうか? コード自体も64bitコードとしてビルドしてますか? 質問A) 自分でnewしている部分をメモリ使用量を計測する別関数に置き換えるほうが良いと思います。 質問B) DLLであることは関係ありません。 メモリ常駐させる方法はありますが、使える実メモリを超えていたらエラーになるだけです。 質問C) openMPで展開するスレッド数と同時に走っているスレッドの数が4コアを越えていませんか?走行するスレッド数は、誰も管理してくれないので自分で管理するしかないです。 それと競合しないようにクリティカルセクション等で同期した場合、それがネックで遅くなっていませんか? その他のマルチコアの場合の問題として粒度の細かい処理は効率悪いですが、その点は大丈夫ですか?

ark_kyoto
質問者

補足

ご回答ありがとうございます。 補足させて頂きます。 >1)本当にVistaは64bitバージョンなのでしょうか? >コード自体も64bitコードとしてビルドしてますか? @@@ どちらもYESです(^^) >質問A) >自分でnewしている部分をメモリ使用量を計測する >別関数に置き換えるほうが良いと思います。 @@@ すみません、理解できません。 「newする」とは? 「メモリ使用量を計測する別関数」ってあるんですか? >質問B) >DLLであることは関係ありません。 >メモリ常駐させる方法はありますが、使える実メモリ >を超えていたらエラーになるだけです。 @@@ ボクも実はそう思っていたのですが、 メモリ常駐させる方法をしりません。 教えていただけませんか?m(__)m >質問C) >…スレッドの数が4コアを越えていませんか? @@@ もちろん越えないようにしてます。 >…クリティカルセクション等で同期した場合、 >それがネックで遅くなっていませんか? @@@ 現状では、criticalそのものが発生しない一部の場面でのみopenMPを試したところ、かえって極端に遅くなりました。  他の部分で、openMPでないスレッド関数(なんて呼んだらいいのか知りませんが、openThread()などを使うやつ)もcloseしてるはずですが、openMPに統一しないといけないのかな? >その他のマルチコアの場合の問題として粒度の細かい >処理は効率悪いですが、その点は大丈夫ですか? @@@ すみません、理解できません。 「粒度の細かい」ってなんですか? たぶん、細かい処理が多くあるってことだとしたら、 sectionsで分けてやればよいのでは? それとも並列処理の前後のオーバーヘッドが思ったより時間がかかるから、細かい処理に向いていない、って意味でしょうか? 以上すみません、基礎知識不足で。 もともとハード設計が主な担当だったもんで…(^^;

その他の回答 (4)

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.5

>実は、じつは、私めが作ったのではなく、知らない人が作ったのです。 で、あれば、一度ソースコードを解読してシステム図を作った方が後々楽になれると思います。 その際はリファクタリングをちょっと勉強しておくと改善点なんかが見えてきます。 >いやいや、一応お教え賜れば、なんとかしたい、みたいな… 本来はメモリー破壊やメモリーリークを見つけるソフトですが、いつどれだけメモリーが確保されたか知ることもできます。 Rational PurifyPlus http://www-06.ibm.com/software/jp/rational/products/purifyp/ 私が使っていた当時は3つのソフトでしたが統合してひとつのソフトになったようです。 これでは、バフォーマンス解析のツールも使えます。 価格は18万円くらいだったかも。 体験版があるはずなので使ってみても良いかもしれませんね。 >実は私は、「世界最高速」のシステムを、10数年前に開発して、少し有名になりました。 すごいですね。私はこちらの方が興味あるかも。 まぁ、現在の速度問題はほとんどメモリの使いすぎに起因しているように思われますので、起動時やデータ読み込み時の処理を追うだけでも概要はつかめるかもしれませんね。

ark_kyoto
質問者

お礼

アドバイスありがとうございます。 >Rational PurifyPlus @@@ なんか良さそうなソフトですね! 体験版があればいいな。 探してみますね(^^) >現在の速度問題はほとんどメモリの使いすぎに >起因しているように思われます… @@@ やはりそうですかね(^^; どうもありがとうございました。 いろいろやってみます。 /E

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>すみません、理解できません。 >「newする」とは? 質問A) >「メモリ使用量を計測する別関数」ってあるんですか? C++で開発していると思ってました。 では、 (1)mallocでしょうか? (2)それともグローバル変数の配列ですか? (3)それともまったく別の方法ですか? まず、(1)なら自分でmalloc量を計測して集計する関数を作ってmallocの代わりに呼び出すだけです。 もし(2)なら無駄な使っていない領域はありませんか? (3)なら詳しく方法を教えてください。 質問B) >ボクも実はそう思っていたのですが、 >メモリ常駐させる方法をしりません。 >教えていただけませんか?m(__)m WindowsAPIを使います。 使うなら仮想記憶の仕組みをある程度理解しておいてください。 http://itpro.nikkeibp.co.jp/article/COLUMN/20070816/279802/?P=1 まず、VirtualAllocで論理メモリ空間をコミットします。 http://msdn.microsoft.com/ja-jp/library/cc430204.aspx つぎにそのメモリをVirtualLockでロックしてしまいます。 http://msdn.microsoft.com/ja-jp/library/cc430213.aspx これでスワップされなくなります。 質問C) >すみません、理解できません。 >「粒度の細かい」ってなんですか? >たぶん、細かい処理が多くあるってことだとしたら、 >sectionsで分けてやればよいのでは? 私もopenMPに詳しいわけではないですが、sectionsってブロック毎に別々の処理をするための指示文では?それと終了時に同期にするのでかえって遅くなった印象があるんですが。 >それとも並列処理の前後のオーバーヘッドが思ったより時間がかかるから、細かい処理に向いていない、って意味でしょうか? マルチコアの並列処理はメモリを同期する必要がある(メモリキャッシュを状況に応じて捨てる必要がある)のでオーバーヘッドは大きいのとスレッドの終了処理や開始の処理などでオーバーヘッドがあります。なので、短い時間で終わるスレッドを多重に走らせるとシングルスレッドよりも遅くなります。

ark_kyoto
質問者

お礼

アドバイスありがとうございます。 C++での開発ですよ(^^) (2)グローバル変数の配列ばかりです。 無駄な使っていない領域は、ありそうでないんです。 >WindowsAPIを使います。 >……… >これでスワップされなくなります。 とても参考になりました。 ありがとうございました。 /E

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.3

最近はプログラムしていないので一部だけ。 >「newする」とは? え? >「メモリ使用量を計測する別関数」ってあるんですか? newをオーバーライドして自分でメモリ使用量を管理すれば良い。 http://www.lockon.co.jp/blog/cnewdelete_1.html と、いうか自分で作ったプログラムのメモリ使用量なんかだいたい把握しておくのが普通かと思うのですが・・・ メモリーリークなんて論外です。 >何にメモリをとられているか、分かるツールはないか? ないこともないけど業務用なので高価です。 お小遣いではまず無理。 まぁ、5.6GBのメモリ消費はプログラムとして設計ミスに近いかも。 DLLとかは関係ないと思います。 基本的にDLLは必要な時にメモリにロードされていらなくなったらアンロードされるので。 明示的にメモリにロードさせることもできますが・・・ まずは、メモリ使用量を1GBくらいに抑えるようにしてみてはどうですか?

ark_kyoto
質問者

補足

またまたご丁寧なご回答ありがとうございます、 >自分で作ったプログラムのメモリ使用量なんか >だいたい把握しておくのが普通かと… 実は、じつは、私めが作ったのではなく、 知らない人が作ったのです。 それを私が元PGも経験したとの話で、 処理速度アップを頼まれたのです。 実は私は、「世界最高速」のシステムを、 10数年前に開発して、少し有名になりました。 でもそれは、ハードを中心のシステムでした。 今回はソフトオンリーの世界… それで、苦戦しているわけです(^^; >>何にメモリをとられているか、分かるツールはないか? >ないこともないけど業務用なので高価です。 >お小遣いではまず無理。 @@@ いやいや、 一応お教え賜れば、なんとかしたい、みたいな… 取り急ぎご返事まで。 /E

  • 7o8
  • ベストアンサー率55% (5/9)
回答No.2

SE兼PGを退役して10年経つ私ですが、参考になれば....(^^; >1)なんと実メモリ占有が、5.6GBも(実装8GB) >  (残りメモリが数10MBしか余裕がないようだ) うーむ.... >2)HDDへのアクセスが1分間に300~1100回発生している >  つまり残りメモリが少ないので、ページングしているからか? 残りメモリが数10MBであるならそーでしょうね。 いっそのこと、ページメモリを0にして実行してみたらどうでしょう? それで実行できなければそもそもメモリ不足ですね。 で、そもそもHDDへアクセスするプログラムかどうかは作成者本人が よく存じている問題かと思います。 HDDへアクセスするはずがないプログラムで発生しているのであれば ページングを示しているかと思いますが、ページングさせるくらいなら メモリを節約するようなプログラムに変更しましょう。 たぶん、画像処理という時点ですべてオンメモリさせての動作は無謀です。 ページングはメモリが不足していて発生するものですのである意味、その間は CPUは停止しているのと同等だと思えば遅いのは当たり前ですよね?

ark_kyoto
質問者

お礼

アドバイスありがとうございます。 >画像処理という時点ですべてオンメモリさせての動作は無謀… @@@ そう思います。 思いますが、どれも必要でやってるみたい… やはりメモリ不足が遅い原因かな。 どうもありがとうございました。 /E

関連するQ&A