2009-05-19 2 views
6

Microsoft에서 InterlockedExchange에 메모리 정렬이 필요하다고 혼란 스럽지만 Intel 설명서에 LOCK에 메모리 정렬이 필요 없다고 나와 있습니다. 나는 무엇인가 놓치고 있나? 감사InterlockedExchange 및 메모리 정렬

마이크로 소프트 MSDN 라이브러리

플랫폼 SDK에서

: DLL을 프로세스 및 스레드 InterlockedExchange는

변수는 32 비트 경계에 정렬해야하는 대상 매개 변수가 가리키는 ; 그렇지 않은 경우이 함수는 다중 프로세서 x86 시스템 및 비 x86 시스템에서 예기치 않게 작동합니다 ().

인텔 소프트웨어 개발자 가이드;

  • LOCK 명령어는 프로세서의 LOCK # 신호가 첨부 된 명령의 실행 중에 발생 실리는 (원자 명령으로 지시 변). 다중 프로세서 환경에서 LOCK # 신호는 프로세서가을 사용하는 동안 신호가 어 써트되는 동안 만 사용한다는 것을 보장합니다.

    LOCK 접두사의 무결성은 메모리 필드의 정렬에 영향을받지 않습니다. 임의로 정렬되지 않은 필드에 대해 메모리 잠금이 관찰됩니다. P6에서

  • 메모리 주문 및 최근의 프로세서 제품군

    잠금 지침은 전체 순서가 있습니다.

    버스 잠금 장치의 무결성을 잠금

  • 소프트웨어 제어 버스는 메모리 필드의 정렬에 영향을받지 않습니다. 전체 피연산자를 갱신하는 데 필요한만큼의 버스 사이클만큼 에 대해 LOCK 의미를 따른다. 그러나 더 나은 시스템 성능을 위해 잠긴 액세스를 본래의 경계에 맞추는 것이 좋습니다. • 8 비트 액세스의 모든 경계 (잠김 또는 기타). • 잠긴 단어 액세스의 경우 16 비트 경계입니다. • 잠긴 더블 워드 액세스의 경우 32 비트 경계. • 잠긴 쿼드 워드 액세스의 경우 64 비트 경계.

답변

1

메모리를 필요로하지 않는 잠금 접두사 정렬하고, OS가 다음 CMPXCHG 것 확인 정렬을 활성화 한 경우 아마 InterlockedExchange()를 구현하는 데 사용되는 CMPXCHG 작업은 정렬을 필요로하지 않는다하더라도 정렬되지 않은 피연산자로 실행될 때 정렬 검사 예외 (AC)를 발생시킵니다. 문서 보호 모드 예외 목록을보고 cmpxchg 및 유사점을 확인하십시오. Windows에서 정렬 검사를 사용할 수 있는지 확실하지 않지만 놀라지 않을 것입니다.

+0

그럴까요? : "cmpxchg operation ... 이 없습니다 * 않습니다 * 맞춤 *"필요합니다 " –

1

안녕하세요, I과 관련된 몇 가지 질문에 답변했습니다.

  1. InterlockedExchangeNO 바이트 레벨 가 존재하지만 16 비트 짧은 InterlockedExchange이다.
  2. 당신이 참조하는 문서의 불일치는 아마도 약간의 문서 감독 일뿐입니다.
  3. 당신이 할 일 바이트/비트 수준의 원자 액세스하려는 경우, 가지 방법 pleanty 기존 내장 함수와이 할 일이있다, 연동 [And8 | OR8 | Xor8]
  4. 모든 작업을 어디에하고 높은 반환 한 잠금 (사용 사용자가 논의한 것처럼 machiene 코드), 정렬되지 않은 상태로 작동해서는 안됩니다 (성능 방지 패턴)
  5. xchg (암시 적 LOCK 접두사가있는 최적화 된 명령어이며, 캐시 잠금 기능을 통해 최적화되고 메인 기억). CAN은 8 비트 연동 작동을 수행합니다.

나는 인텔의 TBB에서 거의 잊어 버렸으므로 암시 적 또는 명시 적 잠금 (일부 경우)을 사용하지 않고로드/저장 8 비트를 정의했습니다.

.code 
    ALIGN 4 
    PUBLIC c __TBB_machine_load8 
__TBB_machine_Load8: 
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check. 
    mov ecx,4[esp] 
    test ecx,7 
    jne load_slow 
    ; Load within a cache line 
    sub esp,12 
    fild qword ptr [ecx] 
    fistp qword ptr [esp] 
    mov eax,[esp] 
    mov edx,4[esp] 
    add esp,12 
    ret 

EXTRN __TBB_machine_store8_slow:PROC 
.code 
    ALIGN 4 
    PUBLIC c __TBB_machine_store8 
__TBB_machine_Store8: 
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check. 
    mov ecx,4[esp] 
    test ecx,7 
    jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp 
    fild qword ptr 8[esp] 
    fistp qword ptr [ecx] 
    ret 
end 

어쨌든,이 모든 것을 당신에게 조금이라도 바란다면.

6

이전에 Microsoft는 MIPS, PowerPC 및 Alpha와 같은 x86 이외의 프로세서에서 WindowsNT를 지원했습니다. 이러한 프로세서는 모두 연동 명령어에 대한 정렬이 필요하므로 Microsoft는 이러한 기본 원칙을 다른 아키텍처로 이식 할 수 있는지 확인하기 위해 요구 사항을 사양에 지정합니다.

+0

또한 x64 모드는 연동 작업에서 정렬이 필요합니다 – Rom

-1

인텔 정보가 어디에서 왔는지 이해할 수 없습니다.

필자에게 Intel이 정렬 및/또는 스패닝 캐시 라인에 대해 신경을 쓰고 있다는 것은 분명하다.

예를 들어, Core-i7 프로세서에서 데이터가 캐시 라인을 넘지 않도록해야합니다. 그렇지 않으면 조작이 원자적일 수 있음이 보장되지 않습니다. 볼륨에

3-I는, 시스템 프로그래밍, 86의 경우/64 인텔은 명확하게 상태 :

8.1.(1) 보증 원자 운영

Intel486 프로세서 (이후 새로운 프로세서는) 다음과 같은 기본 메모리 작업은 항상 원자 적으로 수행 할 것을 보장

:

  • 읽기 또는 바이트
  • 읽기 쓰기 또는를 작성 워드는 16 비트 경계
  • 읽기 정렬 또는 32 비트 경계에 정렬 더블을 작성

  • 읽기 또는 64 비트 경계로 정렬 된 쿼드 워드를 기입하는
  • 16 비트 비 캐시에 대한 액세스 : 펜티엄 프로세서 (이후 새로운 프로세서) 다음 추가 메모리 동작이 항상 원자 적으로 수행 될 것이라는 보장 다음 추가 메모리 동작이 항상 원자 적으로 수행 될 것이다

P6 계열 프로세서 (및 최신 프로세서 때문에), 32 비트 데이터 버스에 맞 메모리 위치 보증 :

,691 363,210
  • 정렬되지 않은 16, 32, 및 64 비트 캐시 라인

이 이 보장되지 않습니다 캐시 라인과 페이지 경계에 걸쳐 분할 캐시 메모리에 액세스 맞 캐시 메모리에 액세스 인텔 코어 2 듀오, 인텔 아톰 ™, 인텔 코어 듀오, 펜티엄 M, 펜티엄 4, 인텔 제온, P6 제품군, 펜티엄 및 인텔 486 프로세서에 의해 원자 적이어야합니다. 인텔 코어 2 듀오, 인텔 아톰, 인텔 코어 듀오, 펜티엄 M, 펜티엄 4, 인텔 제온, 및 P6 패밀리 프로세서는 외부 메모리를 허용하는 버스 제어 신호를 제공합니다. 서브 시스템은 분할 액세스를 원자 단위로 처리합니다. 그러나 정렬되지 않은 데이터 액세스는 프로세서의 성능에 심각한 영향을 미치므로 피해야합니다 ( ).

+1

이 답변에 표시된 정보는"기본 메모리 작동 "과 관련이있는 것으로 보입니다. * 작업. –