2

Intel プロセッサのアウト オブ オーダー効果を実証するために、マルチスレッド プログラムを作成しました。プログラムはこの記事の最後に添付されています。期待される結果は、x が handler1 によって 42 または 0 として出力されたときです。ただし、実際の結果は常に 42 です。これは、アウト オブ オーダー効果が発生しないことを意味します。

コマンド「gcc -pthread -O0 out-of-order-test.c」でプログラムをコンパイルしました Intel IvyBridge プロセッサ Intel(R ) Xeon(R) CPU E5-1650 v2。

順不同の効果を見るために何をすべきか知っている人はいますか?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int f = 0, x = 0;

void* handler1(void *data)
{
    while (f == 0);
    // Memory fence required here
    printf("%d\n", x);
}

void* handler2(void *data)
{
    x = 42;
    // Memory fence required here
    f = 1;
}

int main(int argc, char argv[])
{
    pthread_t tid1, tid2;

    pthread_create(&tid1, NULL, handler1, NULL);
    pthread_create(&tid2, NULL, handler2, NULL);

    sleep(1);
    return 0;
}
4

2 に答える 2

6

競合状態と順不同の実行パラダイムを混在させています。残念ながら、順不同の実行を「公開」することはできないと確信しています。これは、実行中のプログラムとそのデータをその影響から保護するように明示的に設計および実装されているためです。

より具体的には、アウトオブオーダーの実行は、CPU の「内部」全体で行われます。順不同の命令の結果は、レジスタ ファイルに直接ポストされませんが、順序を維持するためにキューに入れられます。そのため、命令自体が順不同で実行された場合でも (これらの命令が互いに独立して実行できることを主に保証するさまざまな規則に基づいて)、それらの結果は常に、外部の監視者が期待する正しい順序になるように並べ替えられます。 .

あなたのプログラムは何をしますか: それは (非常に大まかに) 競合状態をシミュレートしようfx ます.新しいスレッドは、他のスレッドとまったく同じ CPU コアでスケジュールされると想定します。ただし、上で説明したように、リストされた条件をすべて満たすことができたとしても (割り当ての直後、割り当ての前に 2 番目のスレッドをスケジュールしfxまったく同じ CPU コアで新しいスレッドをスケジュールする) - それ自体は非常に低い確率のイベントです - それでも、実際に露出するのは潜在的な競合状態だけですが、順不同の実行ではありません。

がっかりさせて申し訳ありませんが、プログラムは順不同の実行効果を観察するのに役立ちません。少なくとも、実用的であるほど十分に高い確率ではありません。

ここでアウトオブオーダー実行についてもう少し読むことができます: http://courses.cs.washington.edu/courses/csep548/06au/lectures/introOOO.pdf

更新 いくつかの考えを与えたので、順不同の実行を公開することを期待して、その場で命令を変更できると思います。しかし、それでも、新しい「更新された」命令が CPU のパイプラインに正しく反映されないため、このアプローチは失敗するのではないかと心配しています。つまり、CPU は変更しようとしている命令を既にフェッチして解析している可能性が高いため、実行される内容はメモリ ワードの内容と一致しなくなります (CPU の L1 キャッシュ内の内容であっても)。ただし、この手法が役立つと仮定すると、アセンブリで直接高度なプログラミングを行う必要があり、最高の特権レベル (リング 0) でコードを実行する必要があります。副作用の可能性が非常に高いため、自己変更コードの作成には細心の注意を払うことをお勧めします。

于 2015-11-21T22:59:44.710 に答える