Graphics Programming

CPU와 GPU에서 분기 예측 본문

Season 2

CPU와 GPU에서 분기 예측

minseoklee 2020. 1. 4. 12:44

한창 GPU 최적화를 알아볼 때 대충 이렇게 요약을 했었다.

  • GPU에는 분기라는 게 없다. 둘 다 실행하고 참인 분기의 결과를 선택한다. 따라서 한 분기에 인스트럭션이 많으면 다른 분기에 인스트럭션이 적어도 길게 걸리는 쪽을 기다려야 한다.
  • GPU의 셰이더 유닛은 매우 단순하다. GLSL이나 HLSL에서 정의한 함수도 모두 인라인화된다.
  • CPU는 두 분기를 동시에 실행하고 한쪽이 참이면 다른쪽을 바로 취소한다.
  • 인접한 픽셀들에 대한 셰이더들은 같은 분기를 타는 게 퍼포먼스에 좋다.

그런데 잘못 알고 있었나보다.

https://www.quora.com/Why-dont-GPUs-have-branch-predictors

2017년 답변인데다 답변자가 엔비디아, 애플에서 GPU 컴파일러 엔지니어였다니 지금도 유효한 답변일 것이다.

  • GPU에서 쓰레드들은 묶음으로 실행되고 쓰레드들이 서로 다른 분기를 실행하는 걸 branch divergence라고 한다.
    • 이 묶음을 엔비디아에서는 warp라고 부른다는데 AMD의 GCN 아키텍처 문서에서 wavefront라고 부르는 거랑 같은 단위인 것 같다.
  • CPU에서 분기 예측이 되는 이유는 superscalar 아키텍처로 인해 인스트럭션 단위 병렬화가 가능하기 때문이다. 인스트럭션 파이프라인이 기억하기로는 fetch - decode - execute - load - store인데 execute 부분이 병렬화가 되던가? 예전에 <프로그래머가 몰랐던 멀티코어 CPU 이야기> 에서 읽은 적이 있는데 정확히 기억이 안 난다. 다시 읽어봐야겠다... -.-
    • GPU에는 쓰레드가 아주 많다. 브랜치가 있으면 쓰레드를 하나 더 실행한다.
  • GPU는 하드웨어 수준에서 보면 분기 예측이라는 개념이 없다. branch predictor의 의의는 쓰레드 실행 경로를 예측 - 어떤 분기가 맞는지 알기도 전에 실행 - 틀렸으면 파이프라인 버리고 다시 실행이다. 그런데 예측할 필요 없이 실행할 수 있는 작업이 아주 많으면 예측에 기반한 작업이 의미가 없다.

아직도 완전히 정리된 건 아닌데, 내가 이 문맥에서 예측(speculation)이라는 용어를 잘못 생각하고 있던 건 확실하다.

Comments