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 기능입니다.
16바이트 개체에 대한 원자성 작업을 수행하려면 기본 원자 작업 너비보다 크면 잠금 cmpxchg16b를 사용해야 합니다. 이로 인해 일반적인 원자성 작업에 비해 상당한 성능 오버헤드가 발생할 수 있으므로 성능이 중요한 시나리오에는 적합하지 않습니다.
위 내용은 x86_64는 배정밀도 부동 소수점 값 및 벡터에 대한 진정한 원자 지원을 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!