• ベストアンサー

コンパイラ:「CPUに最適化された実行コード」の意味とは

Visual Studioやgccなどの汎用コンパイラに比べて、インテル等のCPUメーカが出しているコンパイラの方が、そのCPUを使ったマシンでは格段に実行速度が速くなると言われます。そのことは概念的にはわかっているつもりなのですが、具体的に、CPUのどのような部分に、どのように適した実行コードが作られて早くなるのかがわかりません。なので理解していないのだと思います。 なにか参考になるページでも構いませんので、情報がありましたら教えて下さい。

  • aneja
  • お礼率93% (379/405)

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

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

参考になりそうなのはこれかな。 http://homepage1.nifty.com/bee/bkey/optimize.html 最適化/値が変化しない参照の除外 辺りからそんな話が出てくるよ コンパイラによって吐くコードが若干違うけれど、より速くなったりする形で出してくれるって話だよね

aneja
質問者

お礼

お礼が遅くなって、どうもすみません。 早速のご回答、どうもありがとうございました。 教えていただいたページ、まさにこういう事を知りたかったので、大変参考になりました。

その他の回答 (2)

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.3

古い(さらに細かい)話ですと、より実効コストの低いコードをはき出すという手段がありました。 例:変数(CPUのAXレジスタ)を0にする場合  MOV AX,0 # 普通の考え方  XOR AX, AX # ちょっとひねった考え方 上の二つのコードはどちらもAXを0にしますが、CPUによって動作完了までのクロック数が違ったりします。 最近のCPUでは予測分岐やパイプラインといった、より複雑な機能で速度差が生じますので上の例ほど簡単ではありません。 後はマルチメディア系によく使われる浮動小数点演算などの専用拡張命令をどう使うかなども含まれるかもしれません。

参考URL:
http://ja.wikipedia.org/wiki/MMX
aneja
質問者

お礼

お礼が遅くなって、どうもすみません。 早速のご回答、どうもありがとうございました。 動作の結果が同じでも内部動作の効率が違うことがあるのですね。参考になりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

今どきだと, 最適化レベルを間違えなければ gcc でも icc でもそんなに速度は違わない気がする. gcc では O0, icc では O2 がデフォルトの最適化レベルなので, このことを無視して「icc でコンパイルしたコードは gcc でコンパイルしたコードより速い」ということはできるけど, 実際には gcc でも O2 でコンパイルすると icc とほとんど変わらなかったりします. 確かにちょっとだけ icc の方が速かったけど, 非常に細かいアーキテクチャの違いまで組み込める分 icc の方が有利かなぁ, くらいの差だったような気がする. まあ, icc だと「ループが消える」とか「関数がごっそり消滅する」とかいう, 恐ろしい「最適化」がかかることもあるらしい.

aneja
質問者

お礼

お礼が遅くなって、どうもすみません。 早速のご回答、どうもありがとうございました。 ループや関数が消えたりするというのは、どっちも展開してしまっているんでしょうかね。gccは汎用だけど、linuxに限ればCPUで圧倒的なシェアを持っているインテルCPUに照準を合わせているところがあっても不思議ではない気がしてきました。

関連するQ&A

  • Visual Studio 2008につまれているコンパイラを知りたい

     今日は、Cの初心者です宜しくお願いします。  win xpでVisual Studio 2008を使っています。  でもこのアプリケーションにつまれているコンパイラを使ってコマンドプロンプトからも使って色々とプログラム作 成の勉強をしたいのですが、例えば、gccというコンパイラなら>gcc abc.cとかけば、実行ファイルが出来ますが、 Visual Studio 2008 ではなんというコンパイラがインストールされているか分かりません。  どこから探してやればコンパイラの名前が分かるのでしょうか。  色々とそれらしきフォルダを探してもコンパイラらしきものが見当たりません。  他のIDEではフォルダを探してすぐに分かったのですが、、、、  宜しくお願いします。

  • 実行速度が速いCコンパイラ

    世にCコンパイラはいろいろありますが、 どのCコンパイラが一番実行速度が速いのでしょうか。 CPUはAthlon64でお願いします。

  • Windows7 に対応したコンパイラを探しています。

    最近OSを Windows7にアップグレードしたのですが、Visual Studio Express Edition が使えなくなりました。 どうやら Windows7 に対応していなかったみたいで、とても困っています。XPモードを使おうかと思いましたが、CPUが対応しておらず不可能でした。 そこで、Windows7 に対応したコンパイラを探しています。 機能は Visual Studio 2008 Express Edition Visual Basic と同等かそれ以上で、無償のものが望ましいです。 条件に合うコンパイラをご存じの方は教えていただければ幸いです。

  • intelのfortran, Cのコンパイラ

    intelのfortran, CのコンパイラのWindows版についてお尋ねします。 コマンドラインで実行しており、そのような使い方で何も困らないのですが、Microsoft Visual studioを使うことも推奨されるようなのです。デバッガはその方が良さそうですが。 そこでお尋ねします。 1.今一度、用途は何でしょうか。 2.Microsoft visual studioは有償のものでないとダメでしょうか。一度、販売店に聞いたら無償のもの(express)は利用できないということでした。腑に落ちないので両者の方の意見を聞きたいのですが。 3.ずっとコマンドラインで使っていましたが、後からvisual studioをインストールしても問題ないでしょうか。 4.ウィンドウズ上で並列処理(CPUを分割して並列処理する)のに必須でしょうか。mpich2を利用するためにvisual studioの環境を利用するという人がいましたが。Linux版はもちろん関係ないわけですが、並列環境を整えることは可能です。考え方がだいぶ違うわけですがどのように考えるのでしょうか。(質問が漠然としています)。 以上、よろしくお願いします。

  • windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでた

    windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでたソースコードです。ファィル名test.c です。Linux(Red Hat9) gccです。windowsのコンパイラーはCPad for Borland C++Compilerです。 #include <stdio.h> void main() //intからvoidに変更した { int i, j; for (i=1; i<=9; i++){ printf("%2d ",i); //%2dで、iが2桁に表示 } printf("\n"); printf("***************************\n"); //この罫線もどきの書き方はダサいので工夫してください for (i = 1; i<=9; i++){ for (j = 1; j<= 9; j++) { printf("%2d ", i*j); if (j == 9) printf("\n"); //1行表示後改行 } } return; //voidにしたので0を取った! } これがLinux(RedHat9)gccでは以下のエラーが出ます。 (test.c: 関数 `main' 内: test.c:4: 警告: `main' の戻り値の型が `int' ではありません)  なぜ、同じソースコードでエラーが起こるのですか?  Linux gccでは、この場合`int' 以外の何が必要なのでしょうか? 以上よろしくお願いします。

  • python codeが 実行出来ない

    簡単なテスト用のpython code(sample.py)を実行するのにエクスプローラーから選択しダブルクリックで立ち上げるとVisual studio codeが立ち上がり、実行できるのですが、Visual Studio Codeを立ち上げ、フォルダーを選択し、そこからsample.pyを実行すると添付図の状態となり、エラーメッセージもなく停止状態になります。 他の****.pyを選択して実行しても同様です。 一度、当該フォルダーを閉じ、別のフォルダーを開いた場合、複数の***.pyがあっても、選択して、夫々実行可能となります。 この例示のch8フォルダーが壊れているという状態ではありません。 何が原因と考えられますか?

  • 32bit、64bitコンパイラーでコンパイルした場合の数値計算の実行

    32bit、64bitコンパイラーでコンパイルした場合の数値計算の実行速度について質問です。 CPUは、Core i7(64bitCPU)、 コンパイラーは、インテルC++コンパイラーVer.10 double(64bit長)型の大規模な数値計算を想定します。 このとき、 IA-32用としてコンパイルして、Windows7 Pro.32bit 上で計算させた場合と Intel64用としてコンパイルして、Windows7 Pro.64bit 上で計算させた場合とでは、 計算速度に差がでますでしょうか? 実行ファイルは、OSを通さずにCPU上でネイティブ実行されると理解しているので、 両方とも、64bitCPU上では、double(64bit長)型の計算なので差は出ないのかな?と思っています。 #Windows7を 32bitにするか64bitにするか(どちらをDSP版で購入するか)で迷っています。 #ご意見をお願いします。

  • .NET 内のコードへステップ実行する方法

    Visual Studio 2015 Community を利用しています。 Visual Studio 2015 Community を利用して .NET Framework 内部のコードへステップ実行できるようにしたいのですが、やり方がわかりません。 以下の URL に載っているようなことを 2015 でも可能にしたいのですが、2008 とは色々と設定が違うみたいでやり方がわかりません。 どこをどのように設定すればいいのでしょうか? Visual Studio 2008で見る.NET Frameworkのソースコード http://www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html

  • Visual Studio のコンパイラがアプリケーションエラー

    Visual Studio 2005 Professional Edition(Visual Basic 2005)を使っています。 プログラム作成中にコンパイラ(エラー一覧に、文法エラー等を表示するやつです)がアプリケーションエラーで当然のように頻繁に落ちます。 ※エラー内容「問題が発生したため、Microsoft Visual Basic Compilerを終了します。ご不便をおかけ・・・」「・・Visual Basicコンパイラを回復できません。システムエラー・・・」 コンパイラが落ちないように、 この自動コンパイル(自動コードチェック)をしないようにVisual Studioを設定する方法をご存知の方、教えて頂けませんでしょうか。 ※いろいろ調べてみたのですがわかりませんでした。

  • GNUコンパイラとIntelコンパイラの違いについて

    今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。 今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?