• 04. 병렬 처리

    2021. 9. 20.

    by. ahntree

    728x90

    CPU의 성능을 높이기 위해서는 어떻게 해야 할까?

     

    클럭을 높이면 된다. 1초당 처리할 수 있는 명령의 개수가 증가하기 때문이다. 하지만 발열 문제가 있기 때문에 마냥 높일 수 없다.

     

    캐시의 크기를 늘리면 된다. 저장할 수 있는 캐시의 용량이 많을수록 많은 데이터를 캐시에서 바로 꺼내서 사용할 수 있기 때문이다. 하지만 비용이 비싸다.

     

    그래서 CPU의 성능을 높이기 위해 CPU 코어를 여러 개 만들거나, 동시에 여러 개의 명령을 실행할 수 있도록 만든다.

     

     

     

    1. 병렬 처리

    동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식이다. CPU의 코어 개수를 늘리거나 멀티프로세스 or 멀티스레드 방식을 이용하여 구현할 수 있다.

     

     

     

    2. 병렬 처리 시 고려 사항

    병렬 처리는 간단하지만 다음과 같은 사항들을 고려해야 한다.

     

    • 상호 의존성이 없어야 한다
    • 각 단계의 시간을 거의 일정하게 맞춰야 한다 (병목현상 방지)
    • 적절한 병렬 처리의 깊이를 정해야 한다 (너무 적어도, 많아도 좋지 않다)

     

     

     

    3. 병렬 처리 기법

    CPU의 명령어 실행 과정을 보면 다음과 같다.

     

    1. 명령어 패치(instruction fetch, IF) : 다음에 실행할 명령어를 명령어 레지스터에 저장한다.
    2. 명령어 해석(instruction decode, ID) : 명령어를 해석한다.
    3. 실행(excution, EX) : 해석한 결과를 토대로 명령어를 실행한다.
    4. 쓰기(write back, WB) : 실행된 결과를 메모리에 저장한다.

     

    이를 바탕으로 병렬 처리 기법들을 살펴보자.

     

     

    3-1. 파이프라인 기법

    CPU 사용을 극대화하기 위해 명령을 겹쳐서 실행하는 방법이다. 즉, 하나의 코어에 여러 개의 스레드를 사용하는 것이다.

     

    어떻게 하나의 코어에서 여러 개의 명령을 겹쳐서 실행할 수 있을까? 위에서 살펴봤듯이 명령어의 실행은 4단계로 이루어져 있다. 각 단계를 처리하는 부분이 다르기 때문에 단계가 겹치지 않는다면 동시에 실행할 수 있는 것이다. 이를 파이프라인 기법이라고 한다. 하지만 이 방법에도 위험이 수반된다.

     

    데이터 위험

    데이터의 의존성 때문에 발생한다. 이전 명령어가 사용 중인 데이터를 다음 명령어가 사용해야 한다면 실행이 끝날 때까지 기다려야 동기화 문제가 발생하지 않는다. 그렇기 때문에 파이프라인의 명령어 단계를 지연하여 해결한다.

     

    제어 위험

    if, goto 같은 제어문으로 인해 발생한다. 보통 명령어들이 순차적으로 실행할 것을 기대하고 동시에 처리하는데, 제어문으로 사용되지 않는 부분이 생기면 프로그램 카운터가 갑자기 변화할 수 있다. 분기 예측이나 분기 지연 방법으로 해결한다.

     

    구조 위험

    서로 다른 명령어가 같은 자원에 접근하려 할 때 발생한다. 이러한 구조 위험은 해결하기 어렵다고 알려져 있다.

     

     

    3-2. 슈퍼스칼라 기법

    코어를 여러 개 구성하여 복수의 명령어를 동시에 실행하는 기법이다. 코어 개수만큼의 동일한 명령어를 동시에 실행할 수 있다. 오늘날의 CPU는 대부분 이 기법을 사용하고 있다.

     

     

    3-3. 슈퍼파이프라인 기법

    명령어를 4단계에서 더 세분화하여 동일한 명령어라도 동시에 실행할 수 있는 기법이다. 크레이 슈퍼컴퓨터의 CPU에서 사용된다.

     

     

    3-4. 슈퍼파이프라인 슈퍼스칼라 기법

    슈퍼스칼라 + 슈퍼파이프라인 기법이다.

     

     

    3-5. VLIW 기법

    소프트웨어적으로 병렬 처리를 하는 기법이다. 동시에 실행할 수 있는 명령어들을 컴파일러가 추출하고 하나의 명령어로 압축해서 실행한다. 컴파일 시 병렬 처리가 이루어진다고 볼 수 있다.

    728x90

    '운영체제' 카테고리의 다른 글

    댓글