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

このQ&Aのポイント
  • 32bit、64bitコンパイラーでコンパイルした場合の数値計算の実行速度について質問です。
  • IA-32用としてコンパイルして、Windows7 Pro.32bit 上で計算させた場合と Intel64用としてコンパイルして、Windows7 Pro.64bit 上で計算させた場合とでは、計算速度に差がでますでしょうか?
  • 実行ファイルは、OSを通さずにCPU上でネイティブ実行されると理解しているので、両方とも、64bitCPU上では、double(64bit長)型の計算なので差は出ないのかな?と思っています。
回答を見る
  • ベストアンサー

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版で購入するか)で迷っています。 #ご意見をお願いします。

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

  • ベストアンサー
  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.3

もう少し説明しておきます。 >実行ファイルは、OSを通さずにCPU上でネイティブ >実行されると理解しているので、 >両方とも、64bitCPU上では、double(64bit長)型の >計算なので差は出ないのかな?と思っています。 そうではありません。k=i+j; という足し算を、64ビット用としてコンパイルしたら、コンパイラが作るアセンブラ・コードは MOV RAX,i   //CPU内のRAXレジスタにiのデータを移動 MOV RBX,j   //CPU内のRBXレジスタにjのデータを移動 ADD RAX,RBX  //64ビットの加算 RAX←RAX+RBX MOV k,RAX   //CPU内のRAXレジスタのデータを kに格納 ですが、32ビット用としてコンパイルした場合は MOV EAX,i(下位32ビット) MOV EBX,j(下位32ビット) ADD EAX,ECX    //32ビットの加算 EAX←EAX+EBX MOV k(下位32ビット),EAX MOV EAX,i(上位32ビット) MOV EBX,j(上位32ビット) ADC EBX,EDX    //くり上がり付きの32ビットの加算 EAX←EAX+EBX+くり上がり MOV k(上位32ビット),EAX というアセンブラ・コードが出力されます。コンパイルの段階で32ビット演算と64ビット演算に区分けされてしまうわけです。

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

その他の回答 (3)

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.4

すみません、ADD,ADCでのレジスタ名を間違えたので訂正です 32ビット用としてコンパイルした場合は MOV EAX,i(下位32ビット) MOV EBX,j(下位32ビット) ADD EAX,EBX    //32ビットの加算 EAX←EAX+EBX MOV k(下位32ビット),EAX MOV EAX,i(上位32ビット) MOV EBX,j(上位32ビット) ADC EAX,EBX    //くり上がり付きの32ビットの加算 EAX←EAX+EBX+くり上がり MOV k(上位32ビット),EAX

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

当然、64ビットのほうが、理論上、加減算は2倍、乗除算は4倍速いです。 OSの速度は64ビットと32ビットで差がないだろうと無責任に書いてあるサイトがありますが、私がVista32ビットと64ビットを使ってみたところでは、64ビットが格段に速いです。使っているソフトはほとんどが32ビット版なので、APIの速度差だけのはずですが、はっきり体感上に差が出ます。 64ビット版で動かないソフト(ほとんどの32ビットソフトは動きます。16ビットソフトは動かないでしょう。)を使いたい場合以外は、64ビット版OSにするべきです。

ycuhakecha
質問者

お礼

そうなんですね。 ありがとうございました。

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

64BitCPUで64Bitネイティブコードを実行した場合はメモリアクセスが1回で終了します。 32BitCPUで32Bitコードで64Bitの計算をさせるにはメモリに2回アクセスする必要があります。 実際は、汎用レジスタに計算結果等が保持されるでしょうが、32Bitのレジスタの場合は2つのレジスタを利利用しなくてはならない等オーバーベッドが生じます。

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

関連するQ&A

  • 数値計算の高速な実行

    Fortranで記載している数値計算プログラムを高速に実行したいのですが、 1) コンパイルは64bitで行なった方が早いでしょうか? 2) 現在お薦めなCPUはCore 2 Duoでしょうか? コンパイラはintel fortran、OSはCentOSを使用予定です。 その他、数値計算の高速化に関してお薦めがありましたらお願いいたします。

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

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

  • 数値計算の速度について

    ノートPCとデスクトップで 以下に相当する数値計算を比較しました。 double sum=0.; for(int i=0;i<1000*1000*1000;i++){ sum+=1./(double)(i+1)/(double)(i+1); } スペック等は以下のとおりです。 ノートPC 機種:Dell inspiron 1501 CPU:Athlon 64 x2 周波数については必要なら明日書きます。 OS:windowsXP 実行環境:Eclipse上でJava デスクトップ 機種:IBM IntelliStation M Pro CPU:Core 2 Duo 6700 2.66GHz OS:Ubuntu8.10 実行環境:C++(コンパイラはg++) すると、ノートPCでは21秒(たぶん実時間?)、 デスクトップでは28秒(CPUタイム)となり、 ノートPCのほうが速いという結果になりました。 なぜこの様な結果になるのでしょうか? デスクトップのほうがいいCPUを用い、 同条件ならC++はJavaよりも速いはずだと思います。 自宅PC用にIBM IntelliStation M Proを購入したのですが、 思いのほか遅くて多少がっかりしました。 ひょっとすると、計算速度を上げるコツがあるのでしょうか?

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

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

  • 64bitの実行ファイルを実行する場合

    開発機(64bit)でCのソースをコンパイル・実行ファイル作成をし、本番機(64bit)に実行ファイルだけFTP転送します。 そして本番機には64bitのCのコンパイラ(cc)は入ってなく、32bitのものが入っています。 そういう環境のせいか、signal 11を出してプログラムは停止します。 #開発機では正常稼動しています Cの実行ファイルが実行されるときはコンパイラが影響するものなのでしょうか? #影響するようでしたら上記エラーが出るのも納得できるのですが。。 申しわけありませんが、何かアドバイスがありましたらよろしくお願いします。

  • 32bitでコンパイルするには

    お世話になっております。 CentOSの64ビットマシンを使っています。 C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。 これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。 次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。 gcc -m32 -o sample sample.c /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status 解決方法について教えていただければ幸いです。 コンパイラは、gcc-4.4.7-3.el6.x86_64をインストールしています。 よろしくお願いします。

  • 計算機のスペックとプログラム実行速度について

    以下のような2つのPCがあります。 A Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 2.81 GHz B Intel(R) Core(TM) i9-10900X CPU @ 3.70GHz 3.70 GHz この計算機に全く同じソースコードで同じコンパイラで実行させてみました。両者とも高速化に関する工夫を全くしない状態です。 言語はFortranで、コンパイラはgfortranです。時間発展計算で、計算の実行時間は1時間ぐらいでしょうか。 私はコンパイラの性能の分だけの違いが出るはずだと思っていましたのでBの方が3割ぐらい早いかなと思っていたのですが。実行の様子をみるとほぼ互角でひょっとするとAが勝っているような感じです。 計算の進行に従って画面にプリント表示する時間ステップの進行速度での印象です。 高性能のCPUの力を出し切るような環境になっていないとその性能は引き出せないし、逆の結果にさえなるということでしょうか。 CPUの性能をフルに引き出すにはソースコードの工夫、高機能コンパイラ、最適なコンパイラオプションの選択ということになるのでしょうか。Aの方も同様に工夫しても高速化が改善されずBがどんどん早くなる、ということなのでしょうか。

  • コンパイルの実行の仕方

    初めてプログラミング言語を授業でとったのですが、 コンパイルの【実行】の仕方がわかりません。 まず、コマンドプロンプトを開くまではわかったのですが、 学校での説明に 「javaのコンパイラはjavacであるので、以下のように指定する。 javac <ソースファイル名> 」 と書いてありました。 コンパイラというのは上記の場合、コマンドプロンプトに 「C:\>javac *****.java」を入力すればコンパイルしたということになるのでしょうか? 「指定する」とかいてあっても指定の仕方すらわからないのです。 コンパイルを検索してもなかなかコンパイルをする意味がよくわからないので、よろしければ教えてください。

  • 32bitで作ったアプリケーションの64bit環境へのコンパイル

    32bitで作ったアプリケーションの64bit環境へのコンパイル 現在、32ビット環境で作ってWindowsXPで正常に動作しているアプリケーションを、 Windows7などの64ビット環境でWOW64を介せずに起動できるように、x64用に コンパイルしようと考えています。 今まではVC++2008EEとWindowsSDK,DirectX9を使って組んでいましたが、 ExpressEditionだとx64向けのコンパイルができないと言うことで、2010EEと WindowsSDK7.1をインストールし、その後構成マネージャで設定をx64にして XP32bit上でコンパイルしました。ソースコードは全く手を加えない状態だったので、 何かエラー・警告があるかと思いましたが、警告も出ずコンパイルは通り、 64ビット環境で起動することも出来ました。 しかし、起動した直後に処理が非常に重くなり、FPSも10~20程度ではないかと 言うほどに動作がもっさりとしてしまいます。 起動しないわけではないし、動き自体も低速ながら、期待されたもしくは XP32bitで起動したときと同じように動いているように見受けられます。 よく見るポインタの長さに関しての問題等も、そもそもあった場合エラーが出て 落ちてしまうのではないかと思います。現状ソースを修正するにしても、 エラーも何も出ていないためどこにどう手を加えたらいいのか分かりません。 なにか原因となるものに心当たりがあればご教授いただけると幸いです。 使用ソフトは上記のようにVC++2008と2010、WinSDK,DirectXともにSDKは (おそらく)最新版でリンクするライブラリのパスにはx64のフォルダを指定、 プリプロセッサの設定で_WIN64を定義しています。 コンパイラも、起動出来てはいるので64ビットのコードを吐くものに 設定されていると思います。

  • 並列化プログラムのコンパイル環境と実行環境が違う

    fortran77で物理計算をしています。 パソコンが2つあって、一つは個人で使うもので、もうひとつはスパコンです。 個人PCのコンパイラはifort、スパコンはfrtが入っています。 普段は個人PCのifortでコンパイルしてからスパコンに実行ファイルを転送して走らせています。 今のところこれで問題ありません。 このプログラムを並列化して計算時間を短縮しようかなとおもっています。 mpiなりopenMPなりでプログラミングして、(もしくはifortの自動並列化コマンドを使う) (1)ifortでコンパイルしたものをスパコンに送って走らせる方法 と、 (2)スパコン内のfrtでコンパイルして走らせる方法 では 実行速度は劇的に変わるものでしょうか? frtの使い方がイマイチわからずmakeが通らないので出来れば避けたいなと思って質問させていただきました。 勉強不足な点があると思いますが、よろしくお願いします。