• ベストアンサー

アセンブリでプログラムの高速化をするには

アセンブリレベルでのプログラムの高速化ができるようになりたくて、アセンブリを勉強し始めた者です。 質問なのですが、CPUは新しくなるにつれて命令が増えたり、製品によって微妙に違ったりしますよね。そういうCPUの命令の種類を知るにはどう調べたらいいのでしょうか?「core 2 アーキテクチャ」等と調べてみましたが、思うような情報が出てきません。CPUの仕様書みたいな物がメーカーから配布されていたりしますか? また、もし「Windowsパソコンで超高速に処理を行うコンポーネントを作ろう!」と思ったら、Windowsパソコンで使われている様々なCPU(coreとかPentiumとかAMDのCPUとか)に合わせてアセンブリ(アセンブリが対応していない場合は機械語)や命令セットを知り、CPUに特化したプログラムを書いていかなければならないでしょうか。CPUは本当に種類が多いので、それは死ぬほど大変なような気がします。それとも、CPUにはある程度の互換性があって、そこまで細分化してプログラムを書く必要はないですか? 質問は上記の2つです。回答よろしくお願いします。

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

  • ベストアンサー
noname#29459
noname#29459
回答No.1

どのような命令語フィーチャーがサポートされているかは、CPUID命令で取得できます。  命令セットの仕様は、Intel,AMDそれぞれのサイトでありますが、どういう調べ方をしているのでしょう?  基本は、その応用に応じた高級言語で書いて、ボトルネック部分を、プロファイラーなどで、あぶり出して、そこの最適化を計るというのが定石だと思います。

noname#113783
質問者

お礼

グーグルで検索をかけていましたが、インテルのサイトへ行ったら見つけられました! ボトルネックは手動で探していたのですが、フリーのプロファイラを入れてみたので、これを使おうと思います。 回答ありがとうございました!

その他の回答 (2)

回答No.3

CPUの仕様はメーカーが出してます。 アセンブリで書くなら、コードの互換性は考えません。 設計モジュールの互換性は考えます。 単純にCで書いてコンパイラ任せより少し早くしたいていどなら、 コンパイラにアセンブリを吐き出させといて、 速くできそうな所だけ書き直したりしてます。 でも最近のコンパイラは頭いいですよ・・・。

noname#113783
質問者

お礼

 >>でも最近のコンパイラは頭いいですよ・・・。 本当に速いコード吐き出してくれますよね。改良の余地が無くて残念なくらいです。 回答ありがとうございました!

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

CPUの仕様書はもちろんCPUのメーカーが出しています。 また、「このCPUではSSE3命令(←これは例です)が使えるか?」をプログラムから調べる方法についてもガイドラインが出ています。 > Windowsパソコンで使われている様々なCPU(coreとかPentiumとかAMDのCPUとか)に合わせてアセンブリ(アセンブリが対応していない場合は機械語)や命令セットを知り、CPUに特化したプログラムを書いていかなければならないでしょうか。 本当に高速化の限界をギリギリまで追求するなら、そうすることになると思います。CPUの種類だけでなく、CPUキャッシュのサイズやメモリの速度、パイプラインの長さなどまで考慮しなければいけないでしょう。 普通はそこまで頑張ることはあまりなくて、「この拡張命令が使えるCPUの場合には専用のルーチンを呼ぶ」くらいで十分ですが。

noname#113783
質問者

お礼

 >>「この拡張命令が使えるCPUの場合には専用のルーチンを呼ぶ」くらいで十分 そこまで細かくやらなくてもいいんですね。良かったです。 回答ありがとうございました!

専門家に質問してみよう