hardware_destructive_interference_size — 하드웨어 간섭 크기 상수

hardware_destructive_interference_size — 하드웨어 간섭 크기 상수

hardware_destructive_interference_sizehardware_constructive_interference_size하드웨어의 캐시 라인 크기와 관련된 상수예요. C++17에서 도입됐어요. <new> 헤더에 있어요.

성능 최적화(캐시 라인 정렬)를 위해 구현 정의 값이에요.

출처: cppreference

본문

// <new> 헤더, C++17
inline constexpr std::size_t
    hardware_destructive_interference_size = /*implementation-defined*/;  // (1)

inline constexpr std::size_t
    hardware_constructive_interference_size = /*implementation-defined*/; // (2)
  • (1) 파괴적 간섭 크기 — 이 크기보다 가까운 두 객체는 같은 캐시 라인을 공유할 수 있어 false sharing이 발생할 수 있는 크기
  • (2) 건설적 간섭 크기 — 이 크기 안의 객체들은 한 캐시 라인에 함께 넣기 좋은 크기

사용 예 — false sharing 방지

#include <new>
#include <atomic>
#include <thread>

// 각 스레드의 카운터를 서로 다른 캐시 라인에 배치
struct alignas(std::hardware_destructive_interference_size) Counter {
    std::atomic<int> value{0};
};

Counter counters[8];   // 각 원소가 서로 다른 캐시 라인 (false sharing 방지)

void worker(int i) {
    for (int j = 0; j < 100000; ++j) counters[i].value++;
}

특징

  • 구현 정의 — 실제 값은 하드웨어 캐시 라인 크기에 따라 달라져요 (예: 64).
  • destructive는 "같은 캐시 라인을 공유하면 성능이 나빠지는" 상황을 피하려고 객체를 떨어뜨릴 때,
  • constructive는 "같은 캐시 라인에 넣으면 좋은" 데이터를 묶을 때 써요.
// 함께 자주 읽히는 데이터를 한 캐시 라인에 (constructive)
struct alignas(std::hardware_constructive_interference_size) Hot {
    int a, b, c;   // 자주 함께 접근
};

이 상수들은 멀티스레드 성능 최적화에서 캐시 간섭(false sharing / true sharing)을 제어하는 데 유용해요. 값이 하드웨어마다 다르므로 정렬만 맞추면 이식성 있게 동작해요.

더 알아보기 (Learn more)

cppreference