CPU를 어떻게하면 빠르게, 효율적이게 만들 수 있을까? 해답은 바로 파이프라이닝이 있다. 기존의 CPU들은 명령어 처리중에는 다른 유닛을 사용하지 못한다. 예를 들어 버스를 점유하고 있지 않다면 다음 명령어를 미리 불러올 수 있겠지만 그러질 못한다. 파이프라이닝이 안되는 CPU들은 한 명령어를 처리할때 여러 유닛들중에 단 하나씩만 사용하기 때문이다.
파이프라이닝이 안되는 CPU를 가정해보자. 먼저 명령어 레지스터, 레지스터 파일과 스택 포인터, 주소 및 데이터 버스, 연산 장치 등이 있다고 하자. 명령어의 처리 시간은 고정적으로 2사이클을 차지하는데 첫번째는 무조건 명령어를 불러오고 두번째는 아무것도 하지 않는 명령어라 할지라도 사이클을 점유한다고 하자. 명령어의 가능한 최대 사이클 수는 8사이클이라고 하고 1000사이클의 실행 시간이 주어질때 얼마나 많은 명령어를 처리할 수 있을까? 답은 500개의 명령어를 처리할 수 있다. 아무것도 하지 않는 명령어도 최소한 2사이클은 소모하기 때문이다. 게다가 이 수치는 이론상 최대의 명령어 실행 효율을 가정한 것이다. 실제로 2사이클의 명령어들만 처리한다고 볼 수는 없기 때문에 500개보단 적게 처리할 것이다.
반대로 파이프라이닝이 가능한 CPU를 생각해보자. 파이프라인 프로세서는 특징이 있는데 고정된 사이클과 단계를 가지고 이 기준에 도달하지 않으면 명령어가 처리되지 않은 것으로 간주한다. 즉 중간에 4사이클만에 끝나는 명령어가 있어도 최종적으로는 8사이클일때 처리가 완료된다. 파이프라인 프로세서는 또 다른 특징이 있는데 여러개의 실행 흐름을 가질 수 있다. 명령어를 담고 있는 레지스터가 파이프라인 단계와 개수가 같고 다른 명령어가 하나의 유닛을 점유하고 있지 않는 한 명령어 처리중에 다른 명령어가 그 유닛을 점유할 수 있다. 그래서 동시에 한개 유닛을 중복으로 사용할 수는 없지만 절차적으로 하나씩 사용이 가능하다. 파이프라이닝이 안되는 프로세서는 처리중인 명령어의 다음 명령어를 가져오는 작업조차 안되는 것에 비하면 엄청난 개선이다.
실제로도 똑같은 1000사이클이면 처음 8사이클 이후에는 1사이클마다 명령어가 실행되게 된다. 왜냐하면 한개의 명령어가 처리중에도 다른 명령어가 중복되지 않는 유닛에 한해서 동시 실행이 가능해지기 때문이다. 이론상 1000사이클이면 1000개 가까이 되는 명령어 처리가 가능하다.
문제는 이론은 항상 틀린다는 것인데 파이프라인 프로세서는 변수가 많아서 얼마나 잘 만드냐에 따라 성능이 갈린다. 100단 파이프라인 단계를 가지고 있으면 진짜로 100개의 명령어를 동시에 처리할 수 있지만 엄청난 약점이 하나 생기기 때문에 지금은 그렇게까지 설계하진 않는다. 이 문제점들은 너무 고급진 내용이라 설명이 불가능하니 패스.
파이프라이닝이 안되는 CPU를 가정해보자. 먼저 명령어 레지스터, 레지스터 파일과 스택 포인터, 주소 및 데이터 버스, 연산 장치 등이 있다고 하자. 명령어의 처리 시간은 고정적으로 2사이클을 차지하는데 첫번째는 무조건 명령어를 불러오고 두번째는 아무것도 하지 않는 명령어라 할지라도 사이클을 점유한다고 하자. 명령어의 가능한 최대 사이클 수는 8사이클이라고 하고 1000사이클의 실행 시간이 주어질때 얼마나 많은 명령어를 처리할 수 있을까? 답은 500개의 명령어를 처리할 수 있다. 아무것도 하지 않는 명령어도 최소한 2사이클은 소모하기 때문이다. 게다가 이 수치는 이론상 최대의 명령어 실행 효율을 가정한 것이다. 실제로 2사이클의 명령어들만 처리한다고 볼 수는 없기 때문에 500개보단 적게 처리할 것이다.
반대로 파이프라이닝이 가능한 CPU를 생각해보자. 파이프라인 프로세서는 특징이 있는데 고정된 사이클과 단계를 가지고 이 기준에 도달하지 않으면 명령어가 처리되지 않은 것으로 간주한다. 즉 중간에 4사이클만에 끝나는 명령어가 있어도 최종적으로는 8사이클일때 처리가 완료된다. 파이프라인 프로세서는 또 다른 특징이 있는데 여러개의 실행 흐름을 가질 수 있다. 명령어를 담고 있는 레지스터가 파이프라인 단계와 개수가 같고 다른 명령어가 하나의 유닛을 점유하고 있지 않는 한 명령어 처리중에 다른 명령어가 그 유닛을 점유할 수 있다. 그래서 동시에 한개 유닛을 중복으로 사용할 수는 없지만 절차적으로 하나씩 사용이 가능하다. 파이프라이닝이 안되는 프로세서는 처리중인 명령어의 다음 명령어를 가져오는 작업조차 안되는 것에 비하면 엄청난 개선이다.
실제로도 똑같은 1000사이클이면 처음 8사이클 이후에는 1사이클마다 명령어가 실행되게 된다. 왜냐하면 한개의 명령어가 처리중에도 다른 명령어가 중복되지 않는 유닛에 한해서 동시 실행이 가능해지기 때문이다. 이론상 1000사이클이면 1000개 가까이 되는 명령어 처리가 가능하다.
문제는 이론은 항상 틀린다는 것인데 파이프라인 프로세서는 변수가 많아서 얼마나 잘 만드냐에 따라 성능이 갈린다. 100단 파이프라인 단계를 가지고 있으면 진짜로 100개의 명령어를 동시에 처리할 수 있지만 엄청난 약점이 하나 생기기 때문에 지금은 그렇게까지 설계하진 않는다. 이 문제점들은 너무 고급진 내용이라 설명이 불가능하니 패스.
댓글 0