>백엔드 개발 >C++ >C 제한에도 불구하고 x86_64에서 Double 및 벡터에 대한 원자적 연산을 어떻게 달성할 수 있습니까?

C 제한에도 불구하고 x86_64에서 Double 및 벡터에 대한 원자적 연산을 어떻게 달성할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-28 06:06:19365검색

How Can Atomic Operations on Doubles and Vectors Be Achieved on x86_64 Despite C   Limitations?

잠금 없는 지원이 부족한 C의 std::atomic의 제한에도 불구하고 x86_64는 double 및 벡터에 대한 특정 원자 연산에 대한 어셈블리 수준 지원을 제공합니다.

원자 이중 연산 x86_64

  • 자연스럽게 정렬된 로드 및 저장(최대 8바이트)은 원자적입니다.
  • 원자적 읽기-수정-쓰기 작업(RMW)에는 cmpxchg를 사용한 재시도 루프가 필요합니다. .
  • cmpxchg16b는 16바이트 원자 로드에 사용할 수 있습니다.

x86_64의 SSE/AVX 벡터 연산

C에서는 현재 원자적 AVX/SSE 벡터 연산에 대한 지원이 부족하지만 방법은 없습니다. 전체에 걸쳐 128b 또는 256b 캐시 라인의 원자적 전송을 보장합니다.

그러나 정렬된 double의 공유 배열에서 벡터 로드/저장을 사용할 때 찢어짐 위험을 최소화하기 위해 특정 예방 조치를 취할 수 있습니다.

Atomic 16B Load

  • desired=expected와 함께 잠금 cmpxchg16b를 사용하면 원자성을 제공할 수 있습니다. 16B 로드.

Atomic 16B Store 및 RMW

  • cmpxchg16b 잠금은 Atomic 16B Store 및 RMW 작업에 사용할 수 있습니다.

원자적 연산 8B 반쪽을 갖는 16B 객체

  • 8B 반쪽을 독립적으로 읽으면서 16B 객체를 원자적으로 업데이트할 수 있습니다.

컴파일러 및 원자적 연산

컴파일러가 항상 최적의 결과를 생성하는 것은 아닙니다. 원자적 연산을 위한 어셈블러 코드. 예를 들어 XMM과 이중 레지스터 간의 직접적인 movsd 로드/저장을 피하고 대신 로터리 방법을 선택할 수 있습니다.

위 내용은 C 제한에도 불구하고 x86_64에서 Double 및 벡터에 대한 원자적 연산을 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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