1

これは言葉にする/尋ねるのが難しいので、ご容赦ください:

アセンブリの出力を見ると、これが CPU のコアで実行されるものです。ただし、CPU に複数のコアがある場合、アセンブリはすべて同じコアで実行されますか? 同じプログラムのアセンブリが別のコアで実行されるのはどの時点でしょうか?

だから私が持っていた場合(アセンブリ疑似):

ADD x, y, z
SUB p, x, q

ADD と SUB が同じコアで実行されるかどうかはどうすればわかりますか? これはアフィニティに関連していますか?アフィニティはプロセスをコアではなくCPUに固定するだけだと思いましたか?

連続するアセンブリ命令が同じコアで実行されるかどうかを合理的に予測できるかどうか、およびそれらが同じコアでのみ実行されるように制御できるかどうかを理解したいので、これを求めています。同じプログラムコードの実行をあるコアから別のコアに変更する決定がどのように行われるかを理解しようとしていますか?

アセンブリが (アフィニティを使用している場合でも) 実行を CPUA Core1 から Core2 に変更できる場合、ここで QPI リンク速度が有効になりますか? また、キャッシュが異なる CPU コア間で共有されるかどうかも?

4

3 に答える 3

2

私は主に Linux について話しています。しかし、私が言っていることは他のOSにも当てはまるはずです。ただし、Windows のソース コードにアクセスしないと、Windows の詳細な動作を確実に説明することはできません。

コンピューターが行っていることの「抽象化」は不十分だと思います。基本的に、(モノスレッド) プロセス (または単なるスレッド) は、いくつかの「仮想」CPU で実行されます。その命令セットは、syscalls を介してカーネルに入る機能によって強化された特権のない x86 マシン命令です (通常、特別な命令を介して)。のようにSYSENTER)。したがって、アプリケーションの観点からは、 Linux カーネルへのシステム コールは「アトミック」です。これその答えを見てください。

実際、プロセッサは (任意の時点で) いくつかの割り込みを受け取ります (Linux では、cat /proc/interrupts1 秒の遅延で 2 回繰り返されると、基本的には 1 秒あたり何千回も割り込みが発生する頻度がわかります)。これらの割り込みは、カーネル。カーネルは、タスク (スレッドやプロセスなど) を事前にスケジューリングています (いつでもカーネルによって中断および再開できます)。

アプリケーションの観点からは、割り込みは実際には存在しません (ただし、カーネルはプロセスにシグナルを送信できます)。

コア、割り込み、およびキャッシュは、ハードウェアおよび/またはカーネルによって処理されるため、アプリケーションの観点からは、プロセスを「遅くする」ことを除いて、実際には存在しません。キャッシュの一貫性は、ほとんどハードウェアで処理されます。順不同で実行されると、特定のバイナリ プログラムの実行時間は、ごくわずかであっても予測できなくなります。(つまり、特定のルーチンまたはループに必要なミリ秒数を静的に正確に予測することはできません。動的に測定することしかできません。最悪の場合の実行時間について詳しくは、こちらを参照してください)。

Advanced Linux Programmingの本とLinux Assembly Howtoを読むと役に立ちます。

于 2013-03-16T15:01:29.543 に答える
2

これは大まかな概要であり、必要な詳細が得られることを願っています。

  1. アセンブリ コードはマシン コードに変換されます。つまり、CPU によって実行されるバイナリ データです。

  2. CPU は、マルチコア プロセッサのコアと同じです。つまり、CPU はプロセッサ (チップ) と同じではありません。

  3. すべての CPU には、次に実行する命令を指す命令ポインタがあります。これは、実行される命令ごとにインクリメントされます。

そのため、マルチコア プロセッサでは、コアごとに 1 つの命令ポインターが存在します。使用可能な CPU (またはコア) よりも多くのプロセスをサポートするために、オペレーティング システムは実行中のプロセスを中断し、定期的にプロセスの状態 (命令ポインターを含む) を保存します。次に、すでに中断されたプロセスの状態を復元し、それらを少しの間実行させます。

どのコアで実行を継続するかは、オペレーティング システムによって決定され、実行中のスレッドのアフィニティ (およびおそらく他の設定も) によって制御されます。

したがって、あなたの質問に答えるために、2 つの隣接するアセンブリ ステートメントが同じコアで実行されるかどうかを知る方法はありません。

于 2013-03-16T14:31:48.187 に答える
1

通常、個々の命令がどこで実行されるかを予測することはできません。個々のスレッドが継続的に実行されている限り、同じコア/プロセッサ内で実行されますが、スレッドがどの命令でスイッチアウトされるかを予測することはできません。OSは、特にシステムのワークロードと優先度レベルに基づいて、その決定、スイッチをいつ戻すか、どのコア/プロセッサに配置するかを決定します。

通常、スレッドを常に同じコアで実行するようにOSに要求できます。これは、アフィニティと呼ばれます。これは通常は悪い考えであり、OSからワークロードに基づいてどこで何をするかを決定する柔軟性が失われるため、絶対に必要な場合にのみ実行する必要があります。アフィニティは、ほとんどの場合、パフォーマンスの低下につながります。

プロセッサアフィニティの要求は、パフォーマンスの向上につながるという並外れた証拠を必要とする並外れた要求です。OSの裏をかくことを試みないでください。OSは、あなたが知らない現在の実行環境について知っています。

于 2013-03-16T14:52:23.730 に答える