작성일: 2/11/2024
Pipeline Hazards
키워드:
parallel programming, pipelining, structural hazards, data hazards, control hazards
한 줄 요약:
파이프라이닝을 통해 병렬로 데이터를 처리할 때 발생하는 구조적, 데이터, 제어 위험에 대해 알아본다.
설명
파이프라이닝은 여러 단계로 나누어 병렬로 데이터를 처리하는 방식으로, 각 단계는 다음 단계로 데이터를 전달하고 다음 단계는 이전 단계의 데이터를 받아 처리하는 방식으로 동작한다. 만약 이 과정에서 먼저 실행된 단계의 작업이 끝날 때까지 다음 단계의 작업이 기다리는 현상이 발생한다면 성능에 부정적인 영향을 줄 수 있다. 이처럼 최적의 효율을 방해하는 요인(상황)을 hazard(위험)라고 한다. 이때 발생하는 위험은 크게 구조적 위험, 데이터 위험, 제어 위험으로 나눌 수 있다.
구조적 위험(Structural Hazards)
구조적 위험은 하드웨어 자원을 공유하는 경우 발생한다. 파이프라인에서는 여러 단계가 동시에 동작하기 때문에 하드웨어 자원을 공유하는 경우가 많다. 예를 들어, 여러 스레드가 메모리에 저장된 공유 데이터에 접근하여 동시에 작업을 처리하는 경우, 같은 데이터를 동시에 처리하려고 할 때 구조적 위험이 발생한다. 이를 해결하기 위해서는 중복된 작업을 처리하지 않도록 작업을 분리하거나, 자원을 공유하는 방식을 변경하는 등의 방법을 사용할 수 있다.
데이터 위험(Data Hazards)
데이터 위험은 파이프라인에서 데이터가 올바른 순서로 처리되지 않을 때 발생한다. 예를 들어, 한 단계에서 처리된 데이터가 다음 단계에서 필요한 데이터보다 늦게 처리되는 경우 데이터 위험이 발생한다. 이를 해결하기 위해서는 데이터를 미리 읽어 들이거나, 데이터를 임시로 저장하는 등의 방법을 사용할 수 있다.
제어 위험(Control Hazards)
제어 위험은 파이프라인에서 명령어의 분기가 발생할 때 발생한다. 예를 들어, 데이터의 타입에 따라 다른 작업을 수행하는 경우, 파이프라인에서 분기 명령어가 실행될 수 있고, 분기 명령어의 조건에 따라 실행 결과를 버릴지, 유지할지 결정해야 한다. 이 때, 분기에 필요한 모든 정보를 확인하기 전까지 분기 명령어 이후의 명령어들을 미리 실행하지 않거나, 분기 명령어의 조건에 따라 실행 결과를 버리거나 유지하는 등의 방법을 사용할 수 있다.
결론
파이프라이닝을 통해 병렬로 데이터를 처리할 때는 구조적, 데이터, 제어 위험에 대해 고려해야 한다. 가장 간단하고 안정적으로 위험을 해결하는 방식은 이전 단계의 데이터가 처리될 때까지 wait
을 하는 것이다. 하지만 단순히 기다리는 방식은 파이프라이닝의 성능에 부정적인 영향을 줄 수 있다. 따라서, 이를 해결하기 위해서는 하드웨어 자원을 공유하는 경우를 최소화하고, 데이터를 미리 읽어 들여 먼저 처리하거나, 분기 명령어의 조건에 따라 실행 결과를 버리거나 유지하는 등의 방법을 사용하여 파이프라이닝의 성능을 최적화할 수 있다.