Почему я вижу два промаха в кэше L1D в многопоточной настройке во время операций чтения-изменения-сохранения?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему я вижу два промаха в кэше L1D в многопоточной настройке во время операций чтения-изменения-сохранения?

Сообщение Anonymous »

У меня есть многопоточная настройка, в которой один поток действует как записывающий, а другой — как читающий. Модуль записи выполняет операцию чтения-изменения-сохранения общей переменной std::atomic, а модуль чтения постоянно читает ту же переменную, чтобы проверить, обновлено ли значение.
Вот минимальный пример кода:
Тема Writer:

Код: Выделить всё

#include 
#include 
#include 

std::atomic shared_value{0};

void writer() {
while (true) {
size_t writer_local_value = shared_value.load(); // Read
writer_local_value *= 5;                         // Modify
shared_value.store(writer_local_value);          // Store

std::this_thread::sleep_for(std::chrono::milliseconds(1)); // Simulating delay
}
}
Тема читателей:

Код: Выделить всё

void reader() {
size_t last_seen_value = 0;
while (true) {
size_t current_value = shared_value.load(); // Read
if (current_value != last_seen_value) {
last_seen_value = current_value;
// Perform some operation when value is updated
}
}
}
Установка:

Платформа: x86_64

ОС: Ubuntu

Инструмент измерения промахов в кэше: perf_event_open
Наблюдение:

Когда записывающее устройство выполняет операцию чтения-изменения-сохранения, я наблюдаю два L1D промахи в кэше для shared_value:
Один во времяshared_value.load() (чтение).

Другой во время Shared_value.store() (запись).

Однако, если я заменю код автора простым вызовом Shared_value.store() без какой-либо предварительной загрузки, я увижу только одну ошибку в кэше L1D.
Например :

Код: Выделить всё

void writer_simple() {
while (true) {
shared_value.store(42); // Only store
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
В этом случае, как и ожидалось, происходит только один промах в кэше.
Вопрос:

Почему операция чтения-изменения-сохранения в средстве записи приводит к двум промахам в кэше L1D вместо одного?

Разве строка кэша не должна быть уже признана недействительной и выбрана во время первоначальной загрузки, и, таким образом, при последующем сохранении не должно происходить никаких дополнительных промахов?
Что является причиной этого? несоответствие, поскольку протокол MESI должен был привести только к одной ошибке в кэше?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ead-modify
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница в C++ VS2010 между «Многопоточной DLL» и «Многопоточной»
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • CACH CACHE L1D: Google Clarkmark Donotoptimize VS ровное поведение в GCC против Clang
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Почему я вижу, что все еще вижу предупреждение о недостании импорта?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • `return Type - это неполная ошибка для класса, несмотря на то, что я вижу, насколько я вижу. C ++
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Я застрял в этой программе многопоточной чтения Python
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»