IT 이모저모

Barrier 란? - 3

exien 2018. 3. 9. 08:21

GPU LAND로 돌아 가기


우리는 장벽이 무엇인지에 대한 기초를 다뤘지만 GPU와 대화하기 위해 API를 사용하는 이유는 아직 설명하지 못했습니다. 결국 Draw와 Dispatch 호출을 실행하는 것은 별도의 코어에서 실행되는 병렬 작업을 예약하는 것과 실제로 같지 않습니까? 제 말은 D3D11 프로그램의 API 호출 순서를 살펴보면 직렬로 보입니다.



이와 같은 API를 통해 GPU를 다루는 데 익숙하다면, GPU가 제출 한 순서대로 한 번에 하나씩 명령을 처리한다는 생각을하면 용서받을 수 있습니다. 오래 전부터 이것이 사실일지도 모르지만 현실은 실제로는 현대 GPU에서 좀 더 복잡합니다. 제가 말하고자하는 것을 보여주기 위해, AMD의 멋진 프로파일 링 도구 인 Radeon GPU Profiler 로 캡처 할 때 Deferred Texturing 샘플 이  어떻게 생겼는지 살펴 보겠습니다 .




이 스 니펫은 프레임의 일부분, 특히 모든 장면 지오메트리가 G- 버퍼로 래스터 화 된 부분을 보여줍니다. 왼쪽에는 그리기 호출이 표시되고 오른쪽의 파란색 막대는 그리기 호출이 실제로 시작되고 실행을 중지 할 때 표시됩니다. 그리고 당신은 무엇을 알고 있습니다, 거기에 계속되는 많은 중복이 있습니다! Windows 용 PIX를 실행 하면 조금 다르게 표시되는 동일한 것을 볼 수 있습니다 .


이것은 PIX의 타임 라인보기에서 발췌 한 것으로, 동일한 그리기 호출 시퀀스 (이 시간은 GTX 1070에서 캡처 된 반면 이전 RGP 캡처는 상당히 적은 RX 460에서 수행되었습니다)의 실행 시간을 보여줍니다. 동일한 패턴을 볼 수 있습니다. 드로잉은 대략 제출 순서대로 실행되기 시작하지만 전체가 겹쳐집니다. 경우에 따라, 추첨은 이전 추첨이 완료되기 전에 시작되고 완료됩니다!

GPU에 대해 조금이라도 알고 있다면 이것은 완전히 놀랄만 한 것은 아닙니다 . 결국, 모든 사람들은 GPU가 대부분 IHV가 " 쉐이더 코어 (shader core) "라고 부르는 것과 같이 수백 또는 수천 가지로 구성된다는 것을 알고 있습니다", 그리고 그 쉐이더 코어는 모두"곤란한 평행 "문제를 해결하기 위해 함께 작동합니다. 요즘에는 draw (그리고 디스패치를 처리하기 위해 수행 된 거의 모든 작업)를 처리하기 위해 수행 된 작업이 HLSL / GLSL / MetalSL 코드에서 컴파일 된 쉐이더 프로그램을 실행하는이 녀석에서 수행됩니다. 셰이더 코어가 단일 그리기 호출에서 수천 개의 정점을 병렬로 처리하고 삼각형을 래스터 라이 제이션 한 결과 수천 또는 수백만 픽셀을 처리하는 것은 당연합니다. 하지만 실제로 여러 개의 그리기 호출 또는 디스패치를 서로 연결하여 실제 상위 명령이 병렬로 실행되도록하는 것이 합리적입니까?

올바른 대답은 "예, 절대적!"입니다. 실제로 하드웨어 디자이너는 드로잉 사이에 상태가 변경되는 경우에도 GPU가이를 수행 할 수 있도록하기 위해 수년 동안 많은 노력을 기울였습니다. 데스크톱 GPU는 심지어 픽셀 쉐이더가 그리기 순서로 완료되지 않은 경우에도 블렌딩 작업을 해결할 수 있도록 ROP (픽셀 쉐이더의 출력을 가져 와서 실제로 메모리에 쓰는 유닛)를 설계했습니다! 이 방법을 사용하면 유휴 쉐이더 코어가 필요 없으므로 더 나은 처리량을 얻을 수 있습니다. 지금 당장 완전히 이해가되지 않는다면 걱정하지 마십시오. 왜 그런지 설명하는 향후 게시물에서 몇 가지 예를 거쳐 간다. 그러나 지금 당장은 드로잉과 디스패치를 겹치게하는 것이 일반적으로 처리량을 높일 수 있다는 사실을 알리십시오.

Draw / Dispatch의 GPU 스레드가 다른 GPU와 겹칠 수 있다면 GPU 는 두 작업 사이에 데이터 종속성이있는 경우 발생 하지 않도록 GPU가이를  방지 해야합니다. 이런 일이 발생하면 CPU에서 수행하는 작업을 이해하고 스레드 장벽과 비슷한 항목을 삽입하여 스레드 그룹이 모두 작업을 마쳤을 때 알려줍니다. 실제로 GPU는 다음 번 디스패치를 시작하기 전에 모든 뛰어난 컴퓨팅 쉐이더 스레드가 완료 될 때까지 기다리는 것과 같이 매우 거친 방식으로이 작업을 수행하는 경향이 있습니다. GPU는 계속 진행하기 전에 모든 스레드가 "소모"될 때까지 기다릴 것이므로 "플러시"또는 "유휴 대기"라고 할 수 있습니다. 그러나 다음 기사에서 더 자세히 설명 할 것입니다.





'IT 이모저모' 카테고리의 다른 글

Barrier 란? - 5  (0) 2018.03.09
Barrier 란? - 4  (0) 2018.03.09
Barrier 란? - 2  (0) 2018.03.09
V30S 씽큐 9일 출시  (0) 2018.03.08
ARM, 새로운 VPU·GPU 발표 - 말리 V52·G52  (0) 2018.03.07