[병렬 처리] 슈퍼스칼라 프로세서 - 명령어 발송 정책과 레지스터 재명명
글 작성자: _rian
명령어-수준 병렬성 (Instruction - level prallelism)
명령어들이 서로 독립적이어서 동시에 실행될 수 있는 상태
하드웨어 병렬성 (H/W parallelism, machine parallelism)
실제 명령어들을 병렬로 실행하는 데 사용될 수 있는 하드웨어 능력
하드웨어 자원의 이용률 저하 원인
1. 데이터 의존성
(1) 흐름 의존성 (flow dependence)
어떤 명령어를 실행하기 위해서는 앞의 다른 명령어의 실행 결과를 이용해야 하는 상황
-> 두 명령어는 반드시 순차적으로 실행되어야 함.
동적 실행 (dynamic execution)
프로그램에서 흐름 의존성이 존재하는 경우에, 뒤에 위치한 명령어들 중에서 현재 실행하려는 명령어와 의존성이 존재하지 않는 것이 있으면 순서를 변경하여 먼저 실행하는 방법.
펜티엄 프로 프로세서 이후의 대부분의 프로세서들에서 사용. -> 슈퍼스칼라 정도(degree of superscalar)를 결정
(2) 반의존성 (antidependence)
흐름 의존성이 존재하지 않는 명령어들 간이라도, 동적 실행을 위하여 순서를 바꾸어 실행할 수는 없는 의존 관계
흐름 의존성과 반대 방향의 의존성.
(3) 출력 의존성 (output dependence)
두 명령어들의 실행 결과가 동일한 목적지에 저장되는 경우
2. 자원 충돌 (resource conflict)
동시에 실행될 수 있는 명령어들이 같은 HW 자원을 사용하며, 그 수가 충분하지 못한 상황.
(자원의 예 : ALU, 기억장치 모듈, 캐시, 레지스터 등)
명령어 발송 정책
명령어를 발송하는데 필요한 프로토콜
명령어 발송 (Instruction issue)
프로세서가 독립적인 명령어들을 찾아서 실행 파이프라인으로 보내서 실행이 시작되도록 하는 과정
1. 순서대로 발송하고 순서대로 종료하는 방식 (in-order issue with in-order completion)
- 가장 간단한 명령어 발송 정책
- 원래 프로그램 순서대로 발송하고, 결과들고 원래 순서대로 저장
- 실행 단계가 미리 종료된 명령어라도 프로그램 순서 상으로 그 이전에 위치한 명령어가 완전히 종료되지 않았다면 기다렸다가 순서에 맞추어 마지막 단계인 저장(S) 단계 수행.
2. 순서대로 발송하고 순서와 다르게 종료하는 방식 (in-order issue with out-of-order completion)
- 명령어의 인출 및 해독 순서는 원래 프로그램 순서와 동일
- 데이터 의존성이나 자원 충돌 문제가 없는 한 실행 및 종료되는 순서는 원래 프로그램 순서와 상관없이 진행.
3. 순서와 다르게 발송하고 순서와 다르게 종료하는 방식 (out-order issue with out-of-order completion)
- 최근 대부분의 슈퍼스칼라 프로세서들에서 사용되고 있는 방식
- 최단 시간 내에 프로그램 실행을 완료할 수 있도록 명령어 발송과 종료 순서를 조정
- 명령어 발송 단계부터 데이터 의존성과 자원 충돌을 고려
- 원래 프로그램 순서와는 거의 상관없이 실행 순서 결정
- 필요시 미리보기 윈도우 (lookahead window)에 의해 독립적인 명령어의 추가 실행 추진
명령어 윈도우 (instruction window (명령어 풀 instruction pool)) | 파이프 라인의 해독 단계와 실행 단계 사이에 위치하는 버퍼로서, 해독된 명령어를 일시 저장한다. 이 윈도우가 채워지지 않는 한 프로세서는 명령어들을 계속 인출하고 해독할 수 있다. |
명령어 분배기 (instruction dispatcher) | 명령어 윈도우에 저장되어 있는 해독된 명령어들을 검사하여 1. 그 실행에 필요한 기능 유니트가 사용 가능해지고, 2. 자원 충돌이나 데이터 의존성이 없는 경우에 그 명령어를 꺼내 기능 유니트로 보내어 실행 단계가 시작되도록 한다. |
레지스터 재명명
명령어 실행 과정에서 CPU 레지스터의 중복 사용에 의해 실행이 지연되는 출력 의존성 및 반의존성에 의한 명령어-수준 병렬성의 저하를 방지하기 위한 방법.
전통적인 자원 충돌 해결책인 자원 복제(duplication of resource) 방법 이용함.
- 레지스터를 추가적으로 사용하거나
- 원래의 프로그램 코드에서 사용하는 레지스터의 이름을 변경
=> 불필요한 의존성 제거
'Computer Engineering > 병렬 처리(Parallel Processing)' 카테고리의 다른 글
[병렬 처리] 클러스터 미들웨어와 SSI (0) | 2019.06.20 |
---|---|
[병렬 처리] 클러스터 컴퓨터의 구조 및 분류 (0) | 2019.06.20 |
[병렬 처리] 고성능 입출력 시스템 구조 (0) | 2019.06.20 |
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류 (0) | 2019.06.20 |
그래픽 처리 유니트 (GPU) - GPU의 개념과 CUDA 프로그래밍 (0) | 2019.06.20 |
댓글
이 글 공유하기
다른 글
-
[병렬 처리] 클러스터 미들웨어와 SSI
[병렬 처리] 클러스터 미들웨어와 SSI
2019.06.20 -
[병렬 처리] 클러스터 컴퓨터의 구조 및 분류
[병렬 처리] 클러스터 컴퓨터의 구조 및 분류
2019.06.20 -
[병렬 처리] 고성능 입출력 시스템 구조
[병렬 처리] 고성능 입출력 시스템 구조
2019.06.20 -
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류
2019.06.20