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