tl; dr
파이프 라인이 짧을수록 클럭 속도는 빨라지지만 처리량은 줄어들 수 있습니다. 또한 하단의 답변 # 2와 3을 참조하십시오 (짧습니다, 약속합니다).
더 긴 버전 :
고려해야 할 몇 가지 사항이 있습니다.
- 모든 지시 사항이 동시에 수행되는 것은 아닙니다
- 모든 지시 사항이 즉시 (또는 10 또는 20 개의) 지시 사항에 의존하는 것은 아닙니다.
매우 단순화 된 파이프 라인 (현대 인텔 칩에서 발생하는 작업은 복잡하지 않음)에는 여러 단계가 있습니다.
가져 오기-> 디코딩-> 메모리 액세스-> 실행-> 쓰기 저장-> 프로그램 카운터 업데이트
각각-> 발생하는 시간 비용이 있습니다. 또한 모든 틱 (시계주기)마다 모든 단계가 한 단계에서 다음 단계로 이동하므로 가장 느린 단계는 모든 단계의 속도가됩니다 (최대한 비슷한 길이가되도록 지불합니다).
5 개의 명령이 있고 명령을 실행하려고한다고 가정합니다 (위키 백과에서 가져온 그림, PC 업데이트는 수행되지 않음). 다음과 같이 보일 것입니다 :
각 명령이 완료되는 데 5 클럭 사이클이 걸리더라도 매 사이클마다 완료된 명령이 파이프 라인에서 나옵니다. 각 단계에 걸리는 시간이 40ns이고 중간 비트의 경우 15ns (위의 6 단계 파이프 라인 사용)이면 첫 번째 명령을 얻는 데 40 * 6 + 5 * 15 = 315ns가 걸립니다.
반대로 파이프 라인을 완전히 제거해야하지만 다른 모든 것을 동일하게 유지하면 첫 번째 명령을 내리는 데 불과 240ns가 걸립니다. ( "첫 번째"명령어를 출력하는 속도의 차이를 대기 시간이라고합니다. 일반적으로 초당 명령어 수인 처리량보다 덜 중요합니다.)
그러나 실제로 다른 점은 파이프 라인 예제에서 60ns마다 (첫 번째 명령 이후) 새로운 명령을 받는다는 것입니다. 파이프 라인이없는 경우 매번 240이 걸립니다. 이는 파이프 라인이 처리량을 향상시키는 데 효과적임을 보여줍니다.
한 걸음 더 나아가면 메모리 액세스 단계에서 계산을 수행하기 위해 추가 장치가 필요할 것 같습니다. 즉, 해당 사이클에서 mem 스테이지를 사용하지 않는 명령이 있으면 다른 추가 작업을 수행 할 수 있습니다. 따라서 하나의 틱으로 하나의 프로세서에서 두 개의 실행 단계 (하나는 메모리 액세스 단계에 있음)를 수행 할 수 있습니다 (스케줄링은 악몽이지만 거기에 가지 않겠습니다. 점프의 경우 한 번에 세 가지 추가 실행 상태를 수행 할 수 있습니다). 파이프 라인을 가짐으로써 두 개 이상의 명령어가 다른 단계 (또는 도약 단계 등)를 사용하여 귀중한 시간을 절약 할 수 있도록 설계 할 수 있습니다.
이 작업을 수행하기 위해 프로세서는 많은 "마법"(비 순서 실행 , 분기 예측 등)을 수행하지만 파이프 라인이없는 것보다 여러 명령이 더 빨리 나올 수 있습니다. 오랫동안 관리하기가 어렵고 단계 간 대기만으로 더 높은 비용이 발생합니다). 반대로 파이프 라인을 너무 길게 만들면 미친 시계 속도를 얻을 수는 있지만 원래 여러 가지 이점을 잃을 수 있습니다 (여러 장소에 존재할 수있는 동일한 유형의 논리를 가지고 동시에 사용할 수 있음) ).
답변 # 2 :
SIMD (단일 명령 다중 데이터) 프로세서 (대부분의 GPU와 같은)는 많은 비트의 정보에 대해 많은 작업을 수행하지만 시간이 더 오래 걸립니다. 모든 값을 읽는 데 시간이 더 걸리지 만 (버스가 어느 정도 넓어짐으로써 오프셋이 느려지지만 클럭이 느려짐) 한 번에 더 많은 명령을 수행 할 수 있습니다 (사이클 당 더 효과적인 명령).
답변 # 3 :
인위적으로 싸이클 카운트를 "치트"할 수 있으므로 사이클마다 두 개의 명령을 수행 할 수 있습니다 (클럭 속도의 절반). 하나가 아닌 두 개의 틱마다 무언가를 수행하는 것도 가능합니다 (2x 클럭 속도를 제공하지만 1 초에 지침은 변경하지 않음).