3

I는 x86_64의 CAS 명령어 LOCK CMPXCHG를 사용할 때, 즉 원자는 (값을 판독 비교 결과를 다시 쓰기) 잠겨 있는지 이때 동안 :x86_64 CAS 명령어를 사용할 때 하나의 캐시 라인 또는 L3 캐시 만 잠급니다.

  1. 단 하나 개의 캐시 라인 L3 캐시에? (이 시점에서 L3의이 캐시 라인에서 읽고 쓸 수있는 코어는 없습니다)
  2. 또는 L3 캐시가 완전히 있습니까? (이 시점에 L3 캐시에서 읽기/쓰기 할 수없는 코어가 하나도 없음)

x86_64 Intel CPU가 사용하는 것은 사실입니까? 캐시 라인의 배타적 상태의

  • 1 번째 aproach (MOESI/MESIF) 독점

답변

6

어느 제외한 상태의

  • 2 차의 aproach 정확하다. 두 번째는 현재 x86 락 CPU에서 일반적인 잠금 장치가 작동하지 않는 희귀하고 병리적인 경우 인 버스 잠금 장치에서 실제로 발생하는 것과 비슷합니다. 이전의 486/초기 펜티엄에서는 일반적 이었지만 새로운 제품에서는 일반적인 경우가 훨씬 간단합니다. 캐시에서 행을 잠그지 만 가능한 한 빨리 읽기 - 수정 - 쓰기 기능을 수행하기를 원하기 때문에 - L3에서 이렇게하는 것도 의미가 없습니다. 대신 운영 코어에 가장 가까운 캐시 (L1 또는 일부 내부 구조)를 선택하게됩니다.

    원자 RMW가 간단한 MESI를 사용하더라도 캐시에서 안전하게 수행된다는 것을 보장 할 수 있습니다. 먼저 일반 쓰기와 마찬가지로 라인의 소유권을 얻습니다. 그러면 알고있을 때 원자 흐름을 수행 할 수 있습니다 다른 코어에는이 행이 없음을 확실히하십시오. 유일한 문제는 스 누프가 이론적으로 중간에 올 수 있기 때문에 RMW가 완료 될 때까지이 행에 대한 스 누프를 단순히 차단하는 것입니다. 그러나 그 기간 동안 다른 활동을 허용해도 아무런 문제가 없습니다 (예 : 같은 코어에서 나오는 다른 요청 또는 스 누프가 들어오는 것과 같은). 다른 제한 사항은 메모리 순서와 관련된 것이지만 일반적으로 메모리 단위에서 처리됩니다 캐시에서 여전히 순서의 개념)이 아닌

    이 대답 매뉴얼 섹션을 참조 -.! x86 LOCK question on multi-core CPUs

  • +0

    감사합니다, 즉 지금은 대부분의 경우는'LOCK'은 그것이하는 의미에서 무시됩니다 접두사 원래 생성 된 - 잠금 버스 (초기 FSB 및 현재 QPI). 그리고 대부분의 경우 잠금 버스가 아닌 CPU 코어는 캐시 라인에 특정 플래그를 추가하여 스누프 응답을 비활성화합니다. "무시 된 잠금"- * "LOCK 작업 중에 잠긴 메모리 영역이 프로세서에 캐시 된 경우 쓰기 연산 메모리로 LOCK 연산을 수행하고 캐시 라인에 완전히 포함되면 프로세서는 버스에서 LOCK # 신호를 어서 트하지 않을 수 있습니다. "* http://stackoverflow.com/a/3339380/1558037 – Alex

    +1

    정확히. 나는이 섹션을 새로운 매뉴얼에서 찾을 수 없었다. (그들은이 말을 바꾸었을 수도있다.) 그러나이 가정은 그대로 남아 있어야한다. – Leeor