분기 명령어의 처리방법
명령어 파이프라인에서 분기 명령어의 처리방법에 대해서 알아보겠습니다. 이 처리방법에는 여러가지 하드웨어 기법이 있고, 분기 목표 버퍼 방법이 있습니다. 오늘은 이에 대해서 자세히 설명해드리겠습니다.
분기 명령어의 처리
명령어 파이프라인에서 중요한 문제 중의 하나는 분기 명령어를 만났을 때이입니다. 왜냐하면 조건 분기에서 조건이 만족되거나 무조건 분기인 경우에 프로그램 카운터에 분기 주소를 지정함으로써 프로그램의 정상적인 순서를 바꾸어 버 리기 때문입니다.
따라서 파이프라인을 채용한 컴퓨터에서 여러가지 하드웨어 기법을 이용하여 명령어의 분기로 인한 성능의 저하를 최소화하고 있습니다. 조건 분기를 처리하는 한 가지 방법은 순차적으로 다음에 있는 명령어와 함께 분기의 목표가 되는 명령어를 미리 가져와 분기가 수행될 때까지 저장하는 것입니다. 따라서 분기가 결정된 다음에는 어떠한 프로그램 흐름이 선택될지라도 중단없이 파이프라인이 동작할 수 있습니다.
분기 목표 버퍼
다른 방법으로 분기 목표 버퍼 (branch target buffer, BTB) 를 사용할 수 있습니다. BTB는 fetch 세그멘트에 속해 있는 어소시어티브 (associative) 메모리로서 각 메모리 항목은 이전에 실행된 분기 명령어와 그것의 분기 목표 명령어를 저장하고 있습니다.
파이프라인에서 분기 명령어가 디코드되면 어소시어티브 메모리 BTB에서 그 명령어를 찾아보고, 존재한다면 새로운 경로로부터 명령어를 미리 읽어와 진행을 계속합니다. 분기 명령어가 BTB에 저장됩니다. 이러한 방법에서는 이전에 실행된 분기 명령어에 대해서는 파이프라인의 중단없이 곧 바로 진행된다는 이점이 있습니다.
루프 버퍼
BTB의 변형으로 루프 버퍼 (loop buffer) 라는 것이 있는데, 이것은 파이프라 인의 fetch세그멘트에서 유지되는 작고 빠른 레지스터들을 가리킵니다. 프로그램에서 루프가 있는 경우에 분기를 포함한 모든 것을 루프 버퍼에 저장합니다. 따라서 마지막 분기에 의하여 루프가 끝날 때까지 메모리를 참조하지 않고 프로그램 루프를 실행할 수 있습니다.
컴퓨터 분기 예측
몇몇 컴퓨터에서는 분기 예측 (branch prediction) 이라는 방법을 사용하는데, 여기서는 조건 분기 명령어가 실행되기 전에 조건의 결과를 추측할 수 있는 별도의 논리가 필요합니다. 파이프라인은 예측된 경로를 따라 명령어를 미리 읽어 오는데, 예측이 맞았을 경우 분기에 의한 시간의 낭비를 없앨 수 있습니다.
대부분의 RISC 프로세서에서는 지연된 분기(delayed branchy를 사용합니다. 이 방법에서는 컴파일러가 분기 명령어를 찾아내고, 유효한 명령어를 삽입하여 기계어 코드의 순서를 재배치함으로써 파이프라인이 중단없이 동작하도록 합니다. 한 가지 예로 분기 명령어 다음에 무동작 (no-operation) 명령어를 삽입하는데, 이것은 무동작 명령어를 실행하는 동안 분기 목표 명령어를 fetch 하도록 함으로써 파이프라인의 흐름을 지속시켜줍니다.