2009-11-03 14 views
6

Visual C++ 설명서에서 여러 스레드가 동일한 개체에서 읽는 것이 안전하다는 내용을 읽었습니다.다중 스레드 및 메모리

내 질문은 : 어떻게 여러 코어가있는 X86-64 CPU가 이것을 처리합니까?

1MB 메모리가 있다고 가정 해보십시오. 다른 스레드가 말 그대로 똑같은 데이터를 동시에 읽을 수 있습니까? 아니면 코어가 한 번에 한 단어 씩 읽을 수 있습니까?

답변

4

뿐만 아니라 다른 코어가 같은 메모리 블록에서 읽을 수 있습니다, 그들은 같은 시간에 쓸 수있어 너무. 그것이 "안전하다"면, 그것은 완전히 다른 이야기입니다. 자신이 특별히 허용하지 않는 방식으로 동일한 메모리 블록을 통해 싸우는 여러 코어를 보호하려면 코드에 일종의 가드를 구현해야합니다 (일반적으로 세마포 또는 그 파생어로 수행).

코어는 한 번에 읽습니다. 보통 레지스터는 32 비트 CPU에서 32 비트, 64 비트 CPU에서는 64 비트 등입니다. 스트리밍조차도 dword (예 : memcpy)에서 dword로 완료됩니다.

동시 다중 코어가 실제로 어떤지에 대해 모든 코어는 단일 버스를 사용하여 메모리를 읽고 쓰기 때문에 모든 리소스 (RAM, 외부 장치, 부동 소수점 처리 장치)에 액세스하는 것은 한 번에 하나의 요청입니다 한 번에 핵심. 그러나 코어 내부의 실제 프로세싱은 완전히 동시 적입니다. DMA 전송도 버스를 차단하지는 않습니다. 동시 전송은 한 번에 하나씩 대기열에 넣어 처리됩니다 (100 % 확신하지는 않습니다).

편집 : 여기에있는 다른 답글과는 달리 명확히하기 위해 노 캐시 시나리오 만 이야기합니다. 물론 메모리가 캐시되면 읽기 전용 액세스가 완전히 동시입니다.

+1

모든 메모리 액세스는 실제로 현대 프로세서의 경우 캐시 라인 크기가 64 바이트입니다. 캐시 라인에 대한 액세스는 원자 적입니다. 라인은 코어별로 공유하여 읽을 수 있습니다. – osgx

8

실제로 1MB 블록에 쓰기가없는 경우 각 코어는 쓰기가 커밋되지 않으므로 아무런 문제없이 자체 캐시 라인에서 읽을 수 있으므로 캐시 일관성 문제가 발생하지 않습니다.

멀티 코어 아키텍처에는 기본적으로 각 코어에 대한 캐시와 최신 정보가없는 일부 코어의 캐시를 무효화하는 "캐시 일관성 프로토콜"이 있습니다. 대부분의 프로세서는 캐시 일관성을 위해 MOESI protocol을 구현한다고 생각합니다.

캐시 일관성은 크게 논의 된 복잡한 주제입니다 (특히 조 더피 (Joe Duffy)의 herehere의 기사를 좋아합니다). 그럼에도 불구하고 토론은 프로세서 캐시 전체에서 일관성을 유지하기 위해 캐시 일관성 프로토콜이 시작됨에 따라 잠금이 해제되는 동안 속도가 느려질 수있는 코드의 성능 저하를 회피합니다. 그러나 쓰기가없는 한 단순히 유지 일관성 및 따라서 성능 손실.

x86 및 x64 아키텍처가 코어간에 공유되는 SMP 공유 공유 버스를 구현하기 때문에 주 메모리에 대한 공정성을 보장하므로 RAM에 동시에 액세스 할 수 없습니다. 그럼에도 불구하고 이러한 상황은 각 코어 캐시에 의해 숨겨져 각 코어가 자체 데이터 복사본을 가질 수 있습니다. 1MB의 데이터의 경우 코어가 캐시를 업데이트하는 동안 약간의 경쟁이 발생할 수 있지만 무시할 수 있습니다.

몇 가지 유용한 링크 :

+0

일반적으로 오늘 정답입니다. RAM 자체는 여러 개의 동시 액세스를 유지할 수 없지만 캐시에 의해 효과적으로 숨겨집니다. 그러나 여러 코어가 비 캐시 읽기를 수행하는 경우 이러한 요청을 여전히 중재해야합니다. – MSalters