Полезен ли когда-нибудь std :: hardware_constructive_interference_size? - PullRequest
1 голос
/ 05 мая 2020

Существующие вопросы в этой области, которые все еще не задают конкретно мой вопрос:

Ответ на второй фактически заставляет меня задать этот вопрос.

Итак, предполагая, что я хочу иметь конструктивный вмешательство. И я помещаю несколько переменных в единую структуру, которая соответствует std::hardware_constructive_interference_size:

struct together
{
  int a;
  int b;
};

Преимущество кажется слишком слабым, чтобы запретить компиляцию с static_assert, если она не подходит:

// Not going to do the below:
static_assert(sizeof(together) <= std::hardware_constructive_interference_size);

По-прежнему выравнивание полезно, чтобы избежать диапазона структуры:

struct alignas(std::hardware_constructive_interference_size) together
{
  int a;
  int b;
};

Однако тот же эффект может быть достигнут с выравниванием только по размеру структуры:

struct alignas(std::bit_ceil(2*sizeof(int))) together
{
  int a;
  int b;
};

Если размер структуры больше std::hardware_constructive_interference_size, все же может быть полезно выровнять его по размеру структуры, потому что:

  • Это подсказка времени компиляции, которая может устареть с более поздними процессорами, на которых скомпилированная программа запускается
  • Это один из размеров строки кэша уровней кеша, если их больше одной, превышение одной строки кеша уровня кеша может по-прежнему давать полезное совместное использование строки кэша другого уровня
  • Выравнивание по размеру структуры не даст намного большего чем вдвое больше накладных расходов. Выравнивание по размеру строки кэша потенциально может вызвать дополнительные накладные расходы, если размер строки кеша станет намного больше, чем размер структуры.

Итак, есть ли смысл для std::hardware_constructive_interference_size?

1 Ответ

2 голосов
/ 05 мая 2020

Рассмотрим std::deque<T>. Часто это реализуется с использованием кусков заданного размера. Но сколько Т вы храните на порцию? Разумным ответом будет std::hardware_constructive_interference_size/sizeof(T), если sizeof(T) мало.

Аналогично, строковый класс с Оптимизацией малых строк может стремиться к размеру std::hardware_constructive_interference_size. В общем, размер полезен, когда у вас может быть переменный объем данных во время выполнения с высокой локальностью ссылки.

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