>  기사  >  백엔드 개발  >  `std::atomic`이 순차적으로 일관된 저장소에 `XCHG`를 사용하는 이유는 무엇입니까?

`std::atomic`이 순차적으로 일관된 저장소에 `XCHG`를 사용하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-24 01:37:14990검색

Why Does `std::atomic` Use `XCHG` for Sequentially Consistent Stores?

std::atomic이 순차 일관성 저장소를 위해 XCHG를 사용하는 이유

배경

멀티스레딩 영역에서 std::atomic 클래스는 다음을 제공합니다. 데이터 무결성을 보장하면서 스레드 간에 공유 데이터에 대한 동시 액세스를 의미합니다. 저장소 멤버 함수를 사용하면 지정된 메모리 순서 지정 의미론을 사용하여 원자 변수에 값을 쓸 수 있습니다.

순차적 일관성(std::memory_order_seq_cst)의 경우 x86 아키텍처는 xchg 명령을 사용하여 원자 저장소를 구현합니다. 이 명령어는 단순한 저장 작업이 아닌 값의 동시 교환을 수행합니다.

XCHG에 대한 동기

간단한 저장 명령어가 메모리 장벽(예: _ReadWriteBarrier())과 결합된 것처럼 보일 수 있지만 또는 asm 휘발성("" ::: "memory");)은 순차적 일관성을 위해 충분할 것입니다. xchg를 사용하면 여러 가지가 있습니다. 장점:

1. 전체 메모리 장벽: xchg는 암시적 잠금 접두사로 인해 x86에서 완전한 메모리 울타리 역할을 합니다. 이렇게 하면 xchg 전후의 모든 메모리 작업이 순서대로 지정되어 메모리 재정렬을 효과적으로 방지할 수 있습니다.

2. 릴리스 의미 체계가 불충분함: x86의 일반적인 저장 작업은 로드 획득을 포함한 후속 작업으로 재정렬을 허용하는 릴리스 의미 체계를 나타냅니다. 반면 순차적 일관성을 위해서는 이러한 재정렬이 금지되어야 합니다.

성능 고려 사항

atomic Store에 대해 xchg와 mov mfence 중에서 선택하는 것은 성능에 영향을 미칩니다.

  • Skylake: mfence가 ALU 명령어의 잘못된 실행을 지연시킵니다. xchg는 그렇지 않습니다. 그러나 xchg는 이전에 로드된 값에 대해 잘못된 종속성을 전달합니다.
  • AMD: 하드웨어 최적화 매뉴얼에서는 순차 일관성 저장소에 xchg를 사용할 것을 권장합니다.
  • GCC/ Clang 최적화: 최신 컴파일러는 일반적으로 mov보다 xchg를 선호합니다. mfence.

스레드 펜스의 대안

원자 저장소에 xchg를 사용하는 것 외에도 원자 스레드 펜스를 구현하기 위한 다른 옵션(seq_cst 메모리 순서 지정 포함)은 다음과 같습니다.

  • 스택에 추가 잠금
  • lock 또는 dword [rsp], 0

릴리스와 획득 구별

다음 사항에 유의하는 것이 중요합니다.

  • 순차적 일관성을 갖춘 저장소는 의미를 획득한다는 의미는 아닙니다.
  • asm 휘발성("" ::: "memory"); 컴파일러 장벽일 뿐이며 순차 일관성을 적용하지 않습니다.
  • 약한 순서의 작업과 펜스를 사용하여 순차 일관성을 에뮬레이트하는 것은 C 추상 기계 모델과 완전히 일치하지 않을 수 있습니다.

결론

요약하자면 x86 아키텍처에서 순차 일관성을 갖춘 std::atomic 저장소는 전체 메모리 장벽 효과와 다음과의 호환성으로 인해 xchg를 활용합니다. 순차적 일관성의 요구 사항. 대체 구현이 존재하지만 xchg는 효율성과 업계 권장 사항 준수를 위해 널리 채택되는 솔루션으로 남아 있습니다.

위 내용은 `std::atomic`이 순차적으로 일관된 저장소에 `XCHG`를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.