web-dev-qa-db-ja.com

すべてのSSE命令のリストを見つけるにはどうすればよいですか?CPUがSSEをサポートしていない場合はどうなりますか?

だから私はプロセッサがどのように機能するかについて読んでいます。今、私は指示(SSE、SSE2など)のものに取り組んでいます。 (これはかなり興味深いです)。

私はたくさんの質問があります(私はウィキペディアでこのようなものを読んでいます):

  1. SSEに追加されたいくつかの命令の名前を見たことがありますが、それらのいずれについても説明がありません(SSE4かもしれませんか?ウィキペディアにもリストされていません)。彼らが何をしているのかどこで読むことができますか?

  2. これらの指示のどれが使用されているかをどのように知ることができますか?

  3. どちらが使用されているかがわかっている場合は、比較を行っているとしましょう(これは私が今まで聞いた中で最も愚かな質問かもしれませんが、アセンブリについてはわかりません)命令を直接使用することは可能ですか?アセンブリコードで? (私はこれを見てきました: http://asm.inightmare.org/opcodelst/index.php?op=CMP

  4. プロセッサは命令をどのように解釈しますか?

  5. SSE命令がないプロセッサを使用した場合はどうなりますか?(比較したい場合は、比較できないと思いますよね?)

6
Blastcore

SSEに追加されたいくつかの命令の名前を見たことがありますが、それらすべてについての説明はありません(SSE4かもしれませんか?ウィキペディアにもリストされていません)。彼らが何をしているのかどこで読むことができますか?

最良の情報源は、拡張機能を設計した人々、つまりIntelから直接入手することです。決定的なリファレンスは インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル ;ボリューム1から3Cを組み合わせてダウンロードすることをお勧めします(そのページの最初のダウンロードリンク)。 Vol. 1, Ch. 12-SSE3、SSSE3、SSE4、およびAESNIを使用したプログラミングをご覧ください。特定の手順を参照するには、Vol. 2, Ch. 3-4を参照してください。 (付録Bも役立ちます)


これらの指示のどれが使用されているかをどのように知ることができますか?

命令は、実行しているプログラムが実際にそれらを使用している場合にのみ使用されます(つまり、さまざまなSSE4命令に対応するバイトコードが呼び出されています)。プログラムが使用する命令を見つけるには、 逆アセンブラ を使用する必要があります。


どちらが使用されているかがわかっている場合は、比較を行っているとしましょう(これは、これまでに行った中で最もばかげた質問かもしれませんが、アセンブリについてはわかりません)。アセンブリコード? (私はこれを見てきました: http://asm.inightmare.org/opcodelst/index.php?op=CMP

プロセッサは命令をどのように解釈しますか?

CPUはどのようにしてコマンドと命令が実際に何を意味するのかを知る」のですか? "という質問に対する私の答えを見てみたいと思うかもしれません。アセンブリコードを手動で書き出す場合、実行可能ファイルを作成するには、「人間が読める」アセンブリコードをアセンブラに渡します。アセンブラは、命令をプロセッサが実行する実際の0と1に変換します。


SSE命令がないプロセッサを持っているとどうなりますか?(比較したい場合はできないと思いますよね?)

お使いのコンピュータは チューリング完全 であるため、専用のハードウェアがない場合は、ソフトウェアアルゴリズムを使用して任意の数学関数を実行できます。明らかに、ハードウェアで強力な並列または行列数学を実行することは、ソフトウェアよりもはるかに高速であるため(命令のループが多数必要)、これによりエンドユーザーの速度が低下します。プログラムの作成方法によっては、ソフトウェアで同じことを行うことは可能ですが、特定の命令(つまり、SSE4セットからの命令)が必要になる可能性がありますしたがって、より多くのプロセッサで使用できます)、この方法はまれです。


上記の例として、プロセッサが最初に MMX命令セット拡張 で登場したときを思い出すかもしれません。 2つの8要素の符号付き8ビットベクトルを一緒に追加したいとします(したがって、各ベクトルは64ビットで、単一のMMXレジスタに相当します)。つまり、A + B = Cです。これは、paddsbと呼ばれる単一のMMX命令で実行できます。簡潔にするために、ベクトルがメモリ位置AB、およびCにも保持されているとします。同等のアセンブリコードは次のようになります。

movq   MM0, [A]
paddsb MM0, [B]
movq   [C], MM0

ただし、この操作はソフトウェアでも簡単に実行できます。たとえば、次のCコードは同等の操作を実行します(charは8ビット幅であるため)。

#define LEN 8
char A[LEN], B[LEN], C[LEN];

/* Code to initialize vectors A and B... */

for (i = 0; i < LEN; i++)
{
    C[i] = A[i] + B[i];
}

上記のループのアセンブリコードがどのように見えるかはおそらく推測できますが、(ベクトルの追加を処理するためのループが必要になるため)かなり多くの命令が含まれることは明らかです。したがって、さらに多くの命令を実行する必要があります。フェッチします。これは プロセッサのワード長がコンピュータのパフォーマンスにどのように影響するか (MMX/SSExの目的は、より大きなレジスタと、 同じ命令を実行する機能の両方を提供することです)に似ています。複数のデータ )。

11
Breakthrough

質問と同じ順序であなたに答えます:

  1. 最も簡単な方法は、Intelのサイトにアクセスしてホワイトペーパーをダウンロードすることです。イベントehプロセッサのSDKマニュアルには、必要なすべての詳細が記載されています。 ここ はそのようなリンクの1つです。 ここ はSSE命令セットのニーモニックと説明への別のリンクです。
  2. これらの指示のどれが使用されているのか、正確にはどういう意味ですか?プロセッサまたは特定のアプリケーションに関する情報をお探しですか?
    プロセッサの場合、Windowsについてはわかりませんが、Linuxの場合は、プロセッサフ​​ラグを読み取るだけです。 # lshwコマンドを使用すると簡単に実行できます。
    一方、アプリケーション固有ですが、よくわかりません。いつでも実行可能ファイルを逆アセンブルして、使用されている命令を確認できます。ほとんどのアプリケーションは大衆向けに準拠しているため、Genericx86命令セットのみを使用します。よりプロセッサ固有の命令を使用するには、システム上でアプリケーションを手動でコンパイルする必要があります。
  3. いつでもシミュレーターを実行できます。プログラミングプロジェクト内でアセンブリコードを使用する場合は、CおよびC++で使用できます。私はC内でASMコードのみを使用したので、他の言語がそれをサポートしているかどうかわかりません。インラインASMの使用に関するヘルプについては、これを参照してください SO質問
  4. その質問は、コンピュータアーキテクチャの分野に大きくあります。ここで説明することはできますが、簡単なことではありません。この主題を扱った別の SU質問 がありました。
  5. あなたの特定の質問に答えるために、SSE命令セットは1999年にのみ発表されましたが、CMP命令はそれ以前から存在していました。これは、8080の命令セットの一部でもありました。場合によっては、マシンがチューリング完全であるため、古いマイクロプロセッサが比較を実行できた場合に限り、明示的な命令なしで比較を実行するのは困難でした。すべての命令セットは、特定の命令を実行するためのより速く、より簡単で、より最適化された方法にすぎません。チューリング完全マシンは常にcompute everything that is computableできるため、新しい機能はほとんど追加されません。
2
darnir

SSEに追加されたいくつかの命令の名前を見たことがありますが、それらのいずれについても説明がありません(SSE4かもしれませんか?ウィキペディアにもリストされていません)。

それは正しくありません。 ウィキペディアにリストがありますすべてのx86命令(非推奨および文書化されていない命令も含む)

彼らが何をしているのかどこで読むことができますか?

CPUについて知るには、製造元のマニュアルを読む必要があります。この場合 Intel または多分 [〜#〜] amd [〜#〜] 。命令のコンパクトな編集のために、これらは2つの信頼できる情報源です

どちらが使用されているかがわかっている場合は、比較を行っているとしましょう(これは私が今まで聞いた中で最も愚かな質問かもしれませんが、アセンブリについてはわかりません)命令を直接使用することは可能ですか?アセンブリコードで? (私はこれを見てきました: http://asm.inightmare.org/opcodelst/index.php?op=CMP

アセンブリは、人間が読める形式の マシンコード です。表示される名前は、アセンブリの命令のニーモニックであるため、もちろん、アセンブリでは常に直接使用されています。

SSE命令がないプロセッサを使用した場合はどうなりますか?(比較したい場合は、比較できないと思いますよね?)

実際には、20年前のPentium III以降に導入されたため、SSE)をサポートしないx86 CPUを入手することはほとんどできません。ただし、通常、CPUが無効な命令/オペコードを検出すると、 exception を発生させます。通常、OSは単にエラーをアナウンスしてからプログラムを終了します。ただし、必要に応じて、アプリケーションはその例外をキャッチしてソフトウェアで命令を処理できます。これにより、状態が切り替わるため、非常に非効率になります。プログラムと例外ハンドラの間ですが、プログラムは変更せずに実行できます。

これは、一部のCPUにFPUが組み込まれておらず、浮動小数点演算が別のコプロセッサーで実行されていた過去に使用されていました。その場合、コプロセッサーが接続されていない場合、浮動小数点命令は例外を発生させ、例外ハンドラーはそれらをプログラムに転送する前にソフトウェアで操作を計算します。 MS-DOSでのx87浮動小数点エミュレーションのプロトコルは何ですか? を参照してください。

また、MacOS X(SSE2/3以上が必要)をSSEのみの古いCPUで実行するために、一部のHackintoshパッチでも使用されていました。

1
phuclv

5番目の質問にのみ答えます。半互換性のあるマシンでマシンコードを実行するとします。そのため、CPUは最終的に無効な命令に入る可能性があります。

プロトコルがあり、そのような状況を処理するために、最新のOSとCPUが協調して従います。 CPUは何が起こったかに関する情報を保存し、支援のためにOSコードにジャンプするため、OSは状況を正しく評価でき、誤解されたプロセスを強制終了する可能性が非常に高くなります(つまり、プロセスを準備完了キューから削除し、関連するデータ構造をリサイクルします)。

UNIXシステムでは、不正な命令はSIGILLに対応します。これは、プロセスがシグナルハンドラルーチンを登録した可能性のあるシグナルです。その場合、強制終了されず、代わりに対応するシグナルハンドラーが呼び出されます。それ以外の場合、コアダンプはディスクに書き込まれます。これについては、 signal(7) またはRochkindの「AdvancedUNIXProgramming」の第9.1章で確認できます。

0
artistoex