出来ますか?分岐/ループのない小さなコードの場合。SSE の forやその他のプロセッサ ファミリgcc
のようなフラグや組み込み命令はありますか? x86
最近利用可能なすべてのプロセッサが順不同の実行モデルに従っているので、私はただ興味があります.
前もって感謝します
出来ますか?分岐/ループのない小さなコードの場合。SSE の forやその他のプロセッサ ファミリgcc
のようなフラグや組み込み命令はありますか? x86
最近利用可能なすべてのプロセッサが順不同の実行モデルに従っているので、私はただ興味があります.
前もって感謝します
最新のアウトオブオーダー CPU のほとんどは本質的にアウトオブオーダーであり、インオーダー モードとアウトオブオーダー モードを切り替えることはできません。
順序付けされた CPU をいくつか見つけようとすることができます。いくつかあります。
通常のアウトオブオーダー CPU で命令の並べ替えを直接オフにすることはできませんが、すべての命令の間に(x86 の世界のように)シリアル化cpuid
するものを挿入して、順序どおりの実行をシミュレートすることができます。
シリアル化命令に関するIntel マニュアル ( vol 3a ) の一部があります ( http://objectmix.com/asm-x86-asm-370/69413-serializing-instructions.htmlからコピー):
ボリューム 3A: システム プログラミング ガイドの状態
7.4 命令のシリアル化
Intel 64 および IA-32 アーキテクチャでは、いくつかのシリアル化命令が定義されています。これらの命令は、次の命令がフェッチされて実行される前に、前の命令によるフラグ、レジスタ、およびメモリへのすべての変更をプロセッサに完了させ、バッファリングされたすべての書き込みをメモリに排出するように強制します。たとえば、制御レジスタへの MOV 命令を使用して新しい値を制御レジスタ CR0 にロードし、保護モードを有効にする場合、プロセッサは保護モードに入る前にシリアル化操作を実行する必要があります。このシリアル化操作により、プロテクト モードへの切り替えが行われる前に、プロセッサが実アドレス モードにある間に開始されたすべての操作が完了することが保証されます。
命令をシリアル化するという概念は、並列命令実行をサポートするために、Pentium プロセッサで IA-32 アーキテクチャに導入されました。命令のシリアル化は、並列命令実行を実装していない Intel486 以前のプロセッサでは意味がありません。
投機的に実行された命令の結果が破棄されるため、P6 以降のプロセッサ ファミリでシリアル化命令を実行すると、投機的な実行が制限されることに注意することが重要です。次の命令はシリアル化命令です。
o 特権シリアル化命令 - MOV (MOV CR8 を除く制御レジスターへ)、MOV (デバッグレジスターへ)、WRMSR、INVD、INVLPG、WBINVD、LGDT、LLDT、LIDT、および LTR。
o 非特権シリアライズ命令 - CPUID、IRET、および RSM。
プロセッサが命令の実行をシリアル化すると、次の命令を実行する前に、すべての保留中のメモリ トランザクション (ストア バッファに格納された書き込みを含む) が完了することが保証されます。シリアル化命令を渡すことはできず、シリアル化命令は他の命令 (読み取り、書き込み、命令フェッチ、または I/O) を渡すことはできません。たとえば、CPUID を任意の特権レベルで実行して、EAX、EBX、ECX、および EDX レジスタが変更されることを除いて、プログラム フローに影響を与えずに命令の実行をシリアル化できます。