IT 이모저모

Barrier 란? - 4

exien 2018. 3. 9. 08:24

캐시가 어렵다.


다행스럽게도 GPU의 장벽에는 데이터 의존성이있을 때 쉐이더 스레드가 겹치지 않게하는 것이 적어도 하나의 이유가 있습니다. 이것은 수천까지 크랭크 된 코어 수를 제외하고 CPU 스레드에 대해 이야기 할 때 땅콩 버터와 이전에 빵을 배치 한 것과 같은 시나리오입니다. 그러나 불행하게도 우리가 GPU에 대해 CPU와 반대되는 것에 관해 이야기 할 때 상황은 좀 더 복잡해집니다.

개별 버퍼에 많은 데이터를 쓰는 PC CPU에서 실행되는 스레드 그룹을 시작하고 해당 스레드가 완료 될 때까지 대기하도록 스레드 장벽을 삽입 한 다음 출력을 읽는 두 번째 스레드 그룹을 시작한다고 가정 해 봅시다 스레드의 제 1 그룹의 데이터. 두 번째 작업의 읽기 작업이 너무 일찍 일어나지 않도록하기 위해 적절한 메모리 / 컴파일러 장벽을 확보해야합니다 (그리고 종종 OS 동기화 기본 또는 원자 연산을 사용하여이 작업을 수행하는 경우가 많습니다). 캐시 계층이 존재할 때 올바른 결과를 얻으 려 할 필요가 없습니다. 이는 x86 코어의 캐시 (일반적으로 각 코어에는 공유 된 L2 및 가능하면 L3 캐시가있는 자체 L1 캐시가 있음)가 일관성 이 있기 때문입니다이는 다른 메모리 주소에 액세스 할 때 서로 "최신"상태를 유지한다는 것을 의미합니다. 그들이 어떻게이 기적적인 위업을 달성했는지에 대한 세부 사항은 매우 복잡 하지만 프로그래머로서 우리는 일반적으로 하드웨어에 의해 수행되는 내부 체조를 무례하게 알 수 없습니다.

GPU 용 드라이버를 작성하는 가난한 사람들에게는 그다지 간단하지 않습니다. 여러 가지 이유로 인해, 일부는 범용 컴퓨팅에 사용되지 않는 장치로 거슬러 올라가는 데, GPU는 항상 엄격한 계층 구조로 구성되지 않은 많은 캐시를 사용하는 경향이 있습니다. 세부 사항은 항상 공개는 아니지만 AMD는 우리가 배울 수있는 GPU에 대한 공개 정보를 상당히 많이 사용하는 경향이 있습니다. 이 프리젠 테이션 슬라이드 50의 다이어그램은 다음과 같습니다 .



이것은 CPU의 캐시 검색과는 상당히 다른 것처럼 보입니다! 우리는 L2를 통해 L2를 통과하는 두 가지 방법을 기대합니다.하지만 L2를 우회하여 메모리로 이동하는 색상 및 깊이 캐시가 있습니다! 그리고 캐시를 전혀 통과하지 않는 DMA 엔진이 있습니다! 실제로 여기에는 모든 연산 장치 (CU)에 L1 텍스처 캐시가 있고 큰 비디오 카드에는 수십 개의 연산 장치가있을 수 있기 때문에 여기의 다이어그램은 오해의 소지가 있습니다. 또한 명령어 캐시와 스칼라 데이터 L1이 여러 개 있으며 이들 중 하나가 최대 4CU 사이에 공유됩니다. 이 세부 많이에서의 이 GCN 백서 다양한 캐시 작동 방법을 설명하고, 또한 어떻게 직접 메모리 것은 (AKA는 UAV의에 기록) 자신의 로컬 L1을 통해 이동 및 쉐이더에서 기록 결국 L2에 전파.

엄격한 계층 구조없이 이러한 캐시를 모두 사용하면 캐시가 서로 동기화되지 않는 경우가 있습니다. GCN 백서에서 설명한 것처럼 셰이더 유닛의 L1 캐시는 쓰기가 L2에 도달 할 때까지 서로 일관성이 없습니다. 즉, 한 디스패치가 버퍼에 쓰고 다른 디스패치가 버퍼에서 읽는 경우 CU L1 캐시가 모든 디스패치가 최소한 L2로 만들어 졌는지 확인하기 위해 CU L1 캐시를 플러시 해야 할 수 있습니다 (캐시 플러시는 변경 / 더티 캐시 라인을 취하여 다음 캐시 레벨에 기록하는 작업 또는 마지막 캐시 레벨에 적용된 경우 실제 메모리). 그리고 슬라이드 52텍스처가 렌더링 대상으로 사용되는 것에서 읽을 수있는 텍스처로 사용되는 것까지 악화 될 때가 더욱 심각합니다. 이 경우 렌더링 대상에 대한 쓰기가 ROP에 연결된 색상 버퍼 L1 캐시에있을 수 있습니다. 즉, 다른 L1 및 L2 캐시를 플러시 할뿐만 아니라 캐시를 플러시해야합니다. (AMD의 새로운 Vega 아키텍처 에는 ROP가 L2의 클라이언트이기도 한 더 많은 캐시 계층 구조가 통합되어 있음을 참고하십시오 ).

AMD 하드웨어에 대한 멋진 점 중 하나는 이러한 일이 발생했을 때 그들의 툴이 실제로 당신에게 보여줄 수 있다는 것입니다! 다음은 대규모 발송이 텍스처에 대한 쓰기를 마친 후 내 RX 460에서 플러시되는 캐시 (및 동기화되는 셰이더 스레드!)를 보여주는 RGP 캡처의 스 니펫입니다.




이제이 점은 캐시가 어떻게 복잡하고 복잡한지를 설명하는 것이 아니라 GPU가 장벽을 필요로하는 또 다른 방법을 설명하는 것입니다. 스레드가 겹치지 않도록 보장하면 오래된 데이터가있을 수있는 캐시가 여러 개있을 때 읽기 후 쓰기 종속성을 해결하는 데 충분하지 않습니다. 또한 데이터를 읽어야하는 후속 작업에서 결과를 볼 수 있도록 해당 캐시를 무효화하거나 플러시해야합니다.



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

C# 반올림, 올림, 버림 사용하기  (0) 2018.03.09
Barrier 란? - 5  (0) 2018.03.09
Barrier 란? - 3  (0) 2018.03.09
Barrier 란? - 2  (0) 2018.03.09
V30S 씽큐 9일 출시  (0) 2018.03.08