좋은 질문이거나 흥미로운 답변이있는 질문 중 하나입니다. 이 답변의 일부는 여러 개의 개별 코어 대신 CPU 가 효율적으로 너비를 조정할 수 있는 세계를 이미지화합니다 . 라이센싱 / 가격 모델은 다를 수 있습니다!
나머지는 왜 그들이 할 수 없는지 설명합니다. 개요:
- 여러 코어의 비용은 선형에 가깝게 확장
- 1 코어의 슈퍼 스칼라 파이프 라인을 확장하는 비용은 점진적으로 확장됩니다. 이것은 어쨌든 한 지점까지 충분한 무차별 대입으로 가능합니다. 단일 스레드 성능은 대화식 사용 (처리량뿐만 아니라 엔드 투 엔드 대기 시간 문제 )에 매우 중요하므로 현재의 빅 코어 고급 CPU는 그 가격을 지불합니다. 예 : Skylake (4 와이드), Ryzen (5와 6 와이드) 및 Apple A12 (큰 코어의 경우 7 와이드, 작은 에너지 효율적인 코어의 경우 3 와이드)
- ILP 를 찾기 위해 비 순차적 실행으로도 3 배 또는 4 배 이상의 파이프 라인 을 확대함으로써 IPC 수익이 심각하게 감소 합니다 . 브랜치 미스 및 캐시 미스는 어렵지만 여전히 전체 파이프 라인을 정지시킵니다.
주파수는 언급하지 않고 IPC 만 언급했지만 스케일링 빈도도 어렵습니다. 그래서 더 높은 주파수는 더 높은 전압을 필요로 주파수와 전력 규모는 삼승 : ^1
직접 주파수에서, 그리고 ^2
전압에서. 커패시터는 V ^ 2로 에너지 스케일을 저장하며, 누설 전류를 넘어서는 대부분의 동적 전력은 펌핑 전하에서 FET 게이트 + 와이어의 용량 성 부하로 공급됩니다.
성능 = 주파수 배 IPC. (같은 아키텍처 내에서) SIMD가 넓을수록 적은 수의 명령으로 동일한 작업을 수행 할 수 있으며 일부 ISA는 다른 것보다 밀도가 높습니다. 예를 들어 MIPS는 종종 x86 또는 AArch64보다 동일한 작업을 수행하는 데 더 많은 명령을 사용합니다.
비용은 다이 영역 (제조 비용) 및 / 또는 전력 (냉각이 어렵 기 때문에 주파수를 간접적으로 제한 함)에 있습니다. 또한 특히 모바일 (배터리) 및 서버 (전력 밀도 / 냉각 비용 / 전기 비용)의 경우 와트 당 더 낮은 전력 및 성능이 목표입니다.
소켓 당 멀티 코어가 문제가되기 전에, 제조 할 수있는 단일 CPU로 달성 할 수있는 것보다 더 많은 처리량을 원하는 고급 사용 사례를위한 멀티 소켓 시스템이 있었기 때문에 유일한 SMP 시스템이었습니다. (서버, 고급 워크 스테이션).
단일 코어를 원하는만큼 효율적으로 확장 할 수 있다면 소켓 당 물리적 코어가 1 개이고 SMT (예 : 하이퍼 스레딩)가 있는 시스템이 여러 개의 논리 코어로 작동하게됩니다. 일반적인 데스크탑 / 노트북에는 물리적 코어가 1 개 밖에 없으며, 더 많은 코어와 선형으로 확장되지 않는 것을 병렬화하는 데 어려움을 겪지 않습니다. 예 make -j4
를 들어 멀티 소켓 서버를 활용하거나 데스크탑에서 I / O 대기 시간을 숨길 수 있습니다. (또는 파이프 라인 너비를 쉽게 확장 할 수 있지만 IPC가 그렇지 않은 경우 여전히 많은 병렬화를 시도 할 수 있으므로 더 많은 SMT 스레드를 사용해야했습니다.) CPU가 작동하지 않는 한 OS 커널은 여전히 모든 논리 코어에서 실행되어야합니다. OS에 대한 SMT가 매우 다르다는 것을 보여 주므로 병렬 스케줄링 알고리즘과 잠금이 여전히 필요합니다.
도널드 크 누스는 2008 년 인터뷰에서
나는 멀티 코어 아키텍처에 대한 현재의 추세로 인해 개인적 불행에 대해 약간 불길 수도 있습니다. 나에게, 그것은 더 많거나 적은처럼 보이는 하드웨어 디자이너가 아이디어가 부족했다, 그들은 소프트웨어 작가에 대한 무어의 법칙의 미래의 죽음에 대한 책임을 전달하는 데 노력하고 있다는 것을 몇 가지에 대한 작업 빠른 단지 우리에게 기계를 제공함으로써 주요 벤치 마크!
그렇습니다 . 실제 프로그램 에서 처리량이 8 배인 기적의 단일 코어 CPU를 보유 할 수 있다면 여전히 사용하고있을 것입니다. 더 많은 처리량 (단일 스레드 성능이 아님)에 더 많은 비용을 지불 할 가치가있는 경우에만 이중 소켓 시스템을 사용합니다.
다중 CPU는 다중 프로그램이 실행 중일 때 컨텍스트 전환 비용을 줄입니다 (프로그램간에 빠르게 전환하는 대신 실제로 병렬로 실행). 선점 형 멀티 태스킹은 이러한 CPU가 필요로하는 대량의 비 순차적 기계를 중단 시키면 아마도 지금보다 더 많은 상처를 입을 것입니다.
물리적으로는 단일 코어 (코어간에 상호 연결이없는 간단한 캐시 계층 구조의 경우)이지만 SMT (예 : 인텔의 하이퍼 스레딩)를 지원하므로 소프트웨어는 처리량 리소스를 위해 동적으로 경쟁하는 8 개의 논리 코어로 사용할 수 있습니다. 또는 하나의 스레드 만 실행 중이거나 중단되지 않은 경우 전체 이점을 얻을 수 있습니다.
따라서 실제로 더 쉽고 자연 스러울 때 (예 : 개별 프로세스가 한 번에 실행) 여러 개의 스레드를 사용하거나이 짐승의 IPC를 최대화하지 못하게하는 종속성 체인과 쉽게 병렬화 된 문제를 사용합니다.
그러나 불행히도 멀티 코어 CPU가이 시점에서 더 이상 멈추지 않을 것이라는 Knuth의 생각은 희망적입니다.
단일 스레드 성능 확장
만약 그들이 1 코어를 8 코어 CPU와 동등하게 만들었다면, 하나의 코어는 IPC가 800 % 증가 할 것이므로 여러 코어에 최적화 된 것만이 아니라 모든 프로그램에서 완전한 성능을 얻을 수있을 것입니다.
그렇습니다. 그러한 CPU 를 전혀 만들 수 없다면 매우 놀랍습니다. 그러나 동일한 반도체 제조 공정 (즉, 트랜지스터의 동일한 품질 / 효율)에서는 문자 그대로 불가능하다고 생각합니다 . 코어를 서로 붙이기 위해 로직을 절약하고 코어 당 개인 캐시를위한 공간이 많이 필요하지 않더라도 8 코어 CPU와 동일한 전력 예산 및 다이 영역에서는 확실히 불가능합니다.
실제 기준이 초당 작업이 아니라 클럭 당 작동하지 않기 때문에 주파수 증가를 허용하더라도 2 배 더 빠른 CPU를 만드는 것은 큰 도전이 될 수 있습니다.
그것이 어디에서 할 수 있다면 근처 같은 CPU를 구축하기 위해 동일한 전력과 다이 지역 예산 (따라서 제조 비용), 예 CPU 업체들은 이미 그런 식으로 구축 될 것이다.
특히 더 많은 코어 또는 넓은 코어? 이 답변을 이해하는 데 필요한 배경에 대한 섹션; 순서대로 파이프 라인 된 CPU가 작동하는 방식부터 간단하게 시작한 다음 슈퍼 스칼라 (클럭 당 여러 명령)로 시작합니다. 그런 다음 P4 시대에 전력 벽에 도달하는 방법을 설명하여 쉬운 주파수 스케일링을 끝내고 IPC를 거의 남기지 않고 더 작은 트랜지스터를 사용하더라도 명령 당 경로 (예 : SIMD) 당 더 많은 작업을 수행합니다.
파이프 라인을 더 넓게 만들면 (클럭 당 최대 명령 수) 일반적으로 비용이 width-squared로 조정됩니다 . 이 비용은 다이 영역 및 / 또는 전력에서 측정되며, 더 넓은 병렬 종속성 검사 (위험 감지)와 더 넓은 순서의 스케줄러가 실행 준비 지침을 찾습니다. 그리고 다른 명령어를 실행하려면 레지스터 파일 및 캐시에 더 많은 읽기 / 쓰기 포트가 있어야합니다 nop
. 특히 FMA 또는 add-with-carry (2 개의 레지스터 + 플래그)와 같은 3 개의 입력 명령어가있는 경우.
CPU를 더 넓게 만들기위한 IPC 수익도 감소하고 있습니다 . 대부분의 워크로드는 CPU가 악용 할 수 있도록 소규모 / 단거리 ILP (Instruction-Level Parallelism) 가 제한되어 있으므로 IPC가 이미 너비보다 작게 제한되어 있으면 코어를 더 넓게 만들면 IPC (클럭 당 명령)가 증가 하지 않습니다 . 종속성 체인, 분기 누락, 캐시 누락 또는 기타 중단으로 코어. 물론 독립적 인 반복을 가진 일부 언롤 루프에서 속도가 향상되지만 대부분의 코드가 대부분의 시간을 소비하는 것은 아닙니다. 비교 / 분기 명령어는 "일반적인"코드 IIRC에서 명령어 믹스의 20 %를 구성합니다. (다양한 데이터 세트에 대해 15-25 %의 숫자를 읽은 것 같습니다.)
또한 모든 종속 명령을 지연시키는 캐시 미스 (및 ROB 용량에 도달 한 모든 것)는 더 넓은 CPU에 더 많은 비용이 듭니다. (더 많은 실행 장치를 유휴 상태로 두는 기회 비용; 더 많은 잠재적 인 작업이 완료되지 않습니다.) 또는 분기 누락으로 인해 거품이 발생합니다.
IPC를 8 배로 늘리려면 분기 예측 정확도와 캐시 적중률이 8 배 이상 향상되어야합니다 . 그러나 캐시 적중률은 대부분의 워크로드에서 특정 시점을 지나면 캐시 용량에 따라 확장 성이 떨어집니다. 그리고 HW 프리 페치는 똑똑하지만 그렇게 똑똑 할 수는 없습니다 . 그리고 IPC의 8 배에서 분기 예측 변수는주기 당 8 배 많은 예측을 생성 할뿐만 아니라보다 정확한 예측을 수행해야합니다.
비 순차적 실행 CPU를 구축하는 현재 기술은 단거리에서만 ILP를 찾을 수 있습니다 . 예를 들어 Skylake의 ROB 크기는 224 개의 융합 도메인 uops이고, 실행되지 않은 uops의 스케줄러는 97 개의 융합되지 않은 도메인입니다. 참조 길이를 증가시키기 위해, 두 개의 긴 의존성 체인 루프에 lfence의 영향을 이해 그들이 얻을 경우 스케줄러 크기, 지침의 2 개 긴 사슬에서 ILP를 추출의 제한 요인 인 경우에 너무 오래. 더 일반적이고 입문적인 답변을 참조하십시오 .
따라서 두 개의 긴 루프 사이에서 ILP를 찾는 것은 하드웨어로 할 수있는 일이 아닙니다. 루프 퓨전을위한 동적 바이너리 재 컴파일은 경우에 따라 가능할 수 있지만 Transmeta Crusoe 경로를 거치지 않으면 CPU가 실제로 할 수있는 것은 아니며 어렵습니다. (다른 내부 ISA 위에 x86 에뮬레이션 계층,이 경우 VLIW). 그러나 uop 캐시 와 강력한 디코더를 갖춘 표준 최신 x86 디자인 은 대부분의 코드에서 이길 수 없습니다.
x86 외부에서도 여전히 사용중인 모든 ISA는 비교적 쉽게 해독 할 수 있으므로 장거리 최적화 외에 동적 재 컴파일에 대한 동기가 없습니다. TL : DR : 하드웨어에 더 많은 ILP를 노출시킬 수있는 매직 컴파일러가 Itanium IA-64 에서는 효과가 없었으며, 일련의 실행 모델을 사용하는 기존 ISA의 슈퍼 와이드 CPU에서는 작동하지 않을 것으로 기대합니다.
슈퍼 와이드 CPU를 보유한 경우 SMT를 지원하기를 원하므로 여러 개의 저 ILP 스레드를 실행하여 수행해야 할 작업을 계속 유지할 수 있습니다.
Skylake의 너비는 현재 4 uops이므로 (클럭 당 2-3 uops의 실제 IPC를 달성하거나, 처리량이 많은 코드에서는 4에 더 가깝습니다) 가상 8 배 더 넓은 CPU의 너비는 32입니다!
8 또는 16 개의 논리적 CPU에 그 뒤로 개척 할 수 있다는 동적으로 환상적 일 것입니다 그 실행 리소스를 공유 : 비 중단 된 스레드는 모든 프런트 엔드 대역폭과 백엔드 처리량을 얻을.
그러나 8 개의 분리 된 코어로 스레드가 멈 추면 실행 장치를 계속 공급할 수있는 것은 없습니다. 다른 스레드는 도움이되지 않습니다.
실행은 종종 파열됩니다. 캐시 미스로드를 기다리는 동안 정지 한 다음 많은 명령이 병렬로 도착하면 해당 결과를 사용할 수 있습니다. 슈퍼 와이드 CPU를 사용하면 버스트 속도가 빨라지고 실제로 SMT에 도움이 될 수 있습니다.
그러나 우리는 마법의 슈퍼 와이드 CPU를 가질 수 없습니다
따라서 처리량을 얻으려면 대신 스레드 수준 병렬 처리 형식으로 하드웨어에 병렬 처리를 노출해야합니다 . 일반적으로 컴파일러는 매우 큰 루프와 같은 간단한 경우를 제외하고 스레드를 언제 / 어떻게 사용해야하는지 잘 모릅니다. (OpenMP 또는 gcc 's -ftree-parallelize-loops
). 스레드 간 통신이 비싸고 스레드 시작과 마찬가지로 유용한 병렬 작업을 효율적으로 수행하려면 코드를 재 작업하는 데 여전히 인간의 영리함이 필요합니다.
TLP는 HW가 이용할 수있는 단일 실행 스레드 내에서 세분화 된 ILP와 달리 대략적인 병렬 처리입니다.
대화 형 워크로드 (Intel / AMD x86 및 Apple / ARM AArch64 하이 엔드 코어와 같은)를 대상으로하는 CPU 는 처리량뿐만 아니라 대기 시간 이 중요한 경우 에도 단일 스레드 성능이 여전히 중요하기 때문에 IPC 스케일링의 수익 감소로 확실히 밀려 납니다. 대규모 병렬 문제.
각각 15fps로 8 개의 게임 사본을 병렬로 실행할 수 있다는 것은 45fps에서 1 개의 사본을 실행할 수있는 것보다 훨씬 가치가 없습니다. CPU 공급 업체는이를 알고 있으므로 최신 CPU는 상당한 전력과 다이 영역 비용이 들더라도 비 순차적 실행을 사용합니다. (하지만 GPU는 작업량이 이미 병렬이기 때문에 아닙니다.)
Intel의 많은 코어 Xeon Phi 하드웨어 (Knight 's Landing / Knight 's Mill)는 흥미로운 중간 단계입니다. 2X 코어에 AVX512 SIMD 명령이 제공되어 2 배의 코어에 숫자를 제공합니다. 코어는 인텔의 저전력 Silvermont 아키텍처를 기반으로합니다. (비순 서적이지만 큰 재주문 창이 있으며 빅 코어 Sandybridge보다 훨씬 작으며 파이프 라인이 더 좁습니다.)
BTW,이 모든 것이 SIMD와 직교합니다. 문제가있을 수있는 경우 명령 당 더 많은 작업을 수행 하면 항상 도움이됩니다.
가격 모델
소프트웨어 가격 모델은 현재 하드웨어 환경에 따라 결정됩니다.
멀티 코어 CPU의 출현으로 코어 당 라이센싱 모델이 더욱 널리 보급되었습니다 (단일 소켓 데스크톱에도 적용됨). 그 전에는 서버 및 대형 워크 스테이션에만 관련이있었습니다.
소프트웨어가 최고 속도로 실행하기 위해 여러 개의 코어가 필요하지 않은 경우, 약한 CPU에서 소프트웨어를 실행하기 때문에 많은 이점을 얻지 못하는 사람들에게 더 저렴하게 판매 할 수있는 방법이 없을 것입니다. 소프트웨어 / 하드웨어 에코 시스템이 "SMT 채널"에 대한 제어를 발전시키지 않으면 해당 논리 코어에서 실행되는 코드의 최대 실행 폭을 구성 할 수 있습니다. (여러 개의 개별 코어 대신 CPU가 파이프 라인 너비로 확장되는 세계를 상상해보십시오.)