비순차 실행 (out-of-order execution)

컴퓨터과학·AI
한 줄 정의: 준비된 명령부터 먼저 실행하되 결과 반영은 원래 순서대로 하는 프로세서 기법입니다.

쉽게 풀면

앞의 명령이 메모리를 기다리느라 멈춰 있어도, 뒤에 있는 독립적인 명령은 먼저 해치울 수 있습니다. 비순차 실행은 명령들 사이의 데이터 의존만 지키면서 실행 순서를 자유롭게 바꿔 놀고 있는 연산 자원을 채웁니다. 다만 프로그램 결과는 원래 순서대로 실행한 것과 똑같아야 하므로, 최종 확정은 순서를 지켜 이루어집니다.

왜 중요한가

메모리 지연이 연산 속도보다 훨씬 느리게 개선되어 온 상황에서, 대기 시간을 다른 유용한 일로 메우는 것이 성능의 핵심이 되었습니다. 이 기법 덕분에 프로그래머가 명령 순서를 일일이 최적화하지 않아도 하드웨어가 알아서 병렬성을 뽑아냅니다. 현대 고성능 프로세서 설계의 근간 구조입니다.

논문에서는 이렇게 쓰입니다

"비순차 실행 창의 크기를 늘리자 메모리 지연이 긴 구간에서 명령어 수준 병렬성이 개선되었다."

동시에 고려할 수 있는 명령 범위를 넓히자 대기 시간을 더 잘 메웠다는 뜻입니다.

조금 더 깊게 보면

토마술로 알고리즘 계열의 설계가 표준으로, 같은 레지스터를 재사용해 생기는 거짓 의존을 레지스터 재명명으로 제거하고, 예약 스테이션에서 피연산자가 준비된 명령부터 발행합니다. 실행 결과는 재정렬 버퍼에 모였다가 프로그램 순서대로 확정되므로 예외와 인터럽트의 의미가 보존됩니다. 이 확정 단계의 존재가 투기적 실행의 되돌리기를 가능하게 하는 기반이기도 합니다.

주의할 점

실행 순서가 바뀌어도 단일 스레드의 결과는 동일하지만, 다른 스레드가 관찰하는 메모리 연산 순서는 달라질 수 있어 메모리 배리어가 필요해집니다. 파이프라이닝이 명령을 단계별로 겹쳐 처리하는 것이라면, 비순차 실행은 그 위에서 명령의 발행 순서를 재배열하는 별도의 층입니다.

관련 용어