• ベストアンサー

C++で組んだプログラムの高速化について

数値シミュレーションに興味があり、C++でプログラムを組んでみたのですが、 Visual Studio 2008でコンパイルした場合、計算に非常に時間がかかってしまいます。 もし計算速度を向上させる方法がございましたら、教えて頂けませんでしょうか? できるだけ無料かつ簡単な方法が望ましいです。 よろしくお願いいたします。

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.5

基本的にはみなさんの書かれている通りですが、プロファイラが使えるのならまずそれを使って時間のかかる部分を特定します。 アルゴリズムが変えられるのならそれも試してみてください。 シミュレーションの本体部分は多重ループになっていることが多いので、その部分が時間がかかるはずです。 多重ループの一番内側をベクトル化できないか考えます。その部分にif文があればできるだけ外に出します(if文はベクトル化を阻害します) もしループの実行中にデータの依存関係があれば、それを無くせないか検討します。依存関係を無くせば並列化ができます。 それらができれば結構速くなる可能性があります。 その辺りのソースコードを書いてもらえれば、考えてみますが。

yy2406
質問者

お礼

ご回答ありがとうございます。 仰るとおり、多重ループやループ内にif文は複数存在しているプログラムとなっています。 そのようなことが計算速度に影響するとは思いませんでした。 プロファイラやベクトル化等の用語の意味がよくわかりませんので、一度調べてみたいと思います。 やはりプログラミングは一筋縄ではいきませんね。 ありがとうございました。

その他の回答 (7)

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.8

並列プログラミングを調べるといいのでは。 (VC++2010からは既定で出来ます)

yy2406
質問者

お礼

VCでも並列化はできるのですか。 知りませんでした。 貴重な情報ありがとうございました。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.7

No.5です 「ベクトル化」というのはIntel CPUの場合はSSEを使って計算することを指します。単精度浮動小数点の場合は4または8個の計算が同時にできますので結構速くなります。SSEを使うには制限があって、使えるようにプログラムを書く必要があります。 Intelのコンパイラは他のコンパイラに比べて速いバイナリを作ってくれる傾向がありますが、速いバイナリを作れるようにプログラムを書かないと速くなりません。どの部分が速度を上げられる可能性があるかは、普通はコンパイラの最適情報出力を見て判断します。(市販のコンパイラだと可能) こればっかりはソースコードを見ないと分からないし、コンパイラによっても得意不得意がありますので、試行錯誤になります。 CPUコアが4つの場合だと、何も考えずに書いた場合に比べて、ベクトル化と並列化ができれば10倍程度速くなることもあります。 最近ではGPUが使えますので、openACC対応のコンパイラがあれば、手軽に試すことができます。しかしよほど条件が良くないとCPUの方が速い結果になりますが。

yy2406
質問者

お礼

再度アドバイスして頂き、ありがとうございます。 ベクトル化や並列化を行うことで10倍程度も早くなることがあるのですね。 一度検討したみたいと思います。 ありがとうございました。

  • racene
  • ベストアンサー率70% (21/30)
回答No.6

> まったく同じプログラムで計算させた場合であっても、コンパイラーが違えばまったく計算速度が違うと聞いた気がしましたので、そのようなコンパイラーがあれば、と思ったのですが私の記憶違いだったのでしょうか・・・。 Intel C++ Compiler のことでしょうか? 確かに VC++ よりは Intel Compiler のほうが早くなることが多いです。 ただ、どれくらい早くなるかは場合によるので、やってみないとわかりません。 「計算に非常に時間がかかって」というのが、「計算に1週間以上かかる」などといったことであれば、アルゴリズムを変えたり並列化することを検討したほうが良いと思います。

yy2406
質問者

お礼

お礼が遅くなり、申し訳ありません。 おそらくIntel Compilerだと思います。 しかし非常に高価なものですね・・・。 皆様がおっしゃっている並列化を検討してみたいと思います。 ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

まずは、何に時間がかかっているのかを突き止めましょう。

yy2406
質問者

お礼

どの部分の計算に時間がかかっているのかはわかってはいるのですが、 まったく同じプログラムで計算させた場合であっても、コンパイラーが違えばまったく計算速度が違うと聞いた気がしましたので、そのようなコンパイラーがあれば、と思ったのですが私の記憶違いだったのでしょうか・・・。 ご回答ありがとうございました。

回答No.3

あとは複数のプロセッサで並行処理することで高速化できるか...てとこでしょか。

yy2406
質問者

お礼

なにかフリーのソフトで自動的に並列化処理をしてくれるのではなく、 じぶんで並列化したプログラムにする必要があるということでしょうか? 何やら非常に敷居が高そうですね・・・。 参考にさせていただきます。 ご回答ありがとうございました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

シミュレーションの方法を考え直す(処理効率のよいアルゴリズムを探すということです)。

yy2406
質問者

お礼

参考にさせていただきます。 ご回答ありがとうございました。

  • K66_FUK
  • ベストアンサー率22% (188/824)
回答No.1

最適化しかないです。 あるいは64bitで拡張した宣言を利用する long long int型とか、あんまり詳しくないですが。 VC2010 expressなら64bitネイティブありますし。 当方VC2010で組んだロト6の予想プログラムで、64bitで最適化したら試行回数2000万回に20分かかったのが5分まで短縮されましたよ。

yy2406
質問者

お礼

ご回答ありがとうございます。 最適化のことはよくわかりませんが、変数の宣言の仕方を変えるだけで驚くほど計算速度が向上するのですね。 一度試してみたいと思います。

関連するQ&A