> 백엔드 개발 > C++ > x86_64에서 이중 및 벡터 연산은 얼마나 원자적입니까?

x86_64에서 이중 및 벡터 연산은 얼마나 원자적입니까?

Susan Sarandon
풀어 주다: 2024-11-28 13:27:14
원래의
625명이 탐색했습니다.

How Atomic Are Double and Vector Operations on x86_64?

x86_64의 Double 및 벡터에 대한 원자 연산

C 11 std::atomic 대부분의 구현에서 잠금 없는 작업을 제공하지만 원자 AVX 또는 SSE 벡터 작업은 여전히 ​​CPU에 종속되며 어셈블리 수준 지원이 부족합니다.

Doubles의 원자 작업

  • 로드 및 저장 작업은 기본적으로 double을 포함하여 8바이트에 대해 원자적입니다.
  • 읽기-수정-쓰기 작업에는 직접적인 메모리 대상 명령이 없으므로 cmpxchg(또는 TSX)를 사용하여 루프를 다시 시도하십시오.
  • Cmpxchg16b는 16바이트 원자 RMW 작업에 사용할 수 있습니다.
  • IEEE 부동 소수점 작업의 일부 특수한 경우는 다음과 같습니다. 정수 연산(예: 절대값, 부정).

벡터의 원자적 연산

  • 캐시 일관성 시스템 전체에서 원자 벡터 로드/저장 작업에 대한 하드웨어 지원은 없습니다.
  • 배열로 정렬된 배열의 벡터 로드/저장은 캐시 라인 위험 없이 안전하게 사용할 수 있습니다. 찢어짐.
  • 16바이트 원자 로드/저장/RMW의 경우 cmpxchg16b를 사용할 수 있습니다.
  • 16바이트 객체를 원자적으로 업데이트하는 것은 가능하지만 8바이트 절반을 별도로 읽는 것은 보장되지 않습니다. 원자적이어야 합니다.

컴파일러 지원

  • 컴파일러가 항상 원자에 대한 효율적인 어셈블리를 생성하는 것은 아닙니다. 로드/저장(예: xmm 레지스터에서 직접 mov 명령어 사용).
  • 원자 벡터(atomic<__m128d> 또는omic<__m256d>)는 읽기 전용에도 cmpxchg16b가 필요하므로 효율적으로 구현되지 않습니다. 또는 쓰기 전용 작업입니다.

위 내용은 x86_64에서 이중 및 벡터 연산은 얼마나 원자적입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿