답변

2

명령어가주기마다 한 번에 하나씩 페치되고 디코딩된다는 생각은 일반적으로 사실이 아닙니다.

방해가되지 않는 간단한 것들을 시작합시다. 여러 개의 코어가있을 수 있으며 각 코어는 독립적으로 실행됩니다. 이는 Intel 등이주기 당 명령어 수를 늘리는 주된 방식입니다 (IPC). 또한 동일한 코어에서 실행되는 두 개의 독립적 인 스레드가있는 동시 멀티 스레딩 (인텔에서 말하는 하이퍼 스레딩)이 있습니다. 이것은 지난 10 년 동안 IPC를 늘리는 공통적 인 또 다른 방법입니다 (Sun의 Niagara 칩에는 많은 스레드가있었습니다).

이제는 정말로 원하는 답을 얻으실 수 있습니다. 단일 실행 스레드 내에서 대부분의 최신 프로세서는주기 당 여러 명령어를 가져오고 디코딩 할 수 있습니다 (보통 수퍼 스칼라라고 함). 거의 모든 최신 고성능 프로세서가이를 수행합니다. 예외는 매우 낮은 전력 프로세서와 처리량을 위해 단일 스레드 성능을 명시 적으로 희생하는 예외입니다 (많은 스레드를 사용하는 Niagara).

이제는 아키텍처가 변경되었습니다 (많은 옵션이 있습니다). 가장 큰 실패는 고정 길이 명령어 (ARM) 또는 가변 길이 명령어 (x86) 중 하나입니다.

고정 길이 명령어를 사용하면 명령어 경계가 무엇인지 알 수 있으므로 클럭 당 8 명령어를 가져와 모든 명령어를 디코딩 할 수있는 시스템을 만드는 것이 상대적으로 쉽습니다. 보통 브랜치 명령어를 가지므로 브랜치 가져 오기 너비가 실행 너비보다 커서 브랜치가 정렬 될 가능성이 높으므로 브랜치는 사용자를 아무 데나 착륙시킬 수 있습니다. 이러한 시스템에서 가장 큰 과제는 실제로 분기 예측자를 얻는 것입니다 (실제로는 다음 예측 지시자 블록입니다).

가변 길이 지침을 사용하면 고통의 세계에 불과합니다. x86 세계에서는 요즘 가변 길이의 "매크로"명령어를 (주로) 고정 폭의 "마이크로"명령어로 변환합니다. 그런 다음 이러한 마이크로 명령어를 특수 캐시 (흔히 추적 캐시라고 함)에 저장할 수 있습니다. 특정 주소의 경우 추적 캐시에서 히트를 얻으면 매크로 명령을 디코드 할 필요가 없으며 간단히 마이크로 명령을 처리 할 수 ​​있습니다. 트레이스 캐시는 훨씬 더 많은 작업을 수행 할 수 있으며, 고정 폭 머신에서도 사용할 수 있습니다. 재 배열 블록과 같은 트릭을하거나 심지어 분기를 포함하는 순차적 인 명령어 시퀀스를 조합 할 수 있기 때문에 "트레이스"라는 이름을 사용합니다. 이 추적 캐시 방식을 사용하는 경우에도 높은 성능을 얻으려면 사이클 당 두 개 이상의 매크로 명령어를 가져와야합니다. 보통 시스템은 몇 가지 작업을 수행 할 수 있으며 본질적으로 예측 경계를 사용하여 지침 경계가 무엇인지 나타냅니다.

대부분의 복잡한 작업은 아웃 - 오브 - 오더 (out-of-order) 프로세서에서만 발견됩니다. 왜냐하면 일반적으로 위험성 및 종속성이 존재하기 때문에 인 - 오더 시스템에서 병렬로 두 개 이상의 명령을 수행하려고 시도하지 않는 것이 일반적입니다 좀 더 실용적인 것을 만들기 위해 너무 자주 일어난다.