• ベストアンサー

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

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

noname#113783
noname#113783

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

  • ベストアンサー
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の場合には専用のルーチンを呼ぶ」くらいで十分 そこまで細かくやらなくてもいいんですね。良かったです。 回答ありがとうございました!

関連するQ&A

  • アセンブリ命令、命令セットアーキテクチャ等の用語

    ソフトウェア中心の技術者です。 コンパイラからアセンブリ言語を吐き出させ、そこからプロセッサ内部の動作を詳しく解析していたいと思っています。そうしたところ、先輩から「そういうことなら、命令セットアーキテクチャを勉強するといいよ」、とアドバイスをもらいました。 ここで質問なのですが、 1 「アセンブリ命令」と「命令セット」とはほぼ同じ言葉だと思って差し支えないでしょうか? 2 また、「命令セットアーキテクチャ」とは、「決定した命令セットから成るプロセッサ内部の仕様」と思って良いのでしょうか? 例えば、ジャンプ命令を受けたときには、構造的にどのようなしくみでプログラムカウンタのデータを変えるか、とかを規定したしくみそのものと理解していますが、それで正しいでしょうか?  以上、よろしくお願いします。

  • virtualboxの高速化

    windows vista上に仮想化ソフト、virtualboxを使って、Fedora Core6をインストールしました。しかし、仮想マシン内の動作が遅く困ってます。CPU(ちなみにCPUは、AMD Mobile sempron 3200+ です)などを交換せずに、すこしでも高速化できる方法または設定はありますか?? おねがいします.

  • CPUをより高速にしたい

    パソコンは富士通FMVFG50TWでCPUはCeleron(R) Dual-Core CPU T3100 @ 1.90GHz 1.90 GHzです。もっと高速にしたいのですが可能性のあるCPUを教えてください。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • マシン語

    CPUのアーキテクチャをデータベースの構造で表現して、それに基づいてマシン語を自動生成するシステムを実現するシステムを作ることは可能でしょうか? ソースコードで作成したプログラムをマシン語に変換してそのマシン語コードを記述したファイルを保存しておき、以後はそのマシン語ファイルを直接実行させるにはどうしたらよいでしょうか? Java+C+アセンブリを使ってシステムを作るにはどうしたらよいでしょうか? CPUのアーキテクチャを解析するソフトはあるでしょうか?

  • Windows Xpの最適な高速化ソフトはどれでしょうか?

    どうも、初です。 最近パソコンが、ものすごく遅いんです。 デュアルコアのCore2Duo E6300を乗せているのですが デュアルコアの性能を発揮できていないような気がします、どのような高速化ソフトを使ったほうがいいのでしょうか? 若しくは、重いプログラムをアンインストールしたほうがよいのでしょうか?? スペック: CPU: Intel Core2Duo E6300 MEMORY: DDR2-533 1GB HDD: Seagate 160GB MB: GIGABYTE GA-965P-S3 Ver.1.0 以上のスペックで早くする方法を教えてください *できればフリーで

  • 数値計算の高速な実行

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

  • CPU

    最近のCPU(Athron64,core i7等)は64bit対応となっておりますが、これは本当にプロセッサの内部動作やALU等が64bitなのでしょうか?それとも実際の内部動作やアーキテクチャは32bitでありながら、仮想的に64bitアーキテクチャ(64bitのマイクロコード命令を持たせているだけ)を構成しているのでしょうか?ちょっと単語の使い方が厳密性にかける質問で申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • CPUに当たり外れはありましたか?(歴史)

    こんにちわ。 今までインテルのCPUが搭載されたパソコンを何も気にせずに使ってきました。 動作が重い(遅い)パソコンと早いパソコンがあるのは体感的に知っているのですが、CPUによって当たり外れはあるのでしょうか? ここ1か月ほどCPUについて調べており、インテルやAMDなどのメーカーが 新製品(CPU)をどんどん発売してきている歴史や新アーキテクチャを送り出している ことを知りました。 今までで「これは良かった!」とか「これは最悪だった!」といったCPUがありましたら、教えて頂きたいです。 もし可能でしたら、最近出ているノートパソコン用のCPUでオススメなども教えて頂ければ幸いです。

  • Windows10に更新プログラムを適用できない

    Windows10にMicrosoft Update カタログからダウンロードした更新プログラムを適用できません。 詳細な状況は以下の通りです。 ●更新プログラムを適用したい環境  OS:Windows10 Enterprise(64bit)  筐体:DELL Optiplex 990  CPU:Core i5  メモリ:8GB  備考:会社の基盤の都合上、外部ネットワークとは接続できないため、スタンドアロンの状態となります。そのため、更新プログラムは、Microsoft Update カタログからダウンロードし、USBメモリ等を通して、適用する運用としています。 ●適用したい更新プログラム  x64 ベース システム用 Windows 10 バージョン 1511 の累積的な更新プログラム (KB3124200)  ※本プログラムに関わらず、全般的に適用できないようです。 ●更新プログラム適用時のエラーメッセージ  「この更新プログラムはお使いのコンピュータには適用できません」 エラーメッセージが表示される理由を、インターネットで調査したところ、以下の2点が考えられるようです。  ・対応するシステムではない。(32bit環境に64bitのプログラムを適用しようとしている等)  ・既に対象の更新プログラムが適用されている。 しかしながら、現在のシステムの状況は、上記のいずれにも当てはまらないと考えております。 OSが64bitであることは、コンピュータのプロパティで確認済みですし、環境はスタンドアロンのため、自動で更新されることはあり得ません。(インストール済みのプログラムにも表示されません。) 更新プログラムの詳細情報を確認したところ、「アーキテクチャ」に「AMD64」と記載があるので、これが原因かと考えましたが、2015年8月頃までは、「AMD64」と記載があるプログラムも適用することができていました。 また、Microsoft Updateカタログには「x64」と記載されているプログラムがないようですので、64bit環境には「AMD64」のプログラムを適用するものと考えています。 プログラムが適用できない原因として考えられることを御教示頂きけますと幸いです。 (確認がなくとも、ヒントになるようなことでも御教示頂きたいです。) よろしくお願い致します。

専門家に質問してみよう