멀티 CPU가 첫 번째 버전이었습니다. 하나 이상의 CPU 칩이있는 메인 보드가 하나 이상있을 것입니다. 여기서 가장 큰 문제는 CPU가 내부 데이터의 일부를 다른 CPU에 노출하여 방해가되지 않도록해야한다는 것입니다.
다음 단계는 하이퍼 스레딩이었습니다. 메인 보드에 하나의 칩이 있지만 내부적으로 일부 부품이 두 번 들어있어 동시에 두 개의 명령을 실행할 수 있습니다.
현재 개발은 멀티 코어입니다. 기본적으로 원래 아이디어 (여러 개의 완전한 CPU)이지만 단일 칩에 있습니다. 장점 : 칩 설계자는 동기화 신호를위한 추가 와이어를 칩에 쉽게 넣을 수 있습니다 (핀으로 라우팅 한 다음 혼잡 한 메인 보드를 거쳐 두 번째 칩으로 연결하는 대신).
오늘날 슈퍼 컴퓨터는 다중 CPU, 다중 코어입니다. 일반적으로 2-4 개의 CPU가있는 메인 보드가 많이 있고 각 CPU는 다중 코어이며 각각 자체 RAM이 있습니다.
[편집] 당신은 거의 맞았습니다. 몇 가지 사소한 사항 :
하이퍼 스레딩은 단일 코어에서 한 번에 두 개의 컨텍스트를 추적하여 비 순차적 CPU 코어에 더 많은 병렬성을 노출합니다. 이렇게하면 한 스레드가 캐시 미스, 분기 오 예측 또는 대기 시간이 긴 명령의 결과를 기다리는 경우에도 실행 단위에 작업이 계속 제공됩니다. 많은 하드웨어를 복제하지 않고도 더 많은 총 처리량을 얻을 수있는 방법이지만, 어떤 경우에는 각 스레드를 개별적으로 느리게합니다. 자세한 내용과이 단락의 이전 문구에서 무엇이 잘못되었는지에 대한 설명은 이 Q & A를 참조하십시오 .
다중 CPU의 주요 문제는 실행중인 코드가 결국 RAM에 액세스한다는 것입니다. N 개의 CPU가 있지만 RAM에 액세스하는 버스는 하나뿐입니다. 따라서 a) 각 CPU에 상당한 양의 RAM 액세스 권한이 있는지, b) RAM의 동일한 부분에 대한 액세스가 문제를 일으키지 않는지, c) 가장 중요한 것은 CPU 2에 알림이 전송되도록하는 하드웨어가 있어야합니다. CPU 1이 CPU 2가 내부 캐시에있는 일부 메모리 주소에 쓸 때. 그렇지 않은 경우 CPU 2는 캐시 된 값을 기꺼이 사용하고 오래된 값이라는 사실을 알지 못합니다.
목록에 작업이 있고이를 사용 가능한 모든 CPU에 분산시키고 싶다고 상상해보십시오. 따라서 CPU 1은 목록에서 첫 번째 요소를 가져와 포인터를 업데이트합니다. CPU 2도 마찬가지입니다. 효율성을 위해 두 CPU는 몇 바이트를 캐시에 복사 할뿐만 아니라 전체 "캐시 라인"(어쨌든)을 복사합니다. X 바이트를 읽을 때 곧 X + 1도 읽을 수 있다는 가정이 있습니다.
이제 두 CPU 모두 캐시에 메모리 사본이 있습니다. 그러면 CPU 1은 목록에서 다음 항목을 가져옵니다. 캐시 동기화가 없으면 CPU 2가 목록을 변경했음을 알 수 없으며 CPU 2와 동일한 항목에서 작동하기 시작합니다.
이것이 멀티 CPU를 효과적으로 복잡하게 만드는 이유입니다. 이것의 부작용은 전체 코드가 단일 CPU에서만 실행될 경우 얻을 수있는 것보다 더 나쁜 성능으로 이어질 수 있습니다. 솔루션은 멀티 코어였습니다. 캐시를 동기화하는 데 필요한만큼 와이어를 쉽게 추가 할 수 있습니다. 한 캐시에서 다른 캐시로 데이터를 복사 할 수도 있습니다 ( 캐시 라인의 일부 를 플러시하고 다시로드 할 필요없이 업데이트 ). 또는 캐시 로직은 모든 CPU가 동일한 캐시 라인에 액세스 할 때 동일한 캐시 라인을 얻도록 할 수 있습니다. 실제 RAM, CPU 1이 변경 될 때까지 몇 나노초 동안 CPU 2를 차단합니다.
멀티 코어가 멀티 CPU보다 간단한 주된 이유는 메인 보드에서 동기화를 효과적으로 만드는 데 필요한 두 칩 사이의 모든 와이어를 실행할 수 없기 때문입니다. 또한 신호는 30cm / ns 상단까지만 이동합니다 (광속, 와이어에서는 일반적으로 훨씬 적음). 다층 메인 보드에서 신호가 서로 영향을 미치기 시작한다는 사실을 잊지 마십시오 (누화). 0은 0V이고 1은 5V라고 생각하지만 실제로는 "0"은 -0.5V (1-> 0에서 라인을 떨어 뜨릴 때 오버 드라이브)와 .5V 및 "1"은 0.8V 이상입니다.
단일 칩 안에 모든 것이 있으면 신호가 훨씬 빠르게 실행되고 원하는만큼 많이 가질 수 있습니다 (거의 :). 또한 신호 누화를 훨씬 쉽게 제어 할 수 있습니다.