[멀티코어CPU] 07. 분기문 & 가상함수
- 분기문(branch)
: 프로그램 실행 흐름, PC(Program Counter) 값이 바뀔 수 있는 명령어
: 분기문이 아닐 경우 다음 값을 가르키지만, 분기문일 경우 계산 결과로 좌우됨
1) 조건/무조건 분기문 → for, while, do ...
: 무조건 분기문 - goto, jump로 항상 해당 목적지로 분기
: 조건 분기문 - 특정 연산 결과가 어
떤 조건을 만족할 때
2) 직접/간접 분기문
: 직접 분기문 - 분기 목적지를 바로 얻을 수 있음
: 간접 분기문 - 분기 목적지가 메모리 어딘가에 존재해 메모리 참조가 필요함 → 콜백 함수 호출, 프로시저 리턴, 가상함수 호출, switch-case 점프 테이블 등
- 분기 예측
: 분기의 방향과 관련이 있음
: 컨트롤 해저드에 의한 파이프라인 스톨 최소화 → 분기문 결과가 나오지 않았는데 분기문의 결과를 미리 예측해 진행시킴
: 정적 - 정해진 규칙에 따라서만 움직임 (과거에 많이 사용)
: 동적 - 실제 프로그램의 실행 내역으로 미래에 일어날 분기를 예측
: 분기 예측이 실패할 경우를 대비해 적절한 장치를 두고 복구하도록 함 → 투기적 실행
: 미래를 예측하는 장치, 결과가 확실하지 않아도 실행을 계속 진행시킬 수 있는 장치 (ROB), 예측이 틀렸을 때 원상태로 복구하는 장치 (UNDO)
: 분기 예측기의 성능은 더 높은 IPC를 얻기 위한 기본 조건임
- 가상함수
: 분기의 목적지 예측과 관련이 있음
: 직접 분기문 - 명렁어에 목적지가 인코딩 되어 있음
: 간접 분기문 - 목적지가 레지스터 또는 메모리에 있어 한 번 더 참조할 필요가 있음 → BTB
: RAS(Return Address Stack) - 어떤 함수 호출 후 종료시 함수를 부른 곳으로 다시 돌아가야 함. 이때 돌아가는 주소는 프로그래임이 직접 수행될 때 알 수 있으며, 레지스터에 들어있어 간접 분기문이다.
: 일반 함수의 호출은 직접 분기문으로 구현되나 가상함수는 컴파일 시 함수 목적지를 알 수 없고 실제 구현은 callback 함수와 같은 간접 분기문으로 이루어진다.
: 점프테이블 - 컴파일러는 특정 조건을 만족하면 switch-case를 점프 테이블로 대체함. 점프 테이블은 하나의 해시 테이블로 switch 값에 대해 분기할 곳의 주소를 미리 테이블로 만들어 비교 없이 바로 목적지에 갈 수 있도록 하는 간접 분기문으로 구현된다. 이때 case 구문의 상수 값이 비교적 작은 범위에서 고르게 분포되어야 함 (조건)