>백엔드 개발 >C++ >x86_64 아키텍처에서 원자 부동 소수점 및 벡터 연산은 어떻게 처리됩니까?

x86_64 아키텍처에서 원자 부동 소수점 및 벡터 연산은 어떻게 처리됩니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-07 06:08:15488검색

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

x86_64의 원자 부동 소수점 연산

C는 기본적으로 원자 이중 연산을 지원하지 않지만 잠금 없는 원자 대부분의 플랫폼에서 구현됩니다. 이러한 구현에서는 일반적으로 잠금 cmpxchg 명령과 함께 CAS(비교 및 교체) 작업을 사용합니다.

x86_64의 원자 벡터 작업의 경우 직접적인 하드웨어 지원이 없습니다. 그러나 정렬된 128비트 및 256비트 로드 및 저장은 일반적으로 원자성이 보장됩니다. 정렬되지 않은 벡터 연산의 경우 원자성 보장이 덜 명확합니다.

이중 및 벡터 연산에 대한 어셈블리 수준 지원

x86_64는 원자성 연산에 대한 어셈블리 수준 지원을 제공합니다. 복식과 벡터:

  • 더블: 원자 로드, 저장 및 더하기/빼기/곱하기 연산은 메모리 대상 명령어 movsd, movq, addd, subsd 및 mulsd를 통해 지원됩니다.
  • 벡터: 정렬된 128비트 256비트 로드 및 저장은 AVX를 지원하는 x86_64에서 원자적입니다. 정렬되지 않은 벡터 연산의 경우 원자성에 대한 직접적인 하드웨어 보장은 없습니다.

MSVC 2017 Lock-Free 원자

MSVC 2017 구현 잠금 없는 원자을 구현합니다. 이중 폭 정수 레지스터를 사용하는 연산. 예를 들어 로드 작업에는 다음이 포함됩니다.

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS

추가 작업에는 다음이 사용됩니다.

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS

Atomic RMW(Read-Modify-Write) 작업

fetch_add와 같은 원자적 읽기-수정-쓰기(RMW) 작업에는 CAS 루프가 필요합니다. 구현. x86_64에서 CAS 명령어는 16바이트 작업(cmpxchg16b)을 지원합니다.

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax

CAS 루프는 원자 RMW 기능을 제공하지만 원자 로드 및 저장보다 비용이 더 많이 듭니다.

추가 참고사항

  • 일부 x86이 아닌 하드웨어는 float/double 유형에 대한 원자 추가 작업을 지원합니다.
  • 인텔의 TSX(Transactional Memory Extensions)는 원자 FP 및 SIMD 작업에 대한 향상된 지원을 제공합니다.
  • 컴파일러는 종종 원자<에 대한 비효율적인 코드를 생성합니다. ;더블> 그러나 개선이 이루어지고 있습니다.
  • 정렬된 double의 공유 배열에 대한 원자 연산은 안전해야 하지만 정렬되지 않은 벡터에 대한 연산에는 찢어짐이 포함될 수 있습니다.
  • 16에서 원자 연산을 구현하는 것이 가능합니다. -cmpxchg16b를 사용하는 바이트 개체이지만 성능이 저하됩니다.

위 내용은 x86_64 아키텍처에서 원자 부동 소수점 및 벡터 연산은 어떻게 처리됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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