"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > `std::atomic`의 저장소가 x86에서 순차적 일관성을 위해 XCHG를 사용하는 이유는 무엇입니까?

`std::atomic`의 저장소가 x86에서 순차적 일관성을 위해 XCHG를 사용하는 이유는 무엇입니까?

2024년 11월 18일에 게시됨
검색:481

Why does `std::atomic`\'s store use XCHG for sequential consistency on x86?

std::atomic의 매장에서 순차적 일관성을 위해 XCHG를 사용하는 이유

x86 및 x86_64 아키텍처에 대한 std::atomic의 맥락에서 순차 일관성을 갖는 저장 작업(std::memory_order_seq_cst)은 순차 릴리스 의미 체계를 달성하기 위한 기술로 메모리 장벽이 있는 단순 저장 대신 XCHG를 사용합니다.

순차 일관성 및 xchg

순차적 일관성은 모든 메모리 작업이 순차적 순서로 실행되는 것으로 나타나며 이 순서는 모든 스레드에 대해 동일함을 나타냅니다. 두 피연산자의 값을 원자적으로 교환하는 x86 명령어인 XCHG는 본질적으로 이러한 순차적 일관성 요구 사항을 충족합니다. XCHG를 사용하여 쓰기 작업을 수행함으로써 std::atomic은 실행 순서의 특정 지점에서 모든 스레드에 저장소가 전체적으로 표시되도록 보장하여 후속 작업으로 재정렬되는 것을 방지합니다.

mov- store mfence 대 XCHG

간단한 mov-store와 메모리 펜스(예: mfence)는 이론적으로 릴리스 의미를 제공할 수 있지만 순차적 릴리스 저장소 작업에는 충분하지 않습니다. 메모리 장벽을 설정하는 메모리 펜스 명령어인 MFENCE는 진행하기 전에 이전 쓰기 작업이 메모리에 커밋되도록 합니다. 그러나 릴리스 스토어 이전에 후속 로드 작업이 재정렬되는 것을 막지는 못합니다.

성능 고려 사항

순차 릴리스를 위한 mov-store mfence와 XCHG 간의 선택 저장소 운영에는 성능 균형이 필요합니다.

  • 특정 CPU(예: Intel Skylake)에서는 XCHG가 mov-store mfence보다 더 효율적일 수 있습니다. 특히 동기화해야 하는 주변 종속 코드가 없는 경우에는 더욱 그렇습니다. 원자적 연산을 사용합니다.
  • 다른 CPU에서는 처리량이 많은 시나리오나 주변 코드가 원자적 연산과 실행이 겹칠 수 있는 경우 mov-store mfence가 더 나을 수 있습니다.

구현 세부 정보

실제로 순차적 일관성을 갖춘 std::atomic 저장소의 구체적인 구현은 컴파일러 및 하드웨어 아키텍처에 따라 다릅니다.

  • GCC/ Clang: 원래 mov-store mfence를 사용했지만 최근 seq-cst 저장소에 XCHG를 사용하도록 전환했습니다.
  • 인텔 컴파일러: seq-cst 저장소에 XCHG를 사용합니다.
  • Microsoft Visual C: 또한 seq-cst 저장소에 XCHG를 사용합니다.

암시적 획득 울타리

x86이 상점에 암시적 획득 울타리가 있는 것이 올바르지 않습니다. x86의 저장소에는 획득 의미가 아닌 릴리스 의미가 있습니다. 획득 의미 체계는 일반적으로 std::memory_order_acquire 의미 체계를 사용하는 mfence 또는 원자 읽기 작업과 같은 메모리 장벽을 사용하여 적용됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3