문제

마이크로소프트가 제공하는 InterlockedCompareExchange 원자 비교 및 ​​교환 작업을 수행하는 함수입니다.또한 _InterlockedCompareExchange 본질적인.

x86에서는 다음을 사용하여 구현됩니다. cmpxchg 지침.

그러나 이 세 가지 접근 방식에 대한 문서를 읽어 보면 정렬 요구 사항에 동의하지 않는 것 같습니다.

인텔의 참조 매뉴얼 정렬에 대해서는 아무 말도하지 않습니다 (그 외에는 만약에 정렬 검사가 활성화되고 정렬되지 않은 메모리 참조가 이루어지면 예외가 생성됩니다.

나도 찾아봤는데 lock 접두사, 특히 다음과 같이 명시되어 있습니다.

LOCK 접두어의 무결성은 다음과 같습니다. ~ 아니다 메모리 필드 정렬에 영향을 받습니다.

(강조는 내 것)

그래서 인텔은 정렬은 무관하다고 말하는 것 같습니다.작업은 무슨 일이 있어도 원자적입니다.

그만큼 _InterlockedCompareExchange 본질적인 문서도 정렬에 대해 아무 것도 말하지 않습니다. InterlockedCompareExchange 기능 다음과 같이 말합니다

이 함수의 매개변수는 32비트 경계에 정렬되어야 합니다.그렇지 않으면 함수가 다중 프로세서 x86 시스템 및 x86이 아닌 시스템에서 예기치 않게 작동합니다.

그러면 무엇이 주는가?다음에 대한 정렬 요구 사항은 무엇입니까? InterlockedCompareExchange 486 이전 CPU에서도 기능이 작동하는지 확인하기 위해서입니다. cmpxchg 교육은 안되나요?위의 정보를 바탕으로 한 것 같지만, 이에 의존하기 전에 먼저 확인해 보고 싶습니다.:)

아니면 원자성을 보장하기 위해 ISA에서 정렬이 필요한데 인텔 참조 매뉴얼에서 잘못된 위치를 찾고 있는 것입니까?

도움이 되었습니까?

해결책

그만큼 인용하고 있는 PDF 1999년부터이고 분명히 구식입니다.

그만큼 최신 인텔 문서, 구체적으로 볼륨-3A 다른 이야기를 합니다.

예를 들어, Core-i7 프로세서에서는 여전히 데이터가 캐시 라인을 넘지 않는지 확인해야 합니다. 그렇지 않으면 작업이 원자적으로 보장되지 않습니다.

볼륨 3A, 시스템 프로그래밍, x86/x64용 Intel에서는 다음과 같이 명확하게 설명합니다.

8.1.1 보장된 원자적 연산

Intel486 프로세서(및 이후 최신 프로세서)는 다음을 보장합니다 기본 메모리 작업은 항상 원자성으로 수행됩니다.

  • 바이트 읽기 또는 쓰기
  • 16비트 경계에 정렬된 단어 읽기 또는 쓰기
  • 32비트 경계에 정렬된 더블워드 읽기 또는 쓰기

펜티엄 프로세서(및 그 이후의 최신 프로세서)는 다음을 보장합니다 추가 메모리 작업은 항상 원자성으로 수행됩니다.

  • 64비트 경계에 정렬된 쿼드워드 읽기 또는 쓰기
  • 32비트 데이터 버스에 맞는 캐시되지 않은 메모리 위치에 대한 16비트 액세스

P6 제품군 프로세서(및 이후 최신 프로세서)는 다음을 보장합니다. 추가 메모리 작업은 항상 원자성으로 수행됩니다.

  • 캐시에 맞는 캐시된 메모리에 대한 정렬되지 않은 16비트, 32비트 및 64비트 액세스 줄

캐시 라인과 페이지 경계에 걸쳐 분할된 캐시 가능한 메모리에 대한 액세스Accesses to cacheable memory that are split across cache lines and page boundaries Intel Core 2 Duo, Intel Atom, Intel® Core에 의해 원자성이 보장되지 않습니다.™ 듀오, 펜티엄 M, 펜티엄 4, 인텔 제온, P6 제품군, 펜티엄 및 인텔486 프로세서.인텔 코어 2 듀오, 인텔 아톰, 인텔 코어 듀오, 펜티엄 M, 펜티엄 4, 인텔 제온, 및 P6 제품군 프로세서는 외부 메모리를 허용하는 버스 제어 신호를 제공합니다 분할 액세스를 원자적으로 만드는 하위 시스템;그러나 정렬되지 않은 데이터 액세스는 프로세서의 성능에 심각한 영향을 미치므로 피해야 합니다.

다른 팁

x86은 그렇습니다 ~ 아니다 에 대한 정렬이 필요합니다 cmpxchg 지침.그러나 성능을 위해서는 정렬을 권장합니다.이는 놀라운 일이 아닙니다. 이전 버전과의 호환성은 14년 전에 설명서를 사용하여 작성된 소프트웨어가 오늘날의 프로세서에서도 여전히 실행된다는 것을 의미합니다.

Microsoft에서 정렬을 요구하는 이유는 문서에서 명확하지 않습니다.성능을 위한 것일 수도 있고 RISC 아키텍처를 지원하기 위한 것일 수도 있고 둘 다를 위한 것일 수도 있습니다.

Intel® 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼
3권(3A):시스템 프로그래밍 가이드
2013년 1월

8.1.2.2 소프트웨어 제어 버스 잠금

LOCK 의미 체계를 명시적으로 강제하기 위해 소프트웨어는 메모리 위치를 수정하는 데 사용될 때 다음 지침과 함께 LOCK 접두사를 사용할 수 있습니다.[...]

• 교환 지침(XADD, CMPXCHG 및 CMPXCHG8B).
• XCHG 명령에는 LOCK 접두사가 자동으로 사용됩니다.
• [...]

[...] 버스 잠금 장치의 무결성은 정렬의 영향을 받지 않습니다. memory 필드.LOCK 시맨틱은 많은 버스 주기에 대해 따릅니다 필요에 따라 전체 피연산자를 업데이트합니다.그러나, 추천입니다 잠긴 액세스가 더 나은 자연 경계에 정렬되도록 합니다. 시스템 성능:

• 8비트 액세스에 대한 모든 경계(잠김 또는 기타).
• 잠긴 워드 액세스를 위한 16비트 경계.
• 잠긴 더블워드 액세스를 위한 32비트 경계.
• 잠긴 쿼드워드 액세스를 위한 64비트 경계.

보다 이 SO 질문:자연스러운 정렬은 성능에 중요하며 x64 아키텍처에 필요합니다(따라서 PRE-x86 시스템뿐만 아니라 POST-x86 시스템도 마찬가지입니다. x64는 여전히 틈새 시장일 수 있지만 결국 인기가 높아지고 있습니다. -);이것이 Microsoft가 필요에 따라 이를 문서화하는 이유일 수 있습니다(MS가 정렬 검사를 활성화하여 정렬 문제를 강제로 결정했는지 여부에 대한 문서를 찾기가 어렵습니다. 이는 Windows 버전에 따라 다를 수 있습니다.문서에서 정렬이 필요하다고 주장함으로써 MS는 다른 버전에서는 강제하지 않더라도 일부 Windows 버전에서는 강제로 강제할 수 있는 자유를 유지합니다.

Microsoft의 Interlocked API는 ia64에도 적용되었습니다(아직 존재하는 동안).ia64에는 잠금 접두어가 없었고 cmpxchg.acq 및 cmpxchg.rel 명령(또는 fetchadd 및 기타 유사한 짐승)만 있었으며 올바르게 기억한다면 이 모든 것에는 정렬이 필요했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top