hardware_destructive_interference_size — 하드웨어 간섭 크기 상수
hardware_destructive_interference_size — 하드웨어 간섭 크기 상수
hardware_destructive_interference_size와 hardware_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)을 제어하는 데 유용해요. 값이 하드웨어마다 다르므로 정렬만 맞추면 이식성 있게 동작해요.