x86_64의 Double 및 벡터에 대한 원자 연산
C 11 std::atomic 대부분의 구현에서 잠금 없는 작업을 제공하지만 원자 AVX 또는 SSE 벡터 작업은 여전히 CPU에 종속되며 어셈블리 수준 지원이 부족합니다.
Doubles의 원자 작업
- 로드 및 저장 작업은 기본적으로 double을 포함하여 8바이트에 대해 원자적입니다.
- 읽기-수정-쓰기 작업에는 직접적인 메모리 대상 명령이 없으므로 cmpxchg(또는 TSX)를 사용하여 루프를 다시 시도하십시오.
- Cmpxchg16b는 16바이트 원자 RMW 작업에 사용할 수 있습니다.
- IEEE 부동 소수점 작업의 일부 특수한 경우는 다음과 같습니다. 정수 연산(예: 절대값, 부정).
벡터의 원자적 연산
- 캐시 일관성 시스템 전체에서 원자 벡터 로드/저장 작업에 대한 하드웨어 지원은 없습니다.
- 배열로 정렬된 배열의 벡터 로드/저장은 캐시 라인 위험 없이 안전하게 사용할 수 있습니다. 찢어짐.
- 16바이트 원자 로드/저장/RMW의 경우 cmpxchg16b를 사용할 수 있습니다.
- 16바이트 객체를 원자적으로 업데이트하는 것은 가능하지만 8바이트 절반을 별도로 읽는 것은 보장되지 않습니다. 원자적이어야 합니다.
컴파일러 지원
- 컴파일러가 항상 원자에 대한 효율적인 어셈블리를 생성하는 것은 아닙니다. 로드/저장(예: xmm 레지스터에서 직접 mov 명령어 사용).
- 원자 벡터(atomic<__m128d> 또는omic<__m256d>)는 읽기 전용에도 cmpxchg16b가 필요하므로 효율적으로 구현되지 않습니다. 또는 쓰기 전용 작업입니다.
위 내용은 x86_64에서 이중 및 벡터 연산은 얼마나 원자적입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!