2

別のスレッドが書き込んでいる変数を読み取る際のキャッシュ コヒーレンシ (MESI) コストを測定したいと考えています。次のテストを思いつきましたが、読み取りには平均で 2 サイクルしかかからないことが報告されています。

// NB I used Microsoft's compiler so you will need your own rdtscp()

#include <thread>
#include <cstdint>
#include <iostream>


int global;

void write(){
    uint64_t counter = 0;
    while (true){
        global = counter;
        counter++;
    }
}

void read(){
    uint64_t n = 100000000;
    uint32_t x;
    uint64_t start = __rdtscp(&x);

    for (int i = 0; i < n; i++){
        volatile int copy = global + i;
    }
    uint64_t finish = __rdtscp(&x);
    std::cout << (finish - start) / n << " cycles per read" << std::endl;
}

int main(){
    std::thread thread1(write);
    std::thread thread2(read);

    thread1.detach();
    thread2.join();
}

私のテストは間違っていますか?誰かがそれを改善するのを手伝ってくれませんか?

編集: 私の理解では、MESI は C++ のアトミック型とは何の関係もありません。MESI は、キャッシュ ラインが複数の CPU コア間で一貫していることを保証します。したがって、このテストではアトミックを使用していません。

これは、2 番目のグローバル変数がある場合の偽共有の問題と非常によく似ています。これらは両方とも同じキャッシュ ラインを占有しますが、異なるスレッドがそれぞれに書き込みます。各変数は 1 つのスレッドによって書き込まれるのに、なぜアトミックを使用するのでしょうか?

4

0 に答える 0