Ложное деление с маленькими предметами - PullRequest
0 голосов
/ 22 ноября 2018

В настоящее время я выполняю рефакторинг устаревшего кода и наткнулся на этот странный узел связанного списка

#define CACHE_LINE 128

struct Node {
public:
    intptr_t value;
    Node *next;
    Node *prev;
    bool dummy;
private:
    // Avoid false sharing
    unsigned char padding[CACHE_LINE - sizeof(intptr_t) - 2 * sizeof(Node *) - sizeof(bool)];
};

Предполагая, что строка кэша системы, над которой я работаю, имеет ширину 32 байта, это означает, чтоОбъект будет занимать до 4 строк кэша (с 32 байтами строки кэша).И 3 из них будут полностью пустыми.

Этот связанный список является частью очереди без блокировки.Я еще не определил, сколько производителей и сколько потребителей его используют.Из этого другого поста ответ гласит следующее:

Пояснение: для негативных последствий должен быть записан по крайней мере некоторый доступ к «ложно разделяемым» переменным.Если записи выполняются редко, влияние ложного обмена на производительность довольно незначительно;чем больше записей (и, таким образом, строка кэша делает недействительными сообщения), тем хуже производительность.

Мой вопрос заключается в следующем: что ухудшает мою производительность?Ложное разделение этого маленького объекта или тот факт, что четверть моего кэша будет заполнена заполнением?

Живое представление макета памяти в Проводник компилятора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...