MESI стоимость обмена данными между несколькими потоками

Я хочу измерить стоимость согласования кэша (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 обеспечивает согласованность строк кэша на нескольких ядрах ЦП. Поэтому я не использовал атомики в этом тесте.

Это очень похоже на проблему ложного совместного использования, где у меня будет вторая глобальная переменная, они оба занимают одну и ту же строку кэша, но разные потоки записывают в каждую. Поскольку каждая переменная записывается одним потоком, зачем нам использовать атомики?

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]