TGViewer
Грокаем C++ Грокаем C++ @grokaemcpp · 9.37K subscribers
Post #1034 3.94K
​​Как узнать размер кэш-линии?
#опытным

В прошлом посте упомянул false sharing - ситуации в многопоточном программировани, когда данные не связаны и независимы, а на самом деле операции над одними данными влияют на другие за счет того, что они лежат в одной кэш линии.

Там я использовал выравнивание по границе 64 байта - это типичный размер кэш-линии на современных процессорах.

Но на эту чиселку нельзя надеяться как на первоисточник. Железо бывает разное и надо уметь узнавать размер кэш-линии для конкретного процессора.

Для этого начиная с С++17 в стандарте появились константы std::hardware_destructive_interference_size и std::hardware_constructive_interference_size.

На практике они почти всегда равны размеру кэш линии, но смысл у них немного разный.

std::hardware_destructive_interference_size - Минимальное смещение, которое гарантирует отсутствие false sharing.

std::hardware_constructive_interference_size - Максимальный размер участка памяти, внутри которого гарантируется true sharing.

С false sharing мы разобрались:

struct GuaranteeFalseSharingAbsence
{
alignas(std::hardware_destructive_interference_size ) std::atomic<uint64_t> counter1;
alignas(std::hardware_destructive_interference_size ) std::atomic<uint64_t> counter2;
};


Помещаем два атомарных счетчика в разные кэш-линии и их изменения никак не влияют друг на друга.

А что такое true sharing?

Это ситуация, когда данные попадают в одну кэш линию.


Иногда мы хотим убедиться, чтобы данные обязательно попадали всегда именно в одну кэш линию. Для этого вся структура выравнивается по границе hardware_constructive_interference_size и все, что лежит в структуре, попадет внутрь одной линии.

struct alignas(std::hardware_constructive_interference_size) A {
std::uint32_t one;
std::uint32_t two;
};


Конкретных кейсов не могу привести, если у кого есть опыт работы с hardware_constructive_interference_size, то отпишитесь, будет интересно почитать.

Спасибо, @topin89, за идею для поста)

Share with others. Stay cool.

#cpp17
  • 🔥 34
  • 👍 10
  • ❤ 7
  • ❤‍🔥 5
More from @grokaemcpp
  1. Oct 8, 2026​​Strict weak ordering #опытным На первый взгляд, всё выглядит рабочим: мы создаём 40 зака…
  2. Oct 7, 2026​​Где-то баг... #опытным Вот вам код: struct Order { int price; int id; }; int main() { st…
  3. Oct 5, 2026Откуда spurious wakeup на кондваре? #опытным У кондваров есть метод std::condition_variabl…
  4. Oct 1, 2026​​Stacktrace. Tips #опытным Чтобы полноценно работать со стандартными трейсами, нужно знат…
  5. Sep 28, 2026​​Stacktrace #опытным Одна из проблема исключений - непонятно, откуда оно прилетело. Ну да…
  6. Sep 25, 2026​​std::spanstream #опытным Радостная весть для всех, кто пользуется iostreams! В C++23 доб…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →