If In Hlsl

3 분 소요

HLSL 의 Controll Instruction

GPU Gem2 에 많은 내용이 나와있다. 추가로 Unitiy Forum 도 참고할 만 하다.

GPU 의 분기방법

GPU 에서 if 문은 3가지 방법으로 처리될 수 있다.

  • MIMD(Multi Instuction Multi Data) Branching
    • Processer 마다 각각 Instruction 을 실행하는 구조에 해당.
    • 그래서 cpu 에서 if 문을 수행하는 정도의 비용만 가진다.
  • SIMD(Single INstruction Multi Data) Branching
    • 하나의 Instruction 으로 여러 Process 가 실행되는 구조에 해당.
    • Branch 에 들어간 Process 외의 나머지 Process 는 대기하게 된다.
  • Condition Codes
    • 모든 분기된 코드들을 실행하고, 조건에 맞는 코드들만 레지스터에 쓴다.
    • 그래서 비용이 Branch 를 모두 합친 것으로 매우 클 수 있다.
    • 하지만 Branch 내의 코드가 간결한 경우 Instruction Pipeline 을 비우지 않아도 되므로 효과적.

HLSL Attribute

분기방법을 Attribute 를 사용해 컴파일러에게 힌트를 줄 수 있다. 꼭 주어진 힌트와 똑같이 컴파일되지는 않음에 주의하자. 위에서 설명한 Condition Codes 방식은 [Flatten], SIMD 방식은 [Branch] 가 해당된다. 15년 전 GPU 는 대부분 [Branch] 를 지원하지 않았지만 요즘은 지원하는 것이 더 많다.

반복문에서는 [Unroll(5)] 를 사용하면 몇번 반복할지 검사하는 조건문을 없애게 되어 [Loop] 보다 성능향상을 보인다.

하지만 컴파일러의 판단이 더 좋을 수도 있으므로 굳이 매번 쓸 필요는 없다고 한다.

댓글남기기