Visual C++ 설명서에서 여러 스레드가 동일한 개체에서 읽는 것이 안전하다는 내용을 읽었습니다.다중 스레드 및 메모리
내 질문은 : 어떻게 여러 코어가있는 X86-64 CPU가 이것을 처리합니까?
1MB 메모리가 있다고 가정 해보십시오. 다른 스레드가 말 그대로 똑같은 데이터를 동시에 읽을 수 있습니까? 아니면 코어가 한 번에 한 단어 씩 읽을 수 있습니까?
Visual C++ 설명서에서 여러 스레드가 동일한 개체에서 읽는 것이 안전하다는 내용을 읽었습니다.다중 스레드 및 메모리
내 질문은 : 어떻게 여러 코어가있는 X86-64 CPU가 이것을 처리합니까?
1MB 메모리가 있다고 가정 해보십시오. 다른 스레드가 말 그대로 똑같은 데이터를 동시에 읽을 수 있습니까? 아니면 코어가 한 번에 한 단어 씩 읽을 수 있습니까?
뿐만 아니라 다른 코어가 같은 메모리 블록에서 읽을 수 있습니다, 그들은 같은 시간에 쓸 수있어 너무. 그것이 "안전하다"면, 그것은 완전히 다른 이야기입니다. 자신이 특별히 허용하지 않는 방식으로 동일한 메모리 블록을 통해 싸우는 여러 코어를 보호하려면 코드에 일종의 가드를 구현해야합니다 (일반적으로 세마포 또는 그 파생어로 수행).
코어는 한 번에 읽습니다. 보통 레지스터는 32 비트 CPU에서 32 비트, 64 비트 CPU에서는 64 비트 등입니다. 스트리밍조차도 dword (예 : memcpy)에서 dword로 완료됩니다.
동시 다중 코어가 실제로 어떤지에 대해 모든 코어는 단일 버스를 사용하여 메모리를 읽고 쓰기 때문에 모든 리소스 (RAM, 외부 장치, 부동 소수점 처리 장치)에 액세스하는 것은 한 번에 하나의 요청입니다 한 번에 핵심. 그러나 코어 내부의 실제 프로세싱은 완전히 동시 적입니다. DMA 전송도 버스를 차단하지는 않습니다. 동시 전송은 한 번에 하나씩 대기열에 넣어 처리됩니다 (100 % 확신하지는 않습니다).
편집 : 여기에있는 다른 답글과는 달리 명확히하기 위해 노 캐시 시나리오 만 이야기합니다. 물론 메모리가 캐시되면 읽기 전용 액세스가 완전히 동시입니다.
실제로 1MB 블록에 쓰기가없는 경우 각 코어는 쓰기가 커밋되지 않으므로 아무런 문제없이 자체 캐시 라인에서 읽을 수 있으므로 캐시 일관성 문제가 발생하지 않습니다.
멀티 코어 아키텍처에는 기본적으로 각 코어에 대한 캐시와 최신 정보가없는 일부 코어의 캐시를 무효화하는 "캐시 일관성 프로토콜"이 있습니다. 대부분의 프로세서는 캐시 일관성을 위해 MOESI protocol을 구현한다고 생각합니다.
캐시 일관성은 크게 논의 된 복잡한 주제입니다 (특히 조 더피 (Joe Duffy)의 here 및 here의 기사를 좋아합니다). 그럼에도 불구하고 토론은 프로세서 캐시 전체에서 일관성을 유지하기 위해 캐시 일관성 프로토콜이 시작됨에 따라 잠금이 해제되는 동안 속도가 느려질 수있는 코드의 성능 저하를 회피합니다. 그러나 쓰기가없는 한 단순히 유지 일관성 및 따라서 성능 손실.
x86 및 x64 아키텍처가 코어간에 공유되는 SMP 공유 공유 버스를 구현하기 때문에 주 메모리에 대한 공정성을 보장하므로 RAM에 동시에 액세스 할 수 없습니다. 그럼에도 불구하고 이러한 상황은 각 코어 캐시에 의해 숨겨져 각 코어가 자체 데이터 복사본을 가질 수 있습니다. 1MB의 데이터의 경우 코어가 캐시를 업데이트하는 동안 약간의 경쟁이 발생할 수 있지만 무시할 수 있습니다.
몇 가지 유용한 링크 :
일반적으로 오늘 정답입니다. RAM 자체는 여러 개의 동시 액세스를 유지할 수 없지만 캐시에 의해 효과적으로 숨겨집니다. 그러나 여러 코어가 비 캐시 읽기를 수행하는 경우 이러한 요청을 여전히 중재해야합니다. – MSalters
모든 메모리 액세스는 실제로 현대 프로세서의 경우 캐시 라인 크기가 64 바이트입니다. 캐시 라인에 대한 액세스는 원자 적입니다. 라인은 코어별로 공유하여 읽을 수 있습니다. – osgx