> 백엔드 개발 > C++ > x86_64는 Double 및 SSE/AVX 벡터에 대한 원자적 연산을 지원합니까?

x86_64는 Double 및 SSE/AVX 벡터에 대한 원자적 연산을 지원합니까?

Mary-Kate Olsen
풀어 주다: 2024-11-27 06:58:10
원래의
1036명이 탐색했습니다.

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

x86_64의 원자 부동 소수점 연산 및 SSE/AVX 벡터 로드/저장

C 11은 잠금 없는 std::atomic을 지원하지만 현재 CPU 종속성으로 인해 원자성 AVX/SSE 벡터를 지원하지 않습니다. 그러나 질문이 생깁니다: x86_64는 double 또는 벡터에 대한 원자 연산에 대한 어셈블리 수준 지원을 제공합니까?

x86_64의 원자 연산

x86_64는 잠금을 사용하여 수행되는 double에 대한 다음 원자 연산을 지원합니다. 무료 지침:

  • 로드
  • 저장
  • 더하기
  • 빼기
  • 곱하기

원자 벡터 연산 x86_64

안타깝게도 캐시 일관성 시스템 전체에서 128b 또는 256b 벡터 저장 또는 로드의 원자성을 보장할 수 있는 방법이 없습니다. 그러나 정렬된 벡터의 경우 벡터 로드를 사용하고 찢어질 위험 없이 공유 이중 배열에 저장할 수 있습니다.

원자성 16B 로드가 필요한 경우 유일한 옵션은 want=expected로 잠금 cmpxchg16b를 사용하는 것입니다. 성공하면 기존 값을 그 자체로 바꿉니다. 실패하면 이전 내용을 얻게 됩니다. 이 "로드" 오류는 읽기 전용 메모리에 발생하므로 이 작업을 수행하는 함수에 포인터를 전달할 때 주의해야 합니다.

Atomic 16B Store와 RMW는 둘 다 명백한 방식으로 cmpxchg16b 잠금을 사용할 수 있습니다. 이로 인해 순수 저장소는 일반 벡터 저장소보다 비용이 훨씬 더 많이 들며, 특히 cmpxchg16b를 여러 번 재시도할 경우 더욱 그렇습니다. 그러나 원자 RMW는 이미 비용이 많이 듭니다.

원자 벡터 연산의 한계

  • atomic<__m128d> cmpxchg16b 사용으로 인해 읽기 전용 또는 쓰기 전용 작업의 경우에도 속도가 느려집니다.
  • atomic<__m256d> 잠금이 없을 수 없습니다.
  • alignas(64)omic 공유_버퍼[1024]; 자동 벡터화를 허용하지만 컴파일러는 이를 위해 효율적인 asm을 생성하지 않습니다.

16B 객체를 원자적으로 읽고 업데이트

16B 객체를 원자적으로 업데이트할 수 있지만 8B 절반을 별도로 읽을 수 있습니다. 그러나 컴파일러는 이를 명확하게 표현하는 방법을 제공하지 않으며 cmpxchg16b 인라인 처리는 컴파일러 개발자의 지속적인 고려로 인해 신뢰할 수 없습니다.

위 내용은 x86_64는 Double 및 SSE/AVX 벡터에 대한 원자적 연산을 지원합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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