파이톨치

[시스템 프로그래밍] Superscalar Processor 본문

대학수업

[시스템 프로그래밍] Superscalar Processor

파이톨치 2022. 10. 3. 16:02
728x90

Superscalar Processor

 

위키백과에 따르면

 슈퍼스칼라(superscalar)는 CPU 내에 파이프라인을 여러 개 두어 명령어를 동시에 실행하는 기술이다. 

 

라고 한다.

 

동적으로 스케줄링하면서 사용함으로써 병렬적으로 쓰면서 효율 높이는 것이다. 

 

하지만

명령어 사이에 데이터 의존성, 자원 의존성, 프로시저 의존성이 존재하는 경우에는 동시실행에 제한이 있다.

다음과 같은 코드가 있을 때

 

다음과 같이 실행이 되는데 p1 * p2를 하기 위해서는 앞에서 한 연산의 결과가 필요하기 때문에 의존성이 있다. 

 

스테이지에서 스테이지로 넘어가는 형태로 연산이 된다. 

Haswell CPU

하스웰은 단일 곱셈-누산기(영어: Fused multiply-add, FMA) 명령어를 적용할 첫 인텔 x86/x64 CPU이다

- Multiple instructions can execute in parallel

- Some instructions take > 1 cycle, but can be pipelined

 

Loop Unrolling

빨간 색으로 칠한 부분을 왜 저렇게 했냐면, 저렇게 i를 1씩 더하지 말고 2씩 더하면서 한줄에 연산을 2번하면

빨리지지 않을까하는 생각으로 저렇게 썼다고 한다.

 

하지만 괄호에 따라서 성능이 달라진다.

저렇게 쓰면 순차적으로 더하게 되기 때문에 앞에 결과에 의존하게 되면서 병렬 연산의 한계를 보인다. 하지만 이를 해결하는 방법이 있다.

 

정말 간단하게도 괄호의 위치를 바꾸어 주면 된다. 

이렇게 하면 결과에 의존하지 않아도 되고 그냥 같이 더해서 x 에 집어 넣어주면 된다. 

 

그러면 처음 의도한대로 2배 빨라지는 모습을 볼 수 있다.

Cycles Per Element (CPE)

- Convenient way to express performance of program that operates on 
vectors or lists

 

- In our case: CPE = cycles per OP

 

- T = CPE*n + Overhead

728x90