C++17 - hardware_destructive_interference_size, hardware_constructive_interference_size

출처

C++ 17 표준 라이브러리 헤더에 추가 되었다

hardware_destructive_interference_size
False-Sharing 발생을 방지하기 위해 필요한 최소 메모리 주소 거리. 2개의 변수를 서로 다른 캐시 라인에 싣기 위해 얼라이먼트 정보로 사용한다.

hardware_constructive_interference_size
동일한 캐시 라인에 올리는(True-Sharing) 최대 개체 크기. 복수 변수 접근의 시간적 지역성을 높일 때 주소 배치 확인 정보로 사용한다.

대상 프로세서의 L1 캐시 라인 크기를 컴파일 타임 상수로서 취득 가능.
구체적인 값은 처리계 정의(implementation-defined)로 된다.
일반적으로 두 상수 값은 동일하다. 예: x86 아키텍처에서는 값은 64. WebAssembly 등 컴파일 대상 아키텍처가 정해지지 않은 경우를 상정하고 보수적으로 동작하도록 목적별로 분리 정의된다.

C++ 17 21.6.5의 Example 코드 조각을 인용(일부 수정).

#include <new>

// hardware_destructive_interference_size 이용 예
struct keep_apart {
  alignas(hardware_destructive_interference_size) atomic<int> cat;
  alignas(hardware_destructive_interference_size) atomic<int> dog;
};

// hardware_constructive_interference_size 이용 예
struct together {
  atomic<int> dog;
  int puppy;
};
struct kennel {
  // Other data members...
  alignas(sizeof(together)) together pack;
  // Other data members...
};
static_assert(sizeof(together) <= hardware_constructive_interference_size);

2018년 8월의 MSVC 14.11(VisualStudio 2017 15.3)에서 /std: c++17 옵션에서 구현 확인

추가: 시스템 프로그래밍 언어인 Rust에도 같은 상수 값이 제안 되어 있다.


이 글은 2019-11-15에 작성되었습니다.