>백엔드 개발 >C++ >x86_64는 배정밀도 부동 소수점 값 및 벡터에 대한 진정한 원자 지원을 제공합니까?

x86_64는 배정밀도 부동 소수점 값 및 벡터에 대한 진정한 원자 지원을 제공합니까?

DDD
DDD원래의
2024-12-02 02:57:10725검색

Does x86_64 Offer True Atomic Support for Double-Precision Floating-Point Values and Vectors?

x86_64에서 Double 및 벡터에 대해 어셈블리 수준 Atomic 지원을 사용할 수 있습니까?

C 11 std::atomic 일반적으로 일반적인 구현에서는 잠금이 없지만 컴파일러 생성 코드의 잠재적인 비효율성으로 인해 효율성이 제한됩니다. 컴파일러는 부동 소수점 값과 관련된 원자 연산에 대해 항상 최적의 어셈블리를 생성하지 않을 수 있습니다.

또한 C 11 std::atomic은 정수 또는 부동 소수점에 대한 Intel의 TSX(트랜잭션 메모리 확장)용 API를 제공하지 않습니다. 포인트 운영. TSX는 범용 레지스터와 부동 소수점 레지스터 간의 데이터 이동과 관련된 오버헤드를 제거하여 원자 연산 성능을 크게 향상시킬 수 있습니다.

벡터용 원자 로드 및 저장

x86_64에 원자가 부족하다는 주장에도 불구하고 벡터에 대한 지원, 자연적으로 정렬된 로드 및 벡터를 포함하는 최대 8바이트의 저장은 x86 프로세서에서 원자적입니다. 여기에는 x87 또는 SSE 명령어를 사용한 로드 및 저장이 포함됩니다. 따라서 배정밀도 부동 소수점 값의 정렬된 로드 및 저장은 원자적입니다.

원자적 읽기-수정-쓰기 작업

원자적 읽기-수정-쓰기 작업(예: 원자 추가)은 배정밀도 부동 소수점 값이나 벡터에는 직접 지원되지 않습니다. x86_64에서 이러한 작업에 대한 유일한 옵션은 cmpxchg 명령어 또는 TSX를 사용하는 재시도 루프입니다.

원자성 연산의 특수 사례

IEEE 부동 소수점 연산의 일부 특수 사례는 정수를 사용하여 구현할 수 있습니다. 운영. 예를 들어 원자 연산을 사용하여 부호 비트를 뒤집어 배정밀도 부동 소수점 값을 부정할 수 있습니다.

원자 벡터 로드 및 저장

원자에 대한 하드웨어 보증은 없지만 벡터 로드 및 저장을 수행하는 경우 일반적으로 정렬된 벡터 로드 및 배정밀도 부동 소수점 값 저장으로 인해 찢어짐이 발생하지 않는다고 가정하는 것이 안전합니다. 그러나 정렬되지 않은 값을 포함하는 원자 벡터 연산은 안전하지 않을 수 있습니다. 이에 대한 예외는 SSE/AVX 작업에 대해 128비트 원자성을 보장하는 Intel의 AVX 기능입니다.

16B 개체에 대한 원자성 작업

16바이트 개체에 대한 원자성 작업을 수행하려면 기본 원자 작업 너비보다 크면 잠금 cmpxchg16b를 사용해야 합니다. 이로 인해 일반적인 원자성 작업에 비해 상당한 성능 오버헤드가 발생할 수 있으므로 성능이 중요한 시나리오에는 적합하지 않습니다.

위 내용은 x86_64는 배정밀도 부동 소수점 값 및 벡터에 대한 진정한 원자 지원을 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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