2013-09-30 3 views
2

x86- 명령어 LOCK XCHGMOV+MFENCE 사이의 로직 및 성능의 차이점은 무엇입니까? 단 하나의 캐시 라인 LOCK XCHG 잠금, 그 반대 MOV+MFENCE 잠금 전체 캐시 L3 (LLC) : LOCK XCHG와 MOV + MFENCE 간의 논리와 성능의 차이점은 무엇입니까?

그것은 그 원자 작업을 실행하는 동안, 순차적 일관성을 위해, 사실인가요?

+2

사과와 오렌지는 MFENCE는 원 자성을 제공하지 않습니다. –

+0

@Hans Passant MOF가 이미 원자력을 가지고 있기 때문에 MFENCE가 원 자성을 제공한다고 말하지는 않았습니다. MOV는 이미 원자력을 가지고 있기 때문에 - 이것은 SC를 제외한 x86의 모든 순서에 대해 C11 ('atomic')/C++ 11 ('std :: atomic') (순차적 인 일관성) : http://en.cppreference.com/w/cpp/atomic/memory_order 그러나 나는 MFENCE가 C11 ('atomic')/C에서 볼 수있는 원자 변수에 대해 순차적 인 일관성 **을 제공한다고 말했다. ++ 11 ('std :: atomic') GCC4.8.2 : http://stackoverflow.com/questions/19047327/why-gcc-does-not-use-loadwithout-fence-and-storesfence-for-stdmemory- – Alex

+0

'mov'는 어쩌면 원 자성 이겠지만'xchg'는 하나의'mov'로 표현 될 수 없습니다. –

답변

2

차이점은 사용 목적입니다.

MFENCE (또는 SFENCE 또는 LFENCE)는 둘 이상의 스레드에서 액세스 가능한 메모리 영역의 일부를 잠그는 데 유용합니다. 우리가 원자 적으로이 메모리 영역에 대한 자물쇠를 설정할 때 더 빠른 것이기 때문에 모든 비 아톰 명령어를 사용할 수 있습니다. 그러나 메모리 영역을 잠그기 전에 SFANCE (또는 MFENCE)를 호출하여 하나의 명령을 호출해야만 잠긴 메모리가 다른 모든 스레드에 핵심적으로 표시 될 수 있습니다.

단일 메모리 정렬 변수 만 변경하는 경우 LOCK XCHG와 같은 원자 적 명령어를 사용하므로 메모리 영역을 잠글 필요가 없습니다.

+0

큰 메모리 영역 (8 바이트 - 1MB 이상)에 대해 순차적 일관성을 유지하고 최상의 성능을 사용하려면 MFENCE를 사용하고 작은 영역에 대해 순차적 일관성을 유지하려면 메모리를 단일 변수 (1 바이트 (char) - 8 바이트 (long long))로 사용하면 LOCK XCHG를 더 잘 사용할 수 있습니까? LOCK은 단일 캐시 라인 만 잠 그기 때문에 MFENCE는 전체 cache-L3 (LLC)을 잠급니다. – Alex

+0

@Alex : 예 MFENCE는 해당 명령어를 실행 한 후에 모든 스레드에서로드 - 메모리 및 저장소 - 메모리가 올바르게 표시되도록 보장합니다. MFENCE는 원자 적 지시와 공통점이 없습니다. –

+2

아니요, x86 잠금 장치 자체가 mfence입니다 (동영상의 경우에도 마찬가지입니다). 따라서 다른 섹션은 필요하지 않습니다 (중요한 섹션의 출입시 임의의 한 방향 울타리는 말할 것도 없습니다). 또한, L3을 잠그는 것과 같은 것은 없습니다. ** mfence는 아무런 잠금도하지 않습니다 ** (어떤 원 자성을 보장하지는 않습니다), 단지 그것을 사용하는 스레드에서 모든 메모리 연산 *의 직렬화를 보장합니다 * – Leeor