• ベストアンサー

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% (1622/5659)
回答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

  • Visual C++ 6.0 で作成したプログラムをVisual C++ 2005 でコンパイルしたい

    visual C++ 6.0 で作成したプログラムがあります。このソースリストをVisual Studio 2005 Express Edition の Visual C++ 2005 Express Editionでコンパイルしようとしましたが、#include <Windows.h> でエラーになって先に進みません。対応したWindows.hの入手方法教えてください。 それとも、そもそも、Visual C++ 2005 Express Editionでは昔のVC++のプログラムはコンパイルできないのでしょうか?

  • Cのコンパイル

    新しい職場に移動し、いままで開発したことのないC言語でプログラムを組むことになりました。PCにvisual basic studio .netが組み込まれているのですが、これでコンパイルする方法がまったくわかりません。どうやってコンパイルすればいいのか、またはコンパイルする方法が書かれた資料などありましたら、教えてください。

  • C++プログラムに変換

    Visual Studio .NET 2003を使っているのですが、C#のプログラムをC++のプログラムに変換して使用したいのですが、可能でしょうか? またVBのプログラムもC++に変換して使用したいのですが、可能でしょうか? どうか教えてください。

  • VisualStudio c++の使い方

    最近になってvisual studioのc++をインストールしました。 学業の関係で学校のほうでプログラムを組むことが多いのですが、 そのときはいつもterapadでプログラム作成し、 teratermでコンパイル、実行をしています。 家ではVSが楽で万能ということで入れたのですが使い方がさっぱりです。 外で作ってきたプログラムをコンパイル・実行したい場合はどこに保存しどのようにすればいいのでしょうか?

  • C/C++

    こんばんわ 最近C/C++を始めたものです 最終的な目的はC/C++で書いた掲示板を作成し、 サイトのコンテンツの一部とすることなのですが まだ始めたばかりなので hello worldのスクリプトを作ることにしました 今はvisual studio .NET を使っているのですがvisual studio .NET を使わないでプログラムをウェブサーバ上で 動かすことは出来るのでしょうか? また出来るとしたらそれに必要なソフトウェアはどのようなものが必要なのでしょうか? それとvisual studio .NETを使い、コンパイルやリンクを行うとvcprojやicoやncbなど色々な拡張子のファイルが出来るのですが どのファイルにアクセスすればhello worldという文字のスクリプトを見ることが出来るのでしょうか? 最後にコンパイルはマシン語にすることなのはわかるのですがリンクとはなんなのでしょうか? リンク と調べると当たり前のようにハイパーリンクの説明が出てきまして・・・ 一気にいくつも質問をさせていただきましたが ばらばらに質問するよりはいいかなと思い一気にさせていただきました どれか一つでもご存知の方おられましたら是非 ご教授ください よろしくお願いします

  • C++ 2005 データ取得プログラム

    Visual Studio 2005 イーサネットによるデータ取得プログラム Visual Studio 2005 C++ 用いて,計測センサからイーサネットを通してデータを取得して表示させるプログラムを教えてください. 初心者なので,できれば詳しく教えて欲しいです.

  • LiEというプログラムを使いたいのですが、やり方がわかりません…

    LiEというプログラムを使いたいのですが、使い方、というか使うまでの過程で何をすればいいのか全くわかりません。 プログラム自体は以下のサイトで落とせるのですが、同サイトのマニュアルを読んでみたところ、どうやらプログラムはC言語で書かれていて、使うためにはコンパイルして.exeに書き換えないといけないらしいです。(あまりこのあたりの専門用語の意味をよく理解していません。よくわからないことを言っていたらすいません…) http://www-math.univ-poitiers.fr/~maavl/LiE/ 知り合いに聞いてみると、Visual Studioというソフトでコンパイルできると言っていたのでやってみたのですが、エラーが大量に出てきました。 知り合い曰く、Visual StudioはC++を読みとるソフトで、C言語は読みとれないのだとか。 そこでC言語を読みとれるソフトを探したのですが、どこにあるのか全くわかりません… 結局のところ、LiE.exeというプログラムを手に入れ、それを起動できる状態にしさえすれば、あとはマニュアルを読めばなんとかなると思うのですが、そこまでたどり着けません… どうすればプログラムを起動することができるのか教えていただけないでしょうか? プログラミングに関する知識はほぼ皆無なので、常識的なことから教えていただけると助かります。

  • Visual C++ Express Edition でもprintf

    Visual C++ Express Edition でもprintfを使いたい 私は、Visual C++ 2008 Express Editionを使っています。  以前はVisual Studio 2005 Professionalを使っていました。 今まではプログラムを走らせている間の変数の変化を見るために、 printf関数を使って「出力」ウィンドウに数値を表示させていました。 Visual C++ 2008 Express Editionに変更してから、 同一のソースコードをコンパイル、実行しても printf文で記述した出力内容を「出力」ウィンドウに表示させることができません。 これは、Express Edition特有のものでしょうか? printfを使って変数を表示できる方法があれば教えてください。 よろしくお願いします。

  • RS-232C接続のための VS 2008 C++のプログラム

    RS-232C接続のための VS 2008 C++のプログラム パソコンとRS-232Cで接続することで制御できるパトライト(PHE-3FB)を渡され、今週中に動かしたいのですが、私はプログラミング経験が非常に浅くどうしても、動かすことができません。加えて、実装の環境が「Visual Studio 2008 C++」のみに限られており、大変困っています。 こんな、初心者の私でもRS-232Cの通信プログラムが書けるようなサイトはないでしょうか。 Windows Visual studio 2008 C++ で書かれたサンプルプログラムのようなものがあれば非常に助かります。。。 どなたか、助けてください・・ 追記 MSCOMMコントロールはWindows Visualstudeo 2008 C++にはないのでしょうか・・

  • スタートの全てのプログラムでVBとc++が少し違う

    ・Microsoft Visual Basic 2008 Express Edition ・Microsoft Visual C++ 2008 Express Edition の2つをインストールしました。 しかしスタートの全てのプログラムを見ると C++ の方はフォルダにはいっていて、 VBの方はそのまま(裸のまま)プログラム一覧に表示されています。 Visual C++ の方はフォルダの中身は ・Microsoft Visual C++ 2008 Express Editionのアプリケーションと ・Visual Studio Toolsフォルダです。 Visual Studio Toolsの中には Visual Studio 2008 コマンド プロンプト が入っています。 これは標準の配置ですか? もしかしたら私が知らぬ間にいじったのか気になります。 OSはvistaです。 よろしくお願いします。