KR20210116201A - 광선 추적 파이프라인을 조절하기 위한 장치 및 방법 - Google Patents

광선 추적 파이프라인을 조절하기 위한 장치 및 방법 Download PDF

Info

Publication number
KR20210116201A
KR20210116201A KR1020200183953A KR20200183953A KR20210116201A KR 20210116201 A KR20210116201 A KR 20210116201A KR 1020200183953 A KR1020200183953 A KR 1020200183953A KR 20200183953 A KR20200183953 A KR 20200183953A KR 20210116201 A KR20210116201 A KR 20210116201A
Authority
KR
South Korea
Prior art keywords
ray
stack
memory
data
graphics
Prior art date
Application number
KR1020200183953A
Other languages
English (en)
Inventor
카르틱 바이디야나단
아비셰크 아푸
바산스 랑가나단
조이딥 레이
프라순쿠마르 수르티
Original Assignee
인텔 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 인텔 코포레이션 filed Critical 인텔 코포레이션
Publication of KR20210116201A publication Critical patent/KR20210116201A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/06Ray-tracing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)

Abstract

스택 조절을 위한 장치 및 방법이 개시된다. 예를 들어, 장치의 일 실시예는 복수의 광선 셰이더를 실행하고 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 복수의 기능 유닛을 포함하는 실행 회로와, 이 실행 회로에 의해 생성된 광선 메시지를 큐잉하는 선입 선출(First In First Out: FIFO) 버퍼와, 복수의 1차 광선 중 하나 이상을 저장하는 캐시와, 대응하는 복수의 엔트리에 복수의 광선 메시지의 제1 서브세트를 저장하는 메모리 지원 스택과, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 복수의 광선 메시지의 제2 서브세트를 메모리 지원 스택에 저장하거나, 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 메모리 지원 스택 관리 회로와, 메모리 지원 스택으로부터 다음 광선 메시지를 판독하고, 캐시 또는 메모리 서브시스템으로부터 그 광선 메시지에 의해 식별된 다음 1차 광선을 검색하고, 이 다음 1차 광선에 대한 탐색 동작을 수행하는 광선 탐색 회로를 포함한다.

Description

광선 추적 파이프라인을 조절하기 위한 장치 및 방법{APPARATUS AND METHOD FOR THROTTLING A RAY TRACING PIPELINE}
본 발명은 일반적으로 그래픽 프로세서 분야에 관한 것이다. 보다 구체적으로, 본 발명은 광선 추적 파이프라인을 조절하기 위한 장치 및 방법에 관한 것이다.
광선 추적은 물리적 기반 렌더링을 통해 광 전송이 시뮬레이션되는 기술이다. 시네마틱 렌더링(cinematic rendering)에 널리 사용되면서, 이는 불과 몇 년 전까지만 해도 실시간 수행에 너무 많은 리소스를 사용하는 것으로 간주되었다. 광선 추적의 주요 동작 중 하나는, 경계 볼륨 계층 구조(bounding volume hierarchy: BVH) 내의 노드들을 탐색하고 교차함으로써 광선 장면 교차를 컴퓨팅하는 "광선 탐색(ray traversal)"으로 알려진 광선 장면 교차에 대한 가시성 쿼리(visibility query)를 처리하는 것이다.
다음의 도면과 함께 다음의 상세한 설명으로부터 본 발명을 더 잘 이해할 수 있다.
도 1은 하나 이상의 프로세서 코어 및 그래픽 프로세서를 갖는 프로세서를 구비한 컴퓨터 시스템의 실시예의 블록도이다.
도 2a 내지 도 2d는 하나 이상의 프로세서 코어, 통합된 메모리 제어기 및 통합된 그래픽 프로세서를 갖는 프로세서의 일 실시예의 블록도이다.
도 3a 내지 도 3c는 별개의 그래픽 프로세싱 유닛일 수 있거나 또는 복수의 프로세싱 코어와 통합된 그래픽 프로세서일 수 있는 그래픽 프로세서의 일 실시예의 블록도이다.
도 4는 그래픽 프로세서를 위한 그래픽 프로세싱 엔진의 실시예의 블록도이다.
도 5a 및 도 5b는 그래픽 프로세서의 다른 실시예의 블록도이다.
도 6은 실행 회로 및 로직의 예를 도시한다.
도 7은 실시예에 따른 그래픽 프로세서 실행 유닛 명령어 포맷을 도시한다.
도 8은 그래픽 파이프라인, 미디어 파이프라인, 디스플레이 엔진, 스레드 실행 로직 및 렌더링 출력 파이프라인을 포함하는 그래픽 프로세서의 다른 실시예의 블록도이다.
도 9a는 실시예에 따른 그래픽 프로세서 커맨드 포맷을 도시하는 블록도이다.
도 9b는 실시예에 따른 그래픽 프로세서 커맨드 시퀀스를 도시하는 블록도이다.
도 10은 실시예에 따른 데이터 프로세싱 시스템을 위한 예시적인 그래픽 소프트웨어 아키텍처를 도시한다.
도 11a 내지 도 11d는 집적 회로 및 예시적 패키지 어셈블리를 제조하는 데 사용될 수 있는 예시적인 IP 코어 개발 시스템을 도시한다.
도 12는 실시예에 따른, 하나 이상의 IP 코어를 사용하여 제조될 수 있는 예시적인 시스템 온 칩 집적 회로를 도시한다.
도 13은 하나 이상의 IP 코어를 사용하여 제조될 수 있는 시스템 온 칩 집적 회로의 예시적인 그래픽 프로세서를 도시한다.
도 14는 예시적인 그래픽 프로세서 아키텍처를 도시한다.
도 15는 머신-학습 아키텍처의 초기 훈련을 수행하기 위한 아키텍처를 도시한다.
도 16은 머신-학습 엔진이 런타임 동안 어떻게 지속적으로 훈련되고 업데이트되는지를 도시한다.
도 17은 머신-학습 엔진이 런타임 동안 어떻게 지속적으로 훈련되고 업데이트되는지를 도시한다.
도 18a 및 도 18b는 머신-학습 데이터가 네트워크 상에서 어떻게 공유되는지를 도시한다.
도 19는 머신-학습 엔진을 훈련시키는 방법을 도시한다.
도 20은 노드가 고스트 영역 데이터를 어떻게 교환하여 분산 노이즈 제거 동작을 수행하는지를 도시한다.
도 21은 이미지 렌더링 및 노이즈 제거 동작이 복수의 노드에 걸쳐 분산되는 아키텍처를 도시한다.
도 22는 분산 렌더링 및 노이즈 제거를 위한 아키텍처의 추가 세부 사항을 도시한다.
도 23은 분산 렌더링 및 노이즈 제거를 위한 방법을 도시한다.
도 24는 머신 학습 방법을 도시한다.
도 25는 복수의 상호 접속된 범용 그래픽 프로세서를 도시한다.
도 26은 머신 학습 구현을 위한 컨볼루션 계층 및 완전히 접속된 계층의 세트를 도시한다.
도 27은 컨벌루션 계층의 일 예를 도시한다.
도 28은 머신 학습 구현에서 상호 접속된 노드 세트의 예를 도시한다.
도 29는 신경망이 훈련 데이터세트를 사용하여 학습하는 훈련 프레임워크를 도시한다.
도 30a는 모델 병렬성 및 데이터 병렬성의 예를 도시한다.
도 30b는 시스템 온 칩(SoC)을 도시한다.
도 31은 광선 추적(ray tracing) 코어 및 텐서(tensor) 코어를 포함하는 프로세싱 아키텍처를 도시한다.
도 32는 빔의 예를 도시한다.
도 33은 빔 추적을 수행하기 위한 장치를 도시한다.
도 34는 빔 계층 구조의 예를 도시한다.
도 35는 빔 추적을 수행하는 방법을 도시한다.
도 36은 분산 광선 추적 엔진의 예를 도시한다.
도 37 및 도 38은 광선 추적 시스템에서 수행되는 압축을 도시한다.
도 39는 광선 추적 아키텍처 상에서 구현되는 방법을 도시한다.
도 40은 예시적인 하이브리드 광선 추적 장치를 도시한다.
도 41은 광선 추적 동작에 사용되는 스택을 도시한다.
도 42는 하이브리드 광선 추적 장치에 대한 추가 세부 사항을 도시한다.
도 43은 경계 볼륨 계층 구조를 도시한다.
도 44는 호출 스택 및 탐색 상태 스토리지를 도시한다.
도 45는 탐색 및 교차를 위한 방법을 도시한다.
도 46a 및 도 46b는 특정 셰이더를 실행하기 위해 복수의 디스패치 주기가 어떻게 요구되는지를 도시한다.
도 47은 단일 디스패치 주기가 복수의 셰이더를 어떻게 실행하는지를 도시한다.
도 48은 단일 디스패치 주기가 복수의 셰이더를 어떻게 실행하는지를 도시한다.
도 49는 광선 추적 명령어를 실행하는 아키텍처를 도시한다.
도 50은 스레드 내에서 광선 추적 명령어를 실행하는 방법을 도시한다.
도 51은 비동기 광선 트레이싱을 위한 아키텍처의 일 실시예를 도시한다.
도 52는 광선 탐색 회로의 일 실시예를 도시한다.
도 53은 본 발명의 일 실시예에 따른 메모리 지원 스택 관리를 도시한다.
도 54는 본 발명의 일 실시예에 따른 동기 및 비동기 메시지 처리를 도시한다.
도 55는 본 발명의 일 실시예에 따른 방법을 도시한다.
도 56은 실행 리소스의 서브 슬라이스에 대해 동작하는 본 발명의 일 실시예를 도시한다.
다음의 설명에서는, 이하에서 설명되는 본 발명의 실시예들의 완전한 이해를 제공하기 위해 설명의 목적으로 복수의 특정 세부 사항이 설명된다. 그러나, 통상의 기술자에게 본 발명의 실시예가 이러한 특정 세부 사항 없이도 실시될 수 있음은 명백할 것이다. 다른 경우에, 공지의 구조 및 장치는 본 발명의 실시예의 기본 원리를 모호하게 하는 것을 피하기 위해 블록도 형태로 도시된다.
예시적인 그래픽 프로세서 아키텍처 및 데이터 타입
시스템 개요
도 1은 일 실시예에 따른 프로세싱 시스템(100)의 블록도이다. 시스템(100)은 단일 프로세서 데스크탑 시스템, 멀티 프로세서 워크스테이션 시스템, 또는 많은 수의 프로세서(102) 또는 프로세서 코어(107)를 갖는 서버 시스템에서 사용될 수 있다. 일 실시예에서, 시스템(100)은 로컬 또는 광역 네트워크에 유선 또는 무선으로 연결될 수 있는 사물 인터넷(IoT) 내의 장치와 같은 모바일, 휴대형 또는 내장형 장치에 사용되는 시스템 온 칩(SoC) 집적 회로 내에 통합된 프로세싱 플랫폼이다.
일 실시예에서, 시스템(100)은 서버 기반 게이밍 플랫폼, 및 게임 및 미디어 콘솔, 모바일 게이밍 콘솔, 휴대형 게임 콘솔 또는 온라인 게임 콘솔을 포함하는 게임 콘솔을 포함하거나, 이들에 연결되거나, 이들 내에 통합될 수 있다. 일부 실시예에서, 시스템(100)은 휴대 전화, 스마트 폰, 태블릿 컴퓨팅 장치 또는 내부 저장 용량이 작은 랩탑과 같은 모바일 인터넷 연결 장치의 일부이다. 프로세싱 시스템(100)은 또한 스마트 와치 웨어러블 장치와 같은 웨어러블 장치; 실제 시각, 오디오 또는 촉각 경험을 보완하기 위한 시각적, 오디오 또는 촉각 출력을 제공하거나 텍스트, 오디오, 그래픽, 비디오, 홀로그램 이미지 또는 비디오 또는 촉각 피드백을 제공하는 증강 현실(AR) 또는 가상 현실(VR) 기능으로 강화된 스마트 아이웨어 또는 의복; 다른 증강 현실(AR) 장치; 또는 다른 가상 현실(VR) 장치를 포함하거나, 이들에 연결되거나, 이들 내에 통합될 수 있다. 일부 실시예에서, 프로세싱 시스템(100)은 텔레비전 또는 셋톱 박스 장치를 포함하거나 그 일부이다. 일 실시예에서, 시스템(100)은 버스, 트랙터 트레일러, 자동차, 모터 또는 전동 사이클, 비행기 또는 글라이더(또는 이들의 임의의 조합)와 같은 자율 주행 차량을 포함하거나, 이들에 연결되거나, 이들 내에 통합될 수 있다. 자율 주행 차량은 시스템(100)을 사용하여 차량 주위에서 감지된 환경을 처리할 수 있다.
일부 실시예에서, 하나 이상의 프로세서(102) 각각은 실행될 때 시스템 또는 사용자 소프트웨어에 대한 동작을 수행하는 명령어를 처리하는 하나 이상의 프로세서 코어(107)를 포함한다. 일부 실시예에서, 하나 이상의 프로세서 코어(107) 중 적어도 하나는 특정 명령어 세트(109)를 처리하도록 구성된다. 일부 실시예에서, 명령어 세트(109)는 CISC(Complex Instruction Set Computing), RISC(Reduced Instruction Set Computing), 또는 VLIW(Very Long Instruction Word)를 통한 컴퓨팅을 용이하게 할 수 있다. 하나 이상의 프로세서 코어(107)는 다른 명령어 세트의 에뮬레이션을 용이하게 하는 명령어를 포함할 수 있는 다른 명령어 세트(109)를 처리할 수 있다. 프로세서 코어(107)는 또한 DSP(Digital Signal Processor)와 같은 다른 프로세싱 장치를 포함할 수 있다.
일부 실시예에서, 프로세서(102)는 캐시 메모리(104)를 포함한다. 아키텍처에 따라, 프로세서(102)는 단일 내부 캐시 또는 내부 캐시의 복수 레벨을 가질 수 있다. 일부 실시예에서, 캐시 메모리는 프로세서(102)의 다양한 컴포넌트 사이에서 공유된다. 일부 실시예에서, 프로세서(102)는 또한 외부 캐시(예를 들어, 레벨 3(L3) 캐시 또는 LLC(Last Level Cache))(도시하지 않음)를 사용하는데, 이들은 공지의 캐시 일관성 기술(cache coherency techniques)을 사용하여 프로세서 코어(107) 사이에서 공유될 수 있다. 레지스터 파일(106)이 프로세서(102)에 추가로 포함될 수 있으며, 이는 상이한 타입의 데이터를 저장하는 상이한 타입의 레지스터(예를 들어, 정수 레지스터, 부동 소수점 레지스터, 상태 레지스터 및 명령어 포인터 레지스터)를 포함할 수 있다. 일부 레지스터는 범용 레지스터일 수 있지만, 다른 레지스터는 프로세서(102)의 설계에 특정될 수 있다.
일부 실시예에서, 하나 이상의 프로세서(들)(102)는 하나 이상의 인터페이스 버스(들)(110)와 연결되어 시스템(100)의 프로세서(102)와 다른 컴포넌트 사이에서 주소, 데이터 또는 제어 신호와 같은 통신 신호를 전송한다. 일 실시예에서, 인터페이스 버스(110)는 DMI(Direct Media Interface) 버스의 특정 버전과 같은 프로세서 버스일 수 있다. 그러나, 프로세서 버스는 DMI 버스로 한정되지 않으며, 하나 이상의 PCI(Peripheral Component Interconnect) 버스(예를 들어, PCI, PCI 익스프레스), 메모리 버스 또는 다른 타입의 인터페이스 버스를 포함할 수 있다. 일 실시예에서, 프로세서(들)(102)는 통합된 메모리 제어기(116) 및 플랫폼 제어기 허브(130)를 포함한다. 메모리 제어기(116)는 메모리 장치와 시스템(100)의 다른 컴포넌트 사이의 통신을 용이하게 하고, 플랫폼 제어기 허브(PCH)(130)는 로컬 I/O 버스를 통해 I/O 장치에 접속을 제공한다.
메모리 장치(120)는 DRAM(dynamic random-access memory) 장치, SRAM(static random-access memory) 장치, 플래시 메모리 장치, 상-변화 메모리 장치, 또는 프로세스 메모리로서 기능을 하기에 적절한 성능을 갖는 일부 다른 메모리 장치일 수 있다. 일 실시예에서, 메모리 장치(120)는 하나 이상의 프로세서(102)가 애플리케이션 또는 프로세스를 실행할 때 사용하는 데이터(122) 및 명령어(121)를 저장하는, 시스템(100)용 시스템 메모리로서 동작할 수 있다. 메모리 제어기(116)는 또한 그래픽 및 미디어 동작을 수행하기 위해 프로세서(102) 내의 하나 이상의 그래픽 프로세서(108)와 통신할 수 있는 선택적인 외부 그래픽 프로세서(118)와 연결된다. 일부 실시예에서, 그래픽, 미디어 및/또는 컴퓨팅 동작은 그래픽, 미디어 또는 컴퓨팅 동작의 특수 세트를 수행하도록 구성될 수 있는 보조 프로세서인 가속기(112)에 의해 지원될 수 있다. 예를 들어, 일 실시예에서, 가속기(112)는 머신 학습 또는 컴퓨팅 동작을 최적화하는데 사용되는 매트릭스(matrix) 곱셈 가속기이다. 일 실시예에서, 가속기(112)는 그래픽 프로세서(108)와 협력하여 광선-추적(ray-tracing) 동작을 수행하는 데 사용될 수 있는 광선-추적 가속기이다. 일 실시예에서, 외부 가속기(119)가 가속기(112)를 대체하여 또는 가속기(112)와 함께 사용될 수 있다.
일부 실시예들에서, 디스플레이 장치(111)는 프로세서(들)(102)에 접속될 수 있다. 디스플레이 장치(111)는 모바일 전자 장치 또는 랩탑 장치에서와 같은 내부 디스플레이 장치 또는 디스플레이 인터페이스(예를 들어, DisplayPort 등)를 통해 부착된 외부 디스플레이 장치 중 하나 이상일 수 있다. 일 실시예에서, 디스플레이 장치(111)는 가상 현실(VR) 애플리케이션 또는 증강 현실(AR) 애플리케이션에서 사용하는 입체 디스플레이 장치와 같은 헤드 마운트 디스플레이(HMD)일 수 있다.
일부 실시예에서, 플랫폼 제어기 허브(130)는 주변 장치가 고속 I/O 버스를 통해 메모리 장치(120) 및 프로세서(102)에 접속될 수 있도록 한다. I/O 주변 장치는 오디오 제어기(146), 네트워크 제어기(134), 펌웨어 인터페이스(128), 무선 송수신기(126), 터치 센서(125), 데이터 저장 장치(124)(예를 들어, 비휘발성 메모리, 휘발성 메모리, 하드 디스크 드라이브, 플래시 메모리, NAND, 3D NAND, 3D XPoint 등)를 포함하지만, 이에 한정되는 것은 아니다. 데이터 저장 장치(124)는 저장 인터페이스(예를 들어, SATA)를 통해 또는 PCI 버스(예를 들어, PCI, PCI 익스프레스)와 같은 주변 장치 버스를 통해 접속될 수 있다. 터치 센서(125)는 터치 스크린 센서, 압력 센서 또는 지문 센서를 포함할 수 있다. 무선 송수신기(126)는 Wi-Fi 송수신기, 블루투스 송수신기, 또는 3G, 4G, 5G 또는 LTE(Long-Term Evolution) 송수신기와 같은 모바일 네트워크 송수신기일 수 있다. 펌웨어 인터페이스(128)는 시스템 펌웨어와의 통신을 가능하게 하고, 예를 들어, UEFI(unified extensible firmware interface)일 수 있다. 네트워크 제어기(134)는 유선 네트워크에 대한 네트워크 접속을 가능하게 할 수 있다. 일부 실시예에서, 고성능 네트워크 제어기(도시하지 않음)는 인터페이스 버스(110)에 연결된다. 일 실시예에서, 오디오 제어기(146)는 멀티-채널 고선명 오디오 제어기이다. 일 실시예에서, 시스템(100)은 레거시(예를 들어, PS/2(Personal System 2)) 장치를 시스템에 연결하기 위한 선택적인 레거시 I/O 제어기(140)를 포함한다. 플랫폼 제어기 허브(130)는 또한 키보드 및 마우스 조합(143), 카메라(144) 또는 다른 USB 입력 장치와 같은 하나 이상의 USB(Universal Serial Bus) 제어기(142) 연결 입력 장치에 접속할 수 있다.
다르게 구성된 다른 타입의 데이터 프로세싱 시스템이 또한 사용될 수 있기 때문에, 도시된 시스템(100)은 예시적이며 한정적이지 않다는 점이 이해될 것이다. 예를 들어, 메모리 제어기(116) 및 플랫폼 제어기 허브(130)의 경우는 외부 그래픽 프로세서(118)와 같은 별개의 외부 그래픽 프로세서에 통합될 수 있다. 일 실시예에서, 플랫폼 제어기 허브(130) 및/또는 메모리 제어기(116)는 하나 이상의 프로세서(들)(102)의 외부에 있을 수 있다. 예를 들어, 시스템(100)은 외부 메모리 제어기(116) 및 플랫폼 제어기 허브(130)를 포함할 수 있는데, 이는 프로세서(들)(102)와 통신하는 시스템 칩셋 내의 메모리 제어기 허브 및 주변 장치 제어기 허브로서 구성될 수 있다.
예를 들어, CPU, 메모리 및 다른 컴포넌트와 같은 컴포넌트가 장착된 회로 보드("슬레드(sleds)")가 사용되며 열적 성능을 향상시키도록 설계될 수 있다. 일부 예에서, 프로세서와 같은 프로세싱 컴포넌트는 슬레드의 위쪽에 위치하고, DIMM과 같은 니어 메모리(near memory)는 슬레드의 아래쪽에 위치한다. 이 설계에서 제공하는 향상된 공기 흐름으로 인해, 컴포넌트들은 일반적인 시스템에서보다 높은 주파수 및 전력 레벨에서 동작하여 성능이 향상될 수 있다. 또한, 슬레드는 랙(rack)에서 전원 및 데이터 통신 케이블과 임의로 결합하도록 구성되어 있으므로, 신속하게 제거, 업그레이드, 재설치 및/또는 교체될 수 있는 능력을 향상시킬 수 있다. 마찬가지로, 프로세서, 가속기, 메모리 및 데이터 저장 드라이브와 같이 슬레드 상에 위치하는 개별 컴포넌트는 서로의 간격이 넓어짐에 따라 쉽게 업그레이드되도록 구성된다. 예시적인 실시예에서, 컴포넌트는 진품임을 증명하기 위한 하드웨어 증명 특징을 추가로 포함한다.
데이터 센터는 이더넷 및 옴니 경로(Omni-Path)를 포함하는 복수의 다른 네트워크 아키텍처를 지원하는 단일 네트워크 아키텍처("패브릭(fabric)")를 이용할 수 있다. 슬레드는 광섬유를 통해 스위치에 연결될 수 있으며, 이는 전형적인 트위스트 페어 케이블링(예를 들어, 카테고리 5, 카테고리 5e, 카테고리 6 등)보다 높은 대역폭과 낮은 대기 시간을 제공한다. 높은 대역폭, 낮은 대기 시간 상호 접속 및 네트워크 아키텍처로 인해, 데이터 센터는, 사용 중에, 메모리, 가속기(예를 들어, GPU, 그래픽 가속기, FPGA, ASIC, 신경망 및/또는 인공 지능 가속기 등) 및 물리적으로 분리된 데이터 저장 드라이브와 같은 리소스를 풀링하고(pool), 필요에 기반하여 이들을 컴퓨팅 리소스(예를 들어, 프로세서)에 제공하여 컴퓨팅 리소스가 로컬인 것처럼 풀링된 리소스에 액세스할 수 있도록 한다.
파워 서플라이 또는 전원은 본 명세서에 설명된 시스템(100) 또는 임의의 컴포넌트에 전압 및/또는 전류를 제공할 수 있다. 일 예에서, 파워 서플라이는 벽 콘센트에 플러그하기 위한 AC-DC(교류-직류) 어댑터를 포함한다. 이러한 AC 전력은 재생 가능 에너지(예를 들어, 태양광) 전원일 수 있다. 일 예에서, 전원은 외부 AC-DC 변환기와 같은 DC 전원을 포함한다. 일 예에서, 전원 또는 파워 서플라이는 충전 필드에 근접함으로써 충전하는 무선 충전 하드웨어를 포함한다. 일 예에서, 전원은 내부 배터리, 교류 전원, 모션 기반 전원, 태양광 전원 또는 연료 전지 전원을 포함할 수 있다.
도 2a 내지 도 2d는 본 명세서에 설명된 실시예에 의해 제공되는 컴퓨팅 시스템 및 그래픽 프로세서를 도시한다. 본 명세서에서 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 2a 내지 도 2d의 요소는 본 명세서의 다른 곳에서 설명된 것과 유사한 방식으로 동작 또는 기능할 수 있지만, 이에 한정되는 것은 아니다.
도 2a는 하나 이상의 프로세서 코어(202A-202N), 통합된 메모리 제어기(214) 및 통합된 그래픽 프로세서(208)를 갖는 프로세서(200)의 실시예의 블록도이다. 프로세서(200)는 점선 박스로 표시된 추가 코어(202N)까지 포함하는 추가 코어를 포함할 수 있다. 프로세서 코어(202A-202N) 각각은 하나 이상의 내부 캐시 유닛(204A-204N)을 포함한다. 일부 실시예에서, 각각의 프로세서 코어는 또한 하나 이상의 공유 캐시 유닛(206)에 액세스할 수 있다. 내부 캐시 유닛(204A-204N) 및 공유 캐시 유닛(206)은 프로세서(200) 내의 캐시 메모리 계층 구조를 나타낸다. 캐시 메모리 계층 구조는 각각의 프로세서 코어 내의 명령어 및 데이터 캐시의 적어도 하나의 레벨과, 캐시의 레벨 2(L2), 레벨 3(L3), 레벨 4(L4) 또는 기타 레벨과 같은 공유된 중간-레벨 캐시의 하나 이상의 레벨을 포함할 수 있으며, 외부 메모리 이전의 최고 레벨의 캐시는 LLC로 분류된다. 일부 실시예에서, 캐시 일관성 로직은 다양한 캐시 유닛(206 및 204A-204N) 사이의 일관성을 유지시킨다.
일부 실시예에서, 프로세서(200)는 또한 하나 이상의 버스 제어기 유닛(216) 및 시스템 에이전트 코어(210)의 세트를 포함할 수 있다. 하나 이상의 버스 제어기 유닛(216)은 하나 이상의 PCI 또는 PCI 익스프레스 버스와 같은 주변 장치 버스 세트를 관리한다. 시스템 에이전트 코어(210)는 다양한 프로세서 컴포넌트에 대한 관리 기능을 제공한다. 일부 실시예에서, 시스템 에이전트 코어(210)는 다양한 외부 메모리 장치(도시하지 않음)에 대한 액세스를 관리하는 하나 이상의 통합된 메모리 제어기(214)를 포함한다.
일부 실시예에서, 하나 이상의 프로세서 코어(202A-202N)는 동시 멀티-스레딩에 대한 지원을 포함한다. 이러한 실시예에서, 시스템 에이전트 코어(210)는 멀티-스레드 프로세싱 동안 코어(202A-202N)를 조정하고 동작시키는 컴포넌트를 포함한다. 시스템 에이전트 코어(210)는 전력 제어 유닛(PCU)을 추가로 포함할 수 있고, 이 전력 제어 유닛(PCU)은 프로세서 코어(202A-202N) 및 그래픽 프로세서(208)의 전력 상태를 조절하는 로직 및 컴포넌트를 포함한다.
일부 실시예에서, 프로세서(200)는 그래픽 프로세싱 동작을 실행하는 그래픽 프로세서(208)를 추가로 포함한다. 일부 실시예에서, 그래픽 프로세서(208)는 공유 캐시 유닛(206)의 세트 및 하나 이상의 통합 메모리 제어기(214)를 포함하는 시스템 에이전트 코어(210)에 연결된다. 일부 실시예에서, 시스템 에이전트 코어(210)는 또한 그래픽 프로세서 출력을 하나 이상의 연결된 디스플레이로 공급하는 디스플레이 제어기(211)를 포함한다. 일부 실시예에서, 디스플레이 제어기(211)는 또한 적어도 하나의 상호 접속부를 통해 그래픽 프로세서에 연결된 별개의 모듈일 수 있거나, 그래픽 프로세서(208) 내에 통합될 수 있다.
일부 실시예에서는, 링-기반 상호 접속 유닛(212)이 프로세서(200)의 내부 컴포넌트를 연결하는데 사용된다. 그러나, 포인트-투-포인트(point-to-point) 상호 접속부, 스위칭된 상호 접속부, 또는 이 분야의 공지 기술을 포함한 다른 기술을 포함하는 대안적인 상호 접속 유닛이 사용될 수 있다. 일부 실시예에서, 그래픽 프로세서(208)는 I/O 링크(213)를 통해 링 상호 접속부(212)에 연결된다.
예시적인 I/O 링크(213)는 다양한 프로세서 컴포넌트와 eDRAM 모듈과 같은 고성능 내장형 메모리 모듈(218) 사이의 통신을 용이하게 하는 온 패키지 I/O 상호 접속부를 포함하는 복수의 다양한 I/O 상호 접속부 중 적어도 하나를 나타낸다. 일부 실시예에서, 각각의 프로세서 코어(202A-202N) 및 그래픽 프로세서(208)는 공유 LLC로서 내장형 메모리 모듈(218)을 사용할 수 있다.
일부 실시예에서, 프로세서 코어(202A-202N)는 동일한 명령어 세트 아키텍처를 실행하는 균질 코어이다. 다른 실시예에서, 프로세서 코어(202A-202N)는 명령어 세트 아키텍처(ISA)의 관점에서 비균질하며, 이 경우 프로세서 코어(202A-202N) 중 하나 이상은 제 1 명령어 세트를 실행하고, 다른 코어의 적어도 하나는 제 1 명령어 세트의 서브세트 또는 다른 명령어 세트를 실행한다. 일 실시예에서, 프로세서 코어(202A-202N)는 마이크로 아키텍처의 관점에서 비균질하며, 이 경우 비교적 많은 전력을 소비하는 하나 이상의 코어는 적은 전력을 소비하는 하나 이상의 전력 코어와 연결된다. 일 실시예에서, 프로세서 코어(202A-202N)는 컴퓨팅 능력의 관점에서 비균질하다. 부가적으로, 프로세서(200)는 다른 컴포넌트에 더하여 도시된 컴포넌트를 갖는 SoC 집적 회로로서 구현되거나 또는 하나 이상의 칩 상에 구현될 수 있다.
도 2b는 본 명세서에서 설명된 일부 실시예에 따른 그래픽 프로세서 코어(219)의 하드웨어 로직의 블록도이다. 본 명세서에서의 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 2b의 요소는 본 명세서의 다른 곳에서 설명된 것과 유사한 방식으로 동작하거나 기능할 수 있지만, 이에 한정되는 것은 아니다. 코어 슬라이스로 종종 지칭되는 그래픽 프로세서 코어(219)는 모듈식 그래픽 프로세서 내의 하나 또는 복수의 그래픽 코어일 수 있다. 그래픽 프로세서 코어(219)는 하나의 그래픽 코어 슬라이스의 예시이며, 본 명세서에 설명된 그래픽 프로세서는 목표 전력 및 성능 포락선에 따라 복수의 그래픽 코어 슬라이스를 포함할 수 있다. 각각의 그래픽 프로세서 코어(219)는 범용 및 고정 기능 로직의 모듈식 블록을 포함하는, 서브-슬라이스라고도 지칭되는 복수의 서브-코어(221A-221F)와 연결된 고정 기능 블록(230)을 포함할 수 있다.
일부 실시예에서, 고정 기능 블록(230)은 그래픽 프로세서 코어(219)의 모든 서브-코어에 의해, 예를 들어 낮은 성능 및/또는 저전력 그래픽 프로세서 구현예에서 공유될 수 있는 기하(geometry)/고정 기능 파이프라인(231)을 포함한다. 다양한 실시예에서, 기하/고정 기능 파이프라인(231)은 3D 고정 기능 파이프라인(예를 들어, 후술되는 도 3 및 도 4에서와 같은 3D 파이프라인(312)), 비디오 프론트-엔드 유닛, 스레드 생성기 및 스레드 디스패처, 및 통합 반환 버퍼(예를 들어, 후술되는 도 4의 통합 반환 버퍼(418))를 관리하는 통합 반환 버퍼 관리자를 포함한다.
일 실시예에서, 고정 기능 블록(230)은 또한 그래픽 SoC 인터페이스(232), 그래픽 마이크로컨트롤러(233) 및 미디어 파이프라인(234)을 포함한다. 그래픽 SoC 인터페이스(232)는 그래픽 프로세서 코어(219)와 시스템 온 칩 집적 회로 내의 다른 프로세서 코어 사이의 인터페이스를 제공한다. 그래픽 마이크로컨트롤러(233)는 스레드 디스패치, 스케줄링 및 선점(pre-emption)을 포함하는 그래픽 프로세서 코어(219)의 다양한 기능을 관리하도록 구성될 수 있는 프로그램 가능한 서브-프로세서이다. 미디어 파이프라인(234)(예를 들어, 도 3 및 도 4의 미디어 파이프라인(316))은 이미지 및 비디오 데이터를 포함하는 멀티미디어 데이터의 디코딩, 인코딩, 사전 프로세싱 및/또는 사후 프로세싱을 용이하게 하는 로직을 포함한다. 미디어 파이프라인(234)은 서브-코어(221A-221F) 내의 컴퓨팅 또는 샘플링 로직에 대한 요청을 통해 미디어 동작을 구현한다.
일 실시예에서, SoC 인터페이스(232)는 그래픽 프로세서 코어(219)가 범용 애플리케이션 프로세서 코어(예를 들어, CPU), 및/또는 공유 LLC 메모리, 시스템 RAM 및/또는 내장형 온 칩 또는 온 패키지 DRAM과 같은 메모리 계층 구조 요소를 포함하는 SoC 내의 다른 컴포넌트와 통신할 수 있도록 한다. SoC 인터페이스(232)는 또한 카메라 이미징 파이프라인과 같은 SoC 내의 고정 기능 장치와의 통신을 가능하도록 할 수 있고, 그래픽 프로세서 코어(219)와 SoC 내의 CPU 사이에서 공유될 수 있는 전역 메모리 원자(global memory atomics)를 사용 및/또는 구현할 수 있도록 한다. SoC 인터페이스(232)는 또한 그래픽 프로세서 코어(219)에 대한 전력 관리 제어를 구현할 수 있고, 그래픽 프로세서 코어(219)의 클럭 도메인과 SoC 내의 다른 클럭 도메인 사이의 인터페이스를 가능하도록 할 수 있다. 일 실시예에서, SoC 인터페이스(232)는 그래픽 프로세서 내의 하나 이상의 그래픽 코어 각각에 커맨드 및 명령어를 제공하도록 구성된 커맨드 스트리머 및 전역 스레드 디스패처로부터 커맨드 버퍼의 수신을 가능하도록 한다. 커맨드 및 명령어는 미디어 동작이 수행되어야 할 때 미디어 파이프라인(234)에 디스패치되거나, 또는 그래픽 프로세싱 동작이 수행되어야 할 때 기하 및 고정 기능 파이프라인(예를 들어, 기하 및 고정 기능 파이프라인(231), 기하 및 고정 기능 파이프라인(237))으로 디스패치될 수 있다.
그래픽 마이크로컨트롤러(233)는 그래픽 프로세서 코어(219)에 대한 다양한 스케줄링 및 관리 태스크를 수행하도록 구성될 수 있다. 일 실시예에서, 그래픽 마이크로컨트롤러(233)는 서브-코어(221A-221F) 내의 실행 유닛(EU) 어레이(222A-222F, 224A-224F) 내의 다양한 그래픽 병렬 엔진 상에서 그래픽 수행하고 및/또는 워크로드 스케줄링을 계산할 수 있다. 이 스케줄링 모델에서, 그래픽 프로세서 코어(219)를 포함하는 SoC의 CPU 코어 상에서 실행되는 호스트 소프트웨어는 복수의 그래픽 프로세서 초인종(doorbell) 중 하나에 워크로드를 제출할 수 있으며, 이는 적절한 그래픽 엔진 상에서 스케줄링 동작을 호출한다. 스케줄링 동작은 다음에 실행할 워크로드를 결정하는 것, 커맨드 스트리머에 워크로드를 제출하는 것, 엔진에서 실행중인 기존 워크로드를 선점하는 것, 워크로드의 진행 상황을 모니터링하는 것, 및 워크로드 완료시 호스트 소프트웨어에 통지하는 것을 포함한다. 일 실시예에서, 그래픽 마이크로컨트롤러(233)는 또한 그래픽 프로세서 코어(219)의 저전력 또는 유휴 상태를 용이하게 하여, 저전력 상태 전이에 걸쳐 운영 체제 및/또는 운영 체제의 그래픽 드라이버 소프트웨어와는 독립적으로 그래픽 프로세서 코어(219)가 그래픽 프로세서 코어(219) 내의 레지스터를 저장 및 복원하는 능력을 갖도록 한다.
그래픽 프로세서 코어(219)는 도시된 서브-코어(221A-221F)보다 최대 N개까지 많거나 적은 모듈식 서브-코어를 가질 수 있다. N개의 서브-코어의 각각의 세트에 있어서, 그래픽 프로세서 코어(219)는 또한 공유 기능 로직(235), 공유 및/또는 캐시 메모리(236), 기하/고정 기능 파이프라인(237), 및 다양한 그래픽을 가속시키고 프로세싱 동작을 컴퓨팅하는 추가의 고정 기능 로직(238)을 포함할 수 있다. 공유 기능 로직(235)은 그래픽 프로세서 코어(219) 내의 N개의 서브-코어 각각에 의해 공유될 수 있는 도 4의 공유 기능 로직(420)과 관련된 로직 유닛(예를 들어, 샘플러, 산술 및/또는 스레드 간 통신 로직)을 포함할 수 있다. 공유 및/또는 캐시 메모리(236)는 그래픽 프로세서 코어(219) 내의 N개의 서브-코어(221A-221F)의 세트에 대한 LLC일 수 있으며, 복수의 서브-코어에 의해 액세스 가능한 공유 메모리로서 동작할 수도 있다. 기하/고정 기능 파이프라인(237)은 고정 기능 블록(230) 내의 기하/고정 기능 파이프라인(231) 대신에 포함될 수 있고 동일하거나 또는 유사한 로직 유닛을 포함할 수 있다.
일 실시예에서, 그래픽 프로세서 코어(219)는 그래픽 프로세서 코어(219)에 의해 사용되는 다양한 고정 기능 가속 로직을 포함할 수 있는 추가의 고정 기능 로직(238)을 포함한다. 일 실시예에서, 추가의 고정 기능 로직(238)은 위치 전용 셰이딩에서만 사용되는 추가의 기하 파이프라인을 포함한다. 위치 전용 셰이딩에는 2개의 기하 파이프라인, 즉, 기하/고정 기능 파이프라인(238, 231) 내의 풀(full) 기하 파이프라인 및 추가의 고정 기능 로직(238) 내에 포함될 수 있는 추가의 기하 파이프라인인 컬(cull) 파이프라인이 존재한다. 일 실시예에서 컬 파이프라인은 풀 기하 파이프라인의 축소 버전이다. 풀 파이프라인과 컬 파이프라인은 동일한 애플리케이션의 다른 인스턴스를 실행할 수 있으며 각 인스턴스는 별개의 컨텍스트를 갖는다. 위치 전용 셰이딩은 폐기된 삼각형의 긴 컬 구간(long cull runs)을 숨길 수 있어서, 일부 인스턴스에서 더 빨리 셰이딩이 완료되도록 할 수 있다. 예를 들어, 일 실시예에서, 컬 파이프라인은 정점의 위치 속성만을 페칭(fetch) 및 셰이딩(shade)하고, 프레임 버퍼에 대한 픽셀의 렌더링 및 래스터화를 수행하지 않으므로, 추가의 고정 기능 로직(238) 내의 컬 파이프라인 로직은 메인 애플리케이션과 병렬로 위치 셰이더를 실행할 수 있고, 일반적으로 풀 파이프라인보다 중요한 결과를 더 빠르게 생성한다. 컬 파이프라인은 생성된 중요한 결과를 사용하여 해당 삼각형이 컬링되는지 여부에 관계없이 모든 삼각형에 대한 가시성 정보를 계산할 수 있다. 풀 파이프라인(이 경우 재생 파이프라인이라고도 불릴 수 있음)은 가시성 정보를 사용하여 컬링된 삼각형을 생략하고 최종적으로 래스터화 단계로 전달된 가시적 삼각형만을 셰이딩할 수 있다.
일 실시예에서, 추가의 고정 기능 로직(238)은 머신 학습 훈련 또는 추론을 위한 최적화를 포함하는 구현을 위해 고정 기능 매트릭스 곱셈 로직과 같은 머신-학습 가속 로직을 포함할 수 있다.
각각의 그래픽 서브-코어(221A-221F)는 내부에 그래픽 파이프라인, 미디어 파이프라인, 또는 셰이더 프로그램에 의한 요청에 응답하여 그래픽, 미디어 및 컴퓨팅 동작을 수행하는데 사용될 수 있는 실행 리소스 세트를 포함한다. 그래픽 서브-코어(221A-221F)는 복수의 EU 어레이(222A-222F, 224A-224F), 스레드 디스패치 및 스레드 간 통신(TD/IC) 로직(223A-223F), 3D(예를 들어, 텍스처) 샘플러(225A-225F), 미디어 샘플러(206A-206F), 셰이더 프로세서(227A-227F) 및 공유 로컬 메모리(SLM)(228A-228F)를 포함한다. EU 어레이(222A-222F, 224A-224F) 각각은 복수의 실행 유닛을 포함하는데, 이들은 그래픽, 미디어 또는 컴퓨팅 셰이더 프로그램을 포함하는 그래픽, 미디어 또는 컴퓨팅 동작의 제공 중에 부동 소수점 및 정수/고정 소수점 로직 연산을 수행할 수 있는 범용 그래픽 프로세싱 유닛이다. TD/IC 로직(223A-223F)은 서브-코어 내의 실행 유닛에 대한 로컬 스레드 디스패치 및 스레드 제어 동작을 수행하고, 서브-코어의 실행 유닛 상에서 실행되는 스레드 사이의 통신을 용이하게 한다. 3D 샘플러(225A-225F)는 텍스처 또는 다른 3D 그래픽 관련 데이터를 메모리로 판독할 수 있다. 3D 샘플러는 구성된 샘플 상태 및 주어진 텍스처와 관련된 텍스처 포맷에 따라 텍스처 데이터를 다르게 판독할 수 있다. 미디어 샘플러(206A-206F)는 미디어 데이터와 관련된 타입 및 포맷에 따라 유사한 판독 동작을 수행할 수 있다. 일 실시예에서, 각각의 그래픽 서브-코어(221A-221F)는 통합된 3D 및 미디어 샘플러를 교대로 포함할 수 있다. 각각의 서브-코어(221A-221F) 내의 실행 유닛 상에서 실행되는 스레드는 각각의 서브-코어 내의 공유 로컬 메모리(228A-228F)를 사용하여, 스레드 그룹 내에서 실행되는 스레드가 온 칩 메모리의 공통의 풀(pool)을 사용하여 실행될 수 있도록 한다.
도 2c는 멀티-코어 그룹(240A-240N)으로 배열된 그래픽 프로세싱 리소스의 전용 세트를 포함하는 그래픽 프로세싱 유닛(GPU)(239)을 도시한다. 단일 멀티-코어 그룹(240A)의 세부 사항만이 제공되지만, 다른 멀티-코어 그룹(240B-240N)은 동일 또는 유사한 그래픽 프로세싱 리소스의 세트를 구비할 수 있음을 이해할 것이다.
도시된 것과 같이, 멀티-코어 그룹(240A)은 그래픽 코어 세트(243), 텐서(tensor) 코어 세트(244) 및 광선 추적 코어 세트(245)를 포함할 수 있다. 스케줄러/디스패처(241)는 다양한 코어(243, 244, 245) 상에서 실행을 위해 그래픽 스레드를 스케줄링하고 디스패치한다. 레지스터 파일 세트(242)는 그래픽 스레드를 실행할 때 코어(243, 244, 245)에 의해 사용되는 피연산자 값을 저장한다. 이들은, 예를 들어 정수 값을 저장하는 정수 레지스터, 부동 소수점 값을 저장하는 부동 소수점 레지스터, 패킹된 데이터 요소(정수 및/또는 부동 소수점 데이터 요소)를 저장하는 벡터 레지스터 및 텐서/매트릭스 값을 저장하는 타일 레지스터를 포함할 수 있다. 일 실시예에서, 타일 레지스터는 벡터 레지스터의 결합된 세트로서 구현된다.
하나 이상의 결합된 레벨 1(L1) 캐시 및 공유 메모리 유닛(247)은 각각의 멀티-코어 그룹(240A) 내에 국부적으로 텍스쳐 데이터, 정점(vertex) 데이터, 픽셀 데이터, 광선 데이터, 경계 볼륨 데이터 등과 같은 그래픽 데이터를 저장한다. 하나 이상의 텍스처 유닛(247)은 또한 텍스처 매핑 및 샘플링과 같은 텍스처링 동작을 수행하기 위해 사용될 수 있다. 멀티-코어 그룹(240A-240N)의 전부 또는 일부에 의해 공유되는 레벨 2(L2) 캐시(253)는 복수의 동시 그래픽 스레드에 대한 그래픽 데이터 및/또는 명령어를 저장한다. 도시된 것과 같이, L2 캐시(253)는 복수의 멀티-코어 그룹(240A-240N)에 걸쳐 공유될 수 있다. 하나 이상의 메모리 제어기(248)는 GPU(239)를 시스템 메모리(예를 들어, DRAM) 및/또는 전용 그래픽 메모리(예를 들어, GDDR6 메모리)일 수 있는 메모리(249)에 연결한다.
입력/출력(I/O) 회로(250)는 GPU(239)를 디지털 신호 프로세서(DSP), 네트워크 제어기 또는 사용자 입력 장치와 같은 하나 이상의 I/O 장치(252)에 연결한다. 온 칩 상호 접속부는 I/O 장치(252)를 GPU(239) 및 메모리(249)에 연결하는데 사용될 수 있다. I/O 회로(250)의 하나 이상의 I/O 메모리 관리 유닛(IOMMU)(251)은 I/O 장치(252)를 시스템 메모리(249)에 직접 연결한다. 일 실시예에서, IOMMU(251)는 가상 주소를 시스템 메모리(249)의 물리 주소에 매핑하기 위해 페이지 테이블의 복수의 세트를 관리한다. 이 실시예에서, I/O 장치(252), CPU(들)(246), GPU(들)(239)는 동일한 가상 주소 공간을 공유할 수 있다.
일 구현예에서, IOMMU(251)는 가상화를 지원한다. 이 경우, 게스트/그래픽 가상 주소를 게스트/그래픽 물리 주소에 매핑하기 위해 페이지 테이블의 제 1 세트를 관리하고, 게스트/그래픽 물리 주소를(시스템 메모리(249) 내의) 시스템/호스트 물리 주소에 매핑하기 위해 페이지 테이블의 제 2 세트를 관리할 수 있다. 페이지 테이블의 제 1 및 제 2 세트 각각의 기본 주소는 제어 레지스터에 저장될 수 있고, 컨텍스트 스위치 상에서 교환(swapped out)될 수 있다(예를 들어, 새로운 컨텍스트가 페이지 테이블의 관련된 세트에 대해 액세스할 수 있다). 도 2c에 도시되지 않았지만, 각각의 코어(243, 244, 245) 및/또는 멀티-코어 그룹(240A-240N)은 게스트 가상으로부터 게스트 물리로의 변환, 게스트 물리로부터 호스트 물리로의 변환 및 게스트 가상으로부터 호스트 물리로의 변환을 캐싱하기 위한 TLB(translation lookaside buffer)를 포함할 수 있다.
일 실시예에서, CPU(246), GPU(239) 및 I/O 장치(252)는 단일 반도체 칩 및/또는 칩 패키지 상에 통합된다. 도시된 메모리(249)는 동일한 칩 상에 통합될 수 있거나 또는 오프 칩 인터페이스를 통해 메모리 제어기(248)에 연결될 수 있다. 일 구현예에서, 메모리(249)는 다른 물리 시스템-레벨 메모리와 동일한 가상 주소 공간을 공유하는 GDDR6 메모리를 포함하지만, 본 발명의 기본 원리는 이러한 특정 구현예로 한정되지 않는다.
일 실시예에서, 텐서 코어(244)는 매트릭스 연산을 수행하도록 특별히 설계된 복수의 실행 유닛을 포함하는데, 이는 딥 러닝(deep learning) 동작을 수행하는데 사용되는 기본 컴퓨팅 동작이다. 예를 들어, 동시 매트릭스 곱셈 동작은 신경망 훈련 및 추론에 사용될 수 있다. 텐서 코어(244)는 단-정밀도(single precision) 부동 소수점(예를 들어, 32 비트), 반정밀도(half-precision) 부동 소수점(예를 들어, 16 비트), 정수 워드(16 비트), 바이트(8 비트) 및 반-바이트(4 비트)를 포함하는 다양한 피연산자 정밀도를 사용하여 매트릭스 프로세싱을 수행할 수 있다. 일 실시예에서, 신경망 구현예는 각각의 렌더링된 장면의 특징을 추출하여, 잠재적으로는 복수의 프레임으로부터의 세부 사항을 결합하여, 고품질의 최종 이미지를 구성한다.
딥 러닝 구현예에서, 병렬 매트릭스 곱셈 작업은 텐서 코어(244) 상에서 실행되도록 스케줄링될 수 있다. 특히 신경망의 훈련은 상당한 수의 매트릭스 내적(dot product) 연산을 필요로 한다. 텐서 코어(244)는, N x N x N 매트릭스 곱셈의 내적 공식(formulation)을 처리하기 위해 적어도 N개의 내적 프로세싱 요소를 포함할 수 있다. 매트릭스의 곱셈을 시작하기 전에 하나의 전체 매트릭스가 타일 레지스터에 로딩되고, 두 번째 매트릭스의 적어도 하나의 열이 N개의 주기 동안 각 주기마다 로딩된다. 각 주기마다 N개의 내적이 프로세싱된다.
매트릭스 요소는 16 비트 워드, 8 비트 바이트(예를 들어, INT8) 및 4 비트 반 바이트(예를 들어, INT4)를 포함하는, 특정 구현예에 따른 상이한 정밀도로 저장될 수 있다. 텐서 코어(244)에 대해 상이한 정밀도 모드가 특정되어 상이한 워크로드(예를 들어, 바이트 및 반-바이트로의 양자화를 허용할 수 있는 추론 워크로드와 같은)에 대해 가장 효율적인 정밀도가 사용되도록 보장할 수 있다.
일 실시예에서, 광선 추적 코어(245)는 실시간 광선 추적 및 비실시간 광선 추적 구현예 모두에 대한 광선 추적 동작을 가속화한다. 특히, 광선 추적 코어(245)는 경계 볼륨 계층 구조(BVH)를 사용하여 광선 탐색을 수행하고 BVH 볼륨 내에 둘러싸인 광선과 프리미티브(primitive) 사이의 교차를 식별하는 광선 탐색/교차 회로를 포함한다. 광선 추적 코어(245)는 또한(예를 들어, Z 버퍼 또는 유사한 배열을 사용하여) 깊이(depth) 테스트 및 컬링을 수행하는 회로를 포함할 수 있다. 일 구현예에서, 광선 추적 코어(245)는 본 명세서에서 설명된 이미지 노이즈 제거 기법과 협력하여 탐색 및 교차 동작을 수행하며, 그 중 적어도 일부는 텐서 코어(244) 상에서 실행될 수 있다. 예를 들어, 일 실시예에서, 텐서 코어(244)는 딥 러닝 신경망을 구현하여 광선 추적 코어(245)에 의해 생성된 프레임의 노이즈 제거를 수행한다. 그러나, CPU(들)(246), 그래픽 코어(243) 및/또는 광선 추적 코어(245)는 또한 노이즈 제거 및/또는 딥 러닝 알고리즘의 전체 또는 일부를 구현할 수 있다.
또한, 전술한 것과 같이, GPU(239)가 네트워크 또는 고속 상호 접속부를 통해 다른 컴퓨팅 장치에 연결된 컴퓨팅 장치에 존재하는 경우 노이즈 제거에 대한 분산된 접근법이 사용될 수 있다. 이 실시예에서, 상호 접속된 컴퓨팅 장치는 신경망 학습/훈련 데이터를 공유하여 전체 시스템이 상이한 타입의 이미지 프레임 및/또는 상이한 그래픽 애플리케이션에 대해 노이즈 제거를 수행하는 것을 학습하는 속도를 향상시킨다.
일 실시예에서, 광선 추적 코어(245)는 모든 BVH 탐색 및 광선-프리미티브 교차를 프로세싱하여 그래픽 코어(243)가 광선 당 수천 개의 명령어로 과부하되는 것을 방지한다. 일 실시예에서, 각각의 광선 추적 코어(245)는(예를 들어, 탐색 동작을 위한) 경계 박스 테스트를 수행하는 특수 회로의 제 1 세트와, 광선-삼각형 교차 테스트(예를 들어, 탐색된 광선을 교차시킴)를 수행하는 특수 회로의 제 2 세트를 포함한다. 따라서, 일 실시예에서, 멀티-코어 그룹(240A)은 단순히 광선 프로브를 발사할 수 있고, 광선 추적 코어(245)는 독립적으로 광선 탐색 및 교차를 수행하고 히트(hit) 데이터(예를 들어, 히트, 히트 없음, 복수 히트 등)를 스레드 컨텍스트에 반환한다. 광선 추적 코어(245)가 탐색 및 교차 동작을 수행하는 동안 다른 코어(243, 244)는 다른 그래픽을 수행하거나 또는 작업을 컴퓨팅하기 위해 자유로운 상태가 된다.
일 실시예에서, 각각의 광선 추적 코어(245)는 BVH 테스트 동작을 수행하는 탐색 유닛 및 광선-프리미티브 교차 테스트를 수행하는 교차 유닛을 포함한다. 교차 유닛은 "히트", "히트 없음" 또는 "복수 히트" 응답을 생성하여 적절한 스레드에 제공한다. 탐색 및 교차 동작 동안, 다른 코어(예를 들어, 그래픽 코어(243) 및 텐서 코어(244))의 실행 리소스는 다른 형태의 그래픽 작업을 수행하기 위해 자유로운 상태가 된다.
후술되는 하나의 특정 실시예에서, 작업이 그래픽 코어(243)와 광선 추적 코어(245) 사이에 분산되는 하이브리드 래스터화/광선 추적 접근법이 사용된다.
일 실시예에서, 광선 추적 코어(245)(및/또는 다른 코어(243, 244))는 광선-생성, 최근접 히트, 임의의 히트 및 비교차(miss) 셰이더뿐만 아니라 DispatchRays 커맨드를 포함하는 Microsoft의 DXR(DirectX Ray Tracing)과 같은 광선 추적 명령어 세트에 대한 하드웨어 지원을 포함하고, 이로써 각각의 객체에 대해 셰이더 및 텍스처의 고유 세트를 할당할 수 있다. 광선 추적 코어(245), 그래픽 코어(243) 및 텐서 코어(244)에 의해 지원될 수 있는 다른 광선 추적 플랫폼으로는 Vulkan 1.1.85가 있다. 그러나, 본 발명의 기본 원리는 임의의 특정 광선 추적 ISA로 한정되지 않는다는 점에 유의해야 한다.
일반적으로, 다양한 코어(245, 244, 243)는 광선 생성, 최근접 히트, 임의의 히트, 광선-프리미티브 교차, 프리미티브 당 및 계층 구조적 경계 박스 구성, 비교차, 방문 및 예외에 대한 명령어/기능을 포함하는 광선 추적 명령어 세트를 지원할 수 있다. 보다 구체적으로, 일 실시예는 다음 기능을 수행하는 광선 추적 명령어를 포함한다:
광선 생성 - 광선 생성 명령어는 각 픽셀, 샘플 또는 다른 사용자 정의 작업 할당에 대해 실행될 수 있다.
최근접 히트 - 최근접 히트 명령어는 장면 내에서 광선과 프리미티브의 최근접 교차점을 찾기 위해 실행될 수 있다.
임의의 히트 - 임의의 히트 명령어는 잠재적으로 새로운 최근접 교차점을 식별하기 위해 장면 내에서 광선과 프리미티브 사이의 복수의 교차를 식별한다.
교차 - 교차 명령어는 광선-프리미티브 교차 테스트를 수행하고 결과를 출력한다.
프리미티브 당 경계 박스 구성 - 이 명령어는 주어진 프리미티브 또는 프리미티브 그룹 주위에 경계 박스를 형성한다(예를 들어, 새로운 BVH 또는 다른 가속도 데이터 구조를 형성할 때).
비교차(Miss) - 이것은 광선이 장면 내의 모든 기하 또는 장면의 특정 영역과 교차하지 않는 것을 나타낸다.
방문 - 이것은 광선이 탐색할 자식 볼륨(children volume)을 나타낸다.
예외 - 이것은 다양한 타입의 예외 핸들러(예를 들어, 다양한 오류 조건에 대해 호출됨)를 포함한다.
도 2d는 본 명세서에 설명된 실시예에 따른, 그래픽 프로세서 및/또는 컴퓨팅 가속기로서 구성될 수 있는 범용 그래픽 프로세싱 유닛(GPGPU)(270)의 블록도이다. GPGPU(270)는 하나 이상의 시스템 및/또는 메모리 버스를 통해 호스트 프로세서(예를 들어, 하나 이상의 CPU(246)) 및 메모리(271, 272)와 상호 접속될 수 있다. 일 실시예에서, 메모리(271)는 하나 이상의 CPU(들)(246)와 공유될 수 있는 시스템 메모리인 반면, 메모리(272)는 GPGPU(270)에 전용인 장치 메모리이다. 일 실시예에서, GPGPU(270) 및 장치 메모리(272) 내의 컴포넌트는 하나 이상의 CPU(들)(246)에 액세스할 수 있는 메모리 주소에 매핑될 수 있다. 메모리(271, 272)로의 액세스는 메모리 제어기(268)를 통해 용이해질 수 있다. 일 실시예에서, 메모리 제어기(268)는 내부 DMA(direct memory access) 제어기(269)를 포함하거나, 또는 DMA 제어기에 의해 수행될 동작을 수행하기 위한 로직을 포함할 수 있다.
GPGPU(270)는 L2 캐시(253), L1 캐시(254), 명령어 캐시(255)를 포함하는 복수의 캐시 메모리와, 공유 메모리(256)를 포함하며, 공유 메모리의 적어도 일부는 또한 캐시 메모리로서 분할될 수 있다. GPGPU(270)는 또한 복수의 컴퓨팅 유닛(260A-260N)을 포함한다. 각각의 컴퓨팅 유닛(260A-260N)은 벡터 레지스터(261), 스칼라 레지스터(262), 벡터 로직 유닛(263) 및 스칼라 로직 유닛(264)의 세트를 포함한다. 컴퓨팅 유닛(260A-260N)은 또한 로컬 공유 메모리(265) 및 프로그램 카운터(266)를 포함할 수 있다. 컴퓨팅 유닛(260A-260N)은 상수 캐시(267)와 연결될 수 있으며, 상수 캐시는 상수 데이터를 저장하는데 사용될 수 있으며, 상수 데이터는 GPGPU(270) 상에서 실행되는 커널 또는 셰이더 프로그램의 실행 동안 변경되지 않는 데이터이다. 일 실시예에서, 상수 캐시(267)는 스칼라 데이터 캐시이고 캐싱된 데이터는 스칼라 레지스터(262)로 직접 페치(fetch)될 수 있다.
동작하는 동안, 하나 이상의 CPU(들)(246)는 액세스 가능한 주소 공간으로 매핑된 GPGPU(270)의 레지스터 또는 메모리에 커맨드를 기록할 수 있다. 커맨드 프로세서(257)는 레지스터 또는 메모리로부터 커맨드를 판독하고 그 커맨드가 GPGPU(270) 내에서 어떻게 처리될지를 결정할 수 있다. 이후 스레드 디스패처(258)는 스레드를 컴퓨팅 유닛(260A-260N)에 디스패치하여 이들 커맨드를 수행하는데 이용될 수 있다. 각각의 컴퓨팅 유닛(260A-260N)은 다른 컴퓨팅 유닛으로부터 독립적으로 스레드를 실행할 수 있다. 또한, 각각의 컴퓨팅 유닛(260A-260N)은 조건부 계산이 가능하도록 독립적으로 구성될 수 있고 계산 결과를 조건부로 메모리에 출력할 수 있다. 커맨드 프로세서(257)는 제출된 커맨드가 완료될 때 하나 이상의 CPU(246)를 인터럽트할 수 있다.
도 3a 내지 도 3c는 본 명세서에 설명된 실시예에 의해 제공되는 추가 그래픽 프로세서 및 컴퓨팅 가속기 아키텍처의 블록도를 도시한다. 본 명세서에서 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 3a 내지 3c의 요소는 본 명세서의 다른 곳에서 설명된 것과 유사한 방식으로 동작 또는 기능할 수 있지만, 이에 한정되는 것은 아니다.
도 3a는, 개별 그래픽 프로세싱 유닛일 수 있거나, 또는 복수의 프로세싱 코어 또는 메모리 장치나 네트워크 인터페이스와 같지만 이에 한정되지 않는 다른 반도체 장치와 통합된 그래픽 프로세서일 수 있는 그래픽 프로세서(300)의 블록도이다. 일부 실시예에서, 그래픽 프로세서는 메모리 매핑된 I/O 인터페이스를 통해 그래픽 프로세서 상의 레지스터와 프로세서 메모리에 위치된 커맨드로 통신한다. 일부 실시예에서, 그래픽 프로세서(300)는 메모리에 액세스하는 메모리 인터페이스(314)를 포함한다. 메모리 인터페이스(314)는 로컬 메모리, 하나 이상의 내부 캐시, 하나 이상의 공유 외부 캐시 및/또는 시스템 메모리에 대한 인터페이스일 수 있다.
일부 실시예에서, 그래픽 프로세서(300)는 또한 디스플레이 출력 데이터를 디스플레이 장치(318)로 구동하는 디스플레이 제어기(302)를 포함한다. 디스플레이 제어기(302)는 디스플레이를 위한 하나 이상의 오버레이 평면 및 비디오의 복수 레이어 또는 사용자 인터페이스 요소의 구성을 위한 하드웨어를 포함한다. 디스플레이 장치(318)는 내부 또는 외부 디스플레이 장치일 수 있다. 일 실시예에서, 디스플레이 장치(318)는 가상 현실(VR) 디스플레이 장치 또는 증강 현실(AR) 디스플레이 장치와 같은 헤드 마운트 디스플레이 장치이다. 일부 실시예에서, 그래픽 프로세서(300)는 MPEG-2와 같은 MPEG(Moving Picture Experts Group) 포맷, H.264/MPEG-4 AVC, H.265/HEVC, AOMedia(Alliance for Open Media) VP8, VP9 및 SMPTE(Society of Motion Picture & Television Engineers) 421M/VC-1와 같은 AVC(Advanced Video Coding) 포맷 및 JPEG(Joint Photographic Experts Group) 및 MJPEG(Motion JPEG) 포맷과 같은 JPEG 포맷을 포함하지만 이에 한정되지 않는, 하나 이상의 미디어 인코딩 포맷으로, 그 포맷으로부터 또는 그 포맷 사이에서 미디어를 인코딩, 디코딩 또는 트랜스코딩하는 비디오 코덱 엔진(306)을 포함한다.
일부 실시예에서, 그래픽 프로세서(300)는, 예를 들어 비트-경계 블록 전송을 포함하는 2차원(2D) 래스터화 동작을 수행하는 블록 이미지 전송(BLIT) 엔진(304)을 포함한다. 그러나, 일 실시예에서, 2D 그래픽 동작은 그래픽 프로세싱 엔진(GPE)(310)의 하나 이상의 컴포넌트를 사용하여 수행된다. 일부 실시예에서, GPE(310)는 3차원(3D) 그래픽 동작 및 미디어 동작을 포함하는 그래픽 동작을 수행하는 컴퓨팅 엔진이다.
일부 실시예에서, GPE(310)는 3D 프리미티브 형상(예를 들어, 직사각형, 삼각형 등)에 작용하는 프로세싱 기능을 사용하여 3차원 이미지 및 장면을 렌더링하는 것과 같은 3D 동작을 수행하는 3D 파이프라인(312)을 포함한다. 3D 파이프라인(312)은 요소 내에서 다양한 태스크를 수행하고/하거나 3D/미디어 서브-시스템(315)에 실행 스레드를 생성하는, 프로그램 가능하고 고정된 기능 요소를 포함한다. 3D 파이프라인(312)은 미디어 동작을 수행하기 위해 사용될 수 있지만, GPE(310)의 실시예는 또한, 비디오 사후-프로세싱 및 이미지 향상과 같은 미디어 동작을 수행하는데 특히 사용되는 미디어 파이프라인(316)을 포함한다.
일부 실시예에서, 미디어 파이프라인(316)은 비디오 코덱 엔진(306) 대신 또는 비디오 코덱 엔진(306)을 위해 비디오 디코딩 가속, 비디오 디인터레이싱 및 비디오 인코딩 가속과 같은 하나 이상의 특수 미디어 동작을 수행하는 고정된 기능 또는 프로그램 가능한 로직 유닛을 포함한다. 일부 실시예에서, 미디어 파이프라인(316)은 3D/미디어 서브-시스템(315) 상에서 실행되는 스레드를 생성하는 스레드 생성 유닛을 추가로 포함한다. 생성된 스레드는 3D/미디어 서브-시스템(315)에 포함된 하나 이상의 그래픽 실행 유닛 상에서 미디어 동작에 대한 계산을 수행한다.
일부 실시예에서, 3D/미디어 서브-시스템(315)은 3D 파이프라인(312) 및 미디어 파이프라인(316)에 의해 생성된 스레드를 실행하는 로직을 포함한다. 일 실시예에서, 파이프라인은 스레드 실행 요청을 3D/미디어 서브-시스템(315)에 전송하고, 3D/미디어 서브-시스템은 사용 가능한 스레드 실행 리소스에 대한 다양한 요청을 중재 및 발송하는 스레드 디스패치 로직을 포함한다. 실행 리소스는 3D 및 미디어 스레드를 프로세싱하는 그래픽 실행 유닛의 어레이를 포함한다. 일부 실시예에서, 3D/미디어 서브-시스템(315)은 스레드 명령어 및 데이터를 위한 하나 이상의 내부 캐시를 포함한다. 일부 실시예에서, 서브-시스템은 또한 스레드 사이에서 데이터를 공유하고 출력 데이터를 저장하는 레지스터 및 어드레서블(addressable) 메모리를 포함하는 공유 메모리를 포함한다.
도 3b는 본 명세서에서 설명된 실시예에 따른, 타일형 아키텍처를 갖는 그래픽 프로세서(320)를 도시한다. 일 실시예에서, 그래픽 프로세서(320)는 그래픽 엔진 타일(310A-310D) 내에 도 3a의 그래픽 프로세싱 엔진(310)의 복수의 인스턴스를 갖는 그래픽 프로세싱 엔진 클러스터(322)를 포함한다. 각각의 그래픽 엔진 타일(310A-310D)은 타일 상호 접속부 세트(323A-323F)를 통해 상호 접속될 수 있다. 각각의 그래픽 엔진 타일(310A-310D)은 또한 메모리 상호 접속부(325A-325D)를 통해 메모리 모듈 또는 메모리 장치(326A-326D)에 연결될 수 있다. 메모리 장치(326A-326D)는 임의의 그래픽 메모리 기술을 사용할 수 있다. 예를 들어, 메모리 장치(326A-326D)는 GDDR 메모리일 수 있다. 일 실시예에서, 메모리 장치(326A-326D)는 각각의 그래픽 엔진 타일(310A-310D)과 함께 온 다이(on-die) 형식일 수 있는 고대역폭 메모리(HBM) 모듈이다. 일 실시예에서, 메모리 장치(326A-326D)는 각각의 그래픽 엔진 타일(310A-310D) 위에 적층될 수 있는 적층 메모리 장치이다. 일 실시예에서, 각각의 그래픽 엔진 타일(310A-310D) 및 관련 메모리(326A-326D)는 도 11b 내지 도 11d에서 더 상세히 설명되는 것과 같이, 베이스 다이 또는 베이스 기판에 본딩된 개별 칩렛(chiplet) 상에 위치한다.
그래픽 프로세싱 엔진 클러스터(322)는 온-칩 또는 온-패키지 패브릭 상호 접속부(324)와 접속할 수 있다. 패브릭 상호 접속부(324)는 그래픽 엔진 타일(310A-310D)과 비디오 코덱(306) 및 하나 이상의 카피 엔진(304)과 같은 컴포넌트 사이의 통신을 가능하게 할 수 있다. 카피 엔진(304)은 메모리 장치(326A-326D)와 그래픽 프로세서(320)의 외부에 있는 메모리(예를 들어, 시스템 메모리)로부터, 이들로, 또는 이들 사이에서 데이터를 이동시키기 위해 사용될 수 있다. 패브릭 상호 접속부(324)는 또한 그래픽 엔진 타일(310A-310D)을 상호 접속하는데 사용될 수 있다. 그래픽 프로세서(320)는 외부 디스플레이 장치(318)와의 접속을 가능하게 하는 디스플레이 제어기(302)를 선택적으로 포함할 수 있다. 그래픽 프로세서는 또한 그래픽 또는 컴퓨팅 가속기로서 구성될 수 있다. 가속기 구성에서, 디스플레이 제어기(302) 및 디스플레이 장치(318)는 생략될 수 있다.
그래픽 프로세서(320)는 호스트 인터페이스(328)를 통해 호스트 시스템에 접속될 수 있다. 호스트 인터페이스(328)는 그래픽 프로세서(320), 시스템 메모리 및/또는 다른 시스템 컴포넌트 사이의 통신을 가능하게 할 수 있다. 호스트 인터페이스(328)는, 예를 들어 PCI 익스프레스 버스 또는 호스트 시스템 인터페이스의 다른 타입일 수 있다.
도 3c는 본 명세서에서 설명된 실시예에 따른 컴퓨팅 가속기(330)를 도시한다. 컴퓨팅 가속기(330)는 도 3b의 그래픽 프로세서(320)와 구조적 유사성을 가질 수 있고 컴퓨팅 가속에 최적화되어 있다. 컴퓨팅 엔진 클러스터(332)는 병렬 또는 벡터 기반 범용 컴퓨팅 동작에 최적화된 실행 로직을 포함하는 컴퓨팅 엔진 타일 세트(340A-340D)를 포함할 수 있다. 일 실시예에서 하나 이상의 컴퓨팅 엔진 타일(340A-340D)은 미디어 가속을 수행하는 로직을 포함할 수 있지만, 일부 실시예에서, 컴퓨팅 엔진 타일(340A-340D)은 고정 기능 그래픽 프로세싱 로직을 포함하지 않는다. 컴퓨팅 엔진 타일(340A-340D)은 메모리 상호 접속부(325A-325D)를 통해 메모리(326A-326D)에 접속할 수 있다. 메모리(326A-326D) 및 메모리 상호 접속부(325A-325D)는 그래픽 프로세서(320)에서와 같이 유사한 기술일 수 있거나 또는 상이할 수 있다. 그래픽 컴퓨팅 엔진 타일(340A-340D)은 또한 타일 상호 접속부 세트(323A-323F)를 통해 상호 접속될 수 있고 패브릭 상호 접속부(324)에 접속될 수 있고 및/또는 패브릭 상호 접속부(324)에 의해 상호 접속될 수 있다. 일 실시예에서, 컴퓨팅 가속기(330)는 장치 전체의 캐시로 구성될 수 있는 큰 L3 캐시(336)를 포함한다. 컴퓨팅 가속기(330)는 또한 도 3b의 그래픽 프로세서(320)와 유사한 방식으로 호스트 인터페이스(328)를 통해 호스트 프로세서 및 메모리에 접속될 수 있다.
그래픽 프로세싱 엔진
도 4는 일부 실시예에 따른 그래픽 프로세서의 그래픽 프로세싱 엔진(410)의 블록도이다. 일 실시예에서, 그래픽 프로세싱 엔진(GPE)(410)은 도 3a에 도시된 GPE(310)의 버전이고, 또한 도 3b의 그래픽 엔진 타일(310A-310D)을 나타낼 수도 있다. 본 명세서에서 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 4의 요소는 본 명세서의 다른 곳에 설명된 것과 유사한 방식으로 동작 또는 기능할 수 있지만, 이에 한정되는 것은 아니다. 예를 들어, 도 3a의 3D 파이프라인(312) 및 미디어 파이프라인(316)이 도시되어 있다. 미디어 파이프라인(316)은 GPE(410)의 일부 실시예에서 선택적이고, GPE(410) 내에 명시적으로 포함되지 않을 수 있다. 예를 들어, 적어도 하나의 실시예에서, 별도의 미디어 및/또는 이미지 프로세서가 GPE(410)에 연결된다.
일부 실시예에서, GPE(410)는 3D 파이프라인(312) 및/또는 미디어 파이프라인(316)에 커맨드 스트림을 제공하는 커맨드 스트리머(403)에 연결되거나, 이를 포함한다. 일부 실시예에서, 커맨드 스트리머(403)는 메모리에 연결되는데, 이 메모리는 시스템 메모리 또는 하나 이상의 내부 캐시 메모리 및 공유 캐시 메모리일 수 있다. 일부 실시예에서, 커맨드 스트리머(403)는 메모리로부터 커맨드를 수신하고 그 커맨드를 3D 파이프라인(312) 및/또는 미디어 파이프라인(316)으로 전송한다. 커맨드는 링 버퍼로부터 페치된 지시(directive)이며, 링 버퍼는 3D 파이프라인(312) 및 미디어 파이프라인(316)에 대한 커맨드를 저장한다. 일 실시예에서, 링 버퍼는 복수의 커맨드의 배치(batch)를 저장하는 배치 커맨드 버퍼를 추가로 포함할 수 있다. 3D 파이프라인(312)에 대한 커맨드는 또한 3D 파이프라인(312)에 대한 정점 및 기하 데이터 및/또는 미디어 파이프라인(316)에 대한 이미지 데이터 및 메모리 객체와 같지만 이에 한정되지 않는, 메모리에 저장된 데이터에 대한 참조를 포함할 수 있다. 3D 파이프라인(312)과 미디어 파이프라인(316)은 각각의 파이프라인 내에서 로직을 통해 동작을 수행하거나 또는 하나 이상의 실행 스레드를 그래픽 코어 어레이(414)에 디스패치함으로써 커맨드 및 데이터를 프로세싱한다. 일 실시예에서 그래픽 코어 어레이(414)는 그래픽 코어(예를 들어, 그래픽 코어(들)(415A), 그래픽 코어(들)(415B))의 하나 이상의 블록을 포함하고, 각각의 블록은 하나 이상의 그래픽 코어를 포함한다. 각각의 그래픽 코어는 그래픽 및 컴퓨팅 동작을 수행하는 범용 및 그래픽용 실행 로직 뿐 아니라, 고정 기능 텍스처 프로세싱 및/또는 머신 학습 및 인공 지능 가속 로직을 포함하는 그래픽 실행 리소스 세트를 포함한다.
다양한 실시예에서, 3D 파이프라인(312)은 명령어를 프로세싱하고 그래픽 코어 어레이(414)에 실행 스레드를 디스패칭함으로써 정점 셰이더, 기하 셰이더, 픽셀 셰이더, 프래그먼트 셰이더, 컴퓨팅 셰이더 또는 다른 셰이더 프로그램과 같은 하나 이상의 셰이더 프로그램을 프로세싱하는 고정 기능 및 프로그램 가능한 로직을 포함할 수 있다. 그래픽 코어 어레이(414)는 이들 셰이더 프로그램을 프로세싱하는데 사용되는 실행 리소스의 통합 블록을 제공한다. 그래픽 코어 어레이(414)의 그래픽 코어(들)(415A, 415B) 내의 다목적 실행 로직(예를 들어, 실행 유닛)은 다양한 3D API 셰이더 언어에 대해 지원하고 복수의 셰이더와 관련된 복수의 동시 실행 스레드를 실행할 수 있다.
일부 실시예에서, 그래픽 코어 어레이(414)는 비디오 및/또는 이미지 프로세싱과 같은 미디어 기능을 수행하는 실행 로직을 포함한다. 일 실시예에서, 실행 유닛은 그래픽 프로세싱 동작 외에 병렬 범용 계산 동작을 수행하도록 프로그램될 수 있는 범용 로직을 포함한다. 범용 로직은 도 1의 프로세서 코어(들)(107) 또는 도 2a에서와 같이 코어(202A-202N) 내에서 범용 로직과 병렬로 또는 함께 프로세싱 동작을 수행할 수 있다.
그래픽 코어 어레이(414) 상에서 실행되는 스레드에 의해 생성된 출력 데이터는 데이터를 통합 반환 버퍼(URB)(418)의 메모리로 출력할 수 있다. URB(418)는 복수의 스레드에 대한 데이터를 저장할 수 있다. 일부 실시예에서, URB(418)는 그래픽 코어 어레이(414) 상에서 실행되는 상이한 스레드 사이에서 데이터를 전송하는데 사용될 수 있다. 일부 실시예에서, URB(418)는 그래픽 코어 어레이 상의 스레드와 공유 기능 로직(420) 내의 고정 기능 로직 사이의 동기화를 위해 추가적으로 사용될 수 있다.
일부 실시예에서, 그래픽 코어 어레이(414)는 확장 가능하므로, 어레이는 가변 개수의 그래픽 코어를 포함하고, 각각은 GPE(410)의 목표 전력 및 성능 레벨에 따라 가변 개수의 실행 유닛을 갖는다. 일 실시예에서, 실행 리소스는 동적으로 확장 가능하므로 실행 리소스는 필요에 따라 활성화 또는 비활성화될 수 있다.
그래픽 코어 어레이(414)는 그래픽 코어 어레이의 그래픽 코어들 사이에서 공유되는 복수의 리소스를 포함하는 공유 기능 로직(420)과 연결된다. 공유 기능 로직(420) 내의 공유 기능은 그래픽 코어 어레이(414)에 특수 보충 기능을 제공하는 하드웨어 로직 유닛이다. 다양한 실시예에서, 공유 기능 로직(420)은 샘플러(421), 산술(422) 및 스레드 간 통신(ITC)(423) 로직을 포함하지만 이에 한정되는 것은 아니다. 부가적으로, 일부 실시예는 공유 기능 로직(420) 내에 하나 이상의 캐시(들)(425)를 구현한다.
공유 기능은 적어도 주어진 특수 기능에 대한 요구가 그래픽 코어 어레이(414) 내에 포함시키기에 불충분한 경우에 구현된다. 대신에, 그 특수 기능의 단일 인스턴스화는 공유 기능 로직(420)의 독립된 엔티티로서 구현되고, 그래픽 코어 어레이(414) 내의 실행 리소스 사이에서 공유된다. 그래픽 코어 어레이(414) 사이에서 공유되고 그래픽 코어 어레이(414) 내에 포함되는 기능의 정확한 세트는 실시예에 따라 변한다. 일부 실시예에서, 그래픽 코어 어레이(414)에 의해 광범위하게 사용되는 공유 기능 로직(420) 내의 특정 공유 기능은 그래픽 코어 어레이(414) 내의 공유 기능 로직(416) 내에 포함될 수 있다. 다양한 실시예에서, 그래픽 코어 어레이(414) 내의 공유 기능 로직(416)은 공유 기능 로직(420) 내의 일부 또는 모든 로직을 포함할 수 있다. 일 실시예에서, 공유 기능 로직(420) 내의 모든 로직 요소는 그래픽 코어 어레이(414)의 공유 기능 로직(416) 내에서 중복될 수 있다. 일 실시예에서, 공유 기능 로직(420)은 그래픽 코어 어레이(414) 내의 공유 기능 로직(416)을 위해 배제된다.
실행 유닛
도 5a 및 도 5b는 본 명세서에 설명된 실시예에 따른 그래픽 프로세서 코어에서 사용되는 프로세싱 요소들의 어레이를 포함하는 스레드 실행 로직(500)을 도시한다. 본 명세서에서 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 5a 및 도 5b의 요소는 본 명세서의 다른 곳에 설명된 것과 유사한 방식으로 동작 또는 기능할 수 있지만, 이에 한정되는 것은 아니다. 도 5a 및 도 5b는 스레드 실행 로직(500)의 개요를 도시하며, 이는 도 2b의 각각의 서브-코어(221A-221F)로 도시된 하드웨어 로직을 나타낼 수 있다. 도 5a는 범용 그래픽 프로세서 내의 실행 유닛을 도시하고, 도 5b는 컴퓨팅 가속기 내에서 사용될 수 있는 실행 유닛을 도시한다.
도 5a에 도시된 것과 같이, 일부 실시예에서 스레드 실행 로직(500)은 셰이더 프로세서(502), 스레드 디스패처(504), 명령어 캐시(506), 복수의 실행 유닛(508A-508N)을 포함하는 확장 가능한 실행 유닛 어레이, 샘플러(510), 공유 로컬 메모리(511), 데이터 캐시(512), 및 데이터 포트(514)를 포함한다. 일 실시예에서, 확장 가능한 실행 유닛 어레이는 워크로드의 계산 요구 사항에 따라 하나 이상의 실행 유닛(예를 들어, 임의의 실행 유닛(508A, 508B, 508C, 508D, 내지 508N-1 및 508N))을 활성화 또는 비활성화함으로서 동적으로 변경될 수 있다. 일 실시예에서, 포함된 컴포넌트는 각각의 컴포넌트에 연결되는 상호 접속 패브릭을 통해 상호 접속된다. 일부 실시예에서, 스레드 실행 로직(500)은 명령어 캐시(506), 데이터 포트(514), 샘플러(510) 및 실행 유닛(508A-508N) 중 하나 이상을 통해 시스템 메모리 또는 캐시 메모리와 같은 메모리로의 하나 이상의 접속을 포함한다. 일부 실시예에서, 각각의 실행 유닛(예를 들어, 508A)은 각각의 스레드에 대해 복수의 데이터 요소를 병렬로 프로세싱하면서 복수의 동시 하드웨어 스레드를 실행할 수 있는 독립형의 프로그램 가능한 범용 계산 유닛이다. 다양한 실시예에서, 실행 유닛(508A-508N)의 어레이는 임의의 개수의 개별 실행 유닛을 포함하도록 확장 가능하다.
일부 실시예에서, 실행 유닛(508A-508N)은 주로 셰이더 프로그램을 실행하는데 사용된다. 셰이더 프로세서(502)는 다양한 셰이더 프로그램을 프로세싱하고 스레드 디스패처(504)를 통해 셰이더 프로그램과 관련된 실행 스레드를 디스패치할 수 있다. 일 실시예에서, 스레드 디스패처는 그래픽 및 미디어 파이프라인으로부터 스레드 개시 요청을 중재하고 요청된 스레드를 실행 유닛(508A-508N)의 하나 이상의 실행 유닛 상에서 인스턴스화하는 로직을 포함한다. 예를 들어, 기하 파이프라인은 프로세싱을 위해 정점, 테셀레이션(tessellation) 또는 기하 셰이더를 스레드 실행 로직으로 디스패치할 수 있다. 일부 실시예에서, 스레드 디스패처(504)는 또한 실행 셰이더 프로그램으로부터의 런타임 스레드 생성 요청을 프로세싱할 수 있다.
일부 실시예에서, 실행 유닛(508A-508N)은 그래픽 라이브러리(예를 들어, Direct 3D 및 OpenGL)로부터의 셰이더 프로그램이 최소의 변환으로 실행되도록 많은 표준 3D 그래픽 셰이더 명령어에 대한 기본적인 지원을 포함하는 명령어 세트를 지원한다. 실행 유닛은 정점 및 기하 프로세싱(예를 들어, 정점 프로그램, 기하 프로그램, 정점 셰이더), 픽셀 프로세싱(예를 들어, 픽셀 셰이더, 프래그먼트 셰이더) 및 범용 프로세싱(예를 들어, 컴퓨팅 및 미디어 셰이더)을 지원한다. 각각의 실행 유닛(508A-508N)은 복수 발행 단일 명령어 복수 데이터(SIMD) 실행이 가능하고, 멀티-스레드 동작은 더 긴 대기 시간(latency)을 갖는 메모리 액세스에도 불구하고 효율적인 실행 환경을 가능하게 한다. 각각의 실행 유닛 내의 각각의 하드웨어 스레드는 전용 고대역 레지스터 파일과 관련 독립 스레드-상태를 갖는다. 실행은 정수, 단정밀도 및 배정밀도 부동 소수점 연산, SIMD 분기 기능, 논리 연산, 초월 연산 및 다른 기타 연산을 수행할 수 있는 파이프라인에 대해 클럭 당 복수로 발행된다. 메모리로부터 또는 공유 기능 중 하나로부터 데이터를 기다리는 동안, 실행 유닛(508A-508N) 내의 의존적인 로직은 요청된 데이터가 반환될 때까지 대기중인 스레드를 휴면 상태로 만든다. 대기중인 스레드가 휴면 상태인 동안, 하드웨어 리소스는 다른 스레드를 프로세싱하는데 사용될 수 있다. 예를 들어, 정점 셰이더 동작과 관련된 지연 시간 동안, 실행 유닛은 픽셀 셰이더, 프래그먼트 셰이더 또는 다른 정점 셰이더를 포함하는 다른 타입의 셰이더 프로그램에 대한 동작을 수행할 수 있다. 다양한 실시예는 SIMD를 사용하는 대신 또는 SIMD의 사용에 부가적으로 SIMT(Single Instruction Multiple Thread)를 사용함으로써 실행할 수 있다. SIMD 코어 또는 동작에 대한 참조는 또한 SIMT에 적용되거나 또는 SIMT와 함께 SIMD에 적용될 수 있다.
실행 유닛(508A-508N)의 각각의 실행 유닛은 데이터 요소의 어레이 상에서 동작한다. 데이터 요소의 개수는 "실행 크기" 또는 명령어에 대한 채널의 개수이다. 실행 채널은 명령어 내의 데이터 요소 액세스, 마스킹 및 흐름 제어에 대한 실행의 논리적 유닛이다. 채널의 개수는 특정 그래픽 프로세서에 대한 물리적 산술 로직 유닛(ALU) 또는 부동 소수점 유닛(FPU)의 개수에 독립적일 수 있다. 일부 실시예에서, 실행 유닛(508A-508N)은 정수 및 부동 소수점 데이터 타입을 지원한다.
실행 유닛 명령어 세트는 SIMD 명령어를 포함한다. 다양한 데이터 요소는 레지스터에 패킹된 데이터 타입으로서 저장될 수 있고, 실행 유닛은 요소의 데이터 크기에 따라 다양한 요소를 프로세싱할 것이다. 예를 들어, 256 비트 폭의 벡터에 대해 동작하는 경우, 256 비트의 벡터가 레지스터에 저장되고, 실행 유닛은, 4개의개별적인 64 비트 패킹된 데이터 요소(Quad-Word(QW) 크기의 데이터 요소), 8개의 개별적인 32 비트 패킹된 데이터 요소(DW(Double Word) 크기의 데이터 요소), 16개의 개별적인 16 비트 패킹된 데이터 요소(Word(W) 크기의 데이터 요소) 또는 32개의 개별적인 8 비트 패킹된 데이터 요소(byte(B) 크기의 데이터 요소)로서 벡터에 대해 동작한다. 그러나, 다른 벡터 폭과 레지스터 크기도 가능하다.
일 실시예에서, 하나 이상의 실행 유닛은, 결합된 EU에 공통인 스레드 제어 로직(507A-507N)을 갖는 결합된 실행 유닛(EU)(509A-509N)으로 결합될 수 있다. 복수의 EU가 EU 그룹에 결합될 수 있다. 결합된 EU 그룹의 각각의 EU는 별도의 SIMD 하드웨어 스레드를 실행하도록 구성될 수 있다. 결합된 EU 그룹에서의 EU의 개수는 실시예에 따라 달라질 수 있다. 또한 SIMD8, SIMD16 및 SIMD32를 포함하지만 이에 한정되지 않는 다양한 SIMD 폭이 각각의 EU 별로 수행될 수 있다. 각각의 결합된 그래픽 실행 유닛(509A-509N)은 적어도 2개의 실행 유닛을 포함한다. 예를 들어, 결합된 실행 유닛(509A)은 제 1 EU(508A), 제 2 EU(508B), 및 제 1 EU(508A)와 제 2 EU(508B)에 공통인 스레드 제어 로직(507A)을 포함한다. 스레드 제어 로직(507A)은 결합된 그래픽 실행 유닛(509A) 상에서 실행되는 스레드를 제어하여, 결합된 실행 유닛(509A-509N) 내의 각각의 EU가 공통 명령어 포인터 레지스터를 사용하여 실행될 수 있도록 한다.
하나 이상의 내부 명령어 캐시(예를 들어, 506)가 스레드 실행 로직(500)에 포함되어 실행 유닛에 대한 스레드 명령어를 캐싱한다. 일부 실시예에서, 스레드를 실행하는 동안 스레드 데이터를 캐싱하기 위해 하나 이상의 데이터 캐시(예를 들어, 512)가 포함된다. 실행 로직(500) 상에서 실행되는 스레드는 또한 명시적으로 관리되는 데이터를 공유 로컬 메모리(511)에 저장할 수 있다. 일부 실시예에서, 샘플러(510)는 3D 동작을 위한 텍스처 샘플링 및 미디어 동작을 위한 미디어 샘플링을 제공하기 위해 포함된다. 일부 실시예에서, 샘플러(510)는 샘플링된 데이터를 실행 유닛에 제공하기 전에 샘플링 프로세싱 동안 텍스처 또는 미디어 데이터를 프로세싱하는 특수 텍스처 또는 미디어 샘플링 기능을 포함한다.
실행하는 동안, 그래픽 및 미디어 파이프라인은 스레드 개시 요청을 스레드 생성 및 디스패치 로직을 통해 스레드 실행 로직(500)으로 전송한다. 일단 기하학적 객체 그룹이 프로세싱되어 픽셀 데이터로 래스터화 되면, 셰이더 프로세서(502) 내의 픽셀 프로세서 로직(예를 들어, 픽셀 셰이더 로직, 프래그먼트 셰이더 로직 등)이 호출되어 출력 정보를 추가로 계산하고 결과를 출력 표면(예를 들어, 컬러 버퍼, 깊이 버퍼, 스텐실 버퍼 등)에 기록되도록 한다. 일부 실시예에서, 픽셀 셰이더 또는 프래그먼트 셰이더는 래스터화된 객체에 걸쳐 보간될 다양한 정점 속성의 값을 계산한다. 일부 실시예에서, 이후 셰이더 프로세서(502) 내의 픽셀 프로세서 로직은 API(application programming interface) 제공 픽셀 또는 프래그먼트 셰이더 프로그램을 실행한다. 셰이더 프로그램을 실행하기 위해, 셰이더 프로세서(502)는 스레드 디스패처(504)를 통해 스레드를 실행 유닛(예를 들어, 508A)으로 디스패치한다. 일부 실시예에서, 셰이더 프로세서(502)는 샘플러(510)의 텍스처 샘플링 로직을 사용하여 메모리에 저장된 텍스처 맵의 텍스처 데이터에 액세스한다. 텍스처 데이터 및 입력 기하 데이터에 대한 산술 연산은 각각의 기하학적 프래그먼트에 대한 픽셀 컬러 데이터를 계산하거나, 또는 다른 프로세싱에서 하나 이상의 픽셀을 폐기한다.
일부 실시예에서, 데이터 포트(514)는 그래픽 프로세서 출력 파이프라인 상에서 추가 프로세싱을 위해 프로세싱된 데이터를 메모리로 출력하는 스레드 실행 로직(500)에 대한 메모리 액세스 메커니즘을 제공한다. 일부 실시예에서, 데이터 포트(514)는 데이터 포트를 통한 메모리 액세스를 위해 데이터를 캐싱하는 하나 이상의 캐시 메모리(예를 들어, 데이터 캐시(512))를 포함하거나 또는 이에 연결된다.
일 실시예에서, 실행 로직(500)은 또한 광선 추적 가속 기능을 제공할 수 있는 광선 추적기(505)를 포함할 수 있다. 광선 추적기(505)는 광선 생성을 위한 명령어/기능을 포함하는 광선 추적 명령어 세트를 지원할 수 있다. 광선 추적 명령어 세트는 도 2c의 광선 추적 코어(245)에 의해 지원되는 광선 추적 명령어 세트와 유사하거나 또는 상이할 수 있다.
도 5b는 실시예에 따른 실행 유닛(508)의 예시적인 내부 세부 사항을 도시한다. 그래픽 실행 유닛(508)은 명령어 페치 유닛(537), GRF(general register file) 어레이(524), ARF(architecture register file) 어레이(526), 스레드 중재자(522), 송신 유닛(530), 분기 유닛(532), SIMD FPUs(floating point units) 세트(534)를 포함할 수 있고, 일 실시예에서, 전용 정수 SIMD ALU(535) 세트를 포함할 수 있다. GRF(524) 및 ARF(526)는 그래픽 실행 유닛(508)에서 활성화될 수 있는 각각의 동시 하드웨어 스레드와 관련된 일반 레지스터 파일 및 아키텍처 레지스터 파일의 세트를 포함한다. 일 실시예에서, 스레드 당 구조적 상태는 ARF(526)에 유지되고, 스레드를 실행하는 동안 사용된 데이터는 GRF(524)에 저장된다. 각각의 스레드에 대한 명령어 포인터를 포함하는 각각의 스레드의 실행 상태는 ARF(526)의 스레드 특정 레지스터에 보유될 수 있다.
일 실시예에서, 그래픽 실행 유닛(508)은 SMT(Simultaneous Multi-Threading) 및 파인 그레인드(fine-grained) IMT(Interleaved Multi-Threading)의 조합인 아키텍처를 갖는다. 이 아키텍처는 동시 스레드의 대상 개수와 실행 유닛 당 레지스터 개수에 따라 설계 시에 미세 조정이 가능한 모듈식 구성을 갖는데, 실행 유닛 리소스는 복수의 동시 스레드를 실행하는데 사용되는 로직에 따라 분할된다. 그래픽 실행 유닛(508)에 의해 실행될 수 있는 로직 스레드의 개수는 하드웨어 스레드의 개수로 제한되지 않으며, 복수의 로직 스레드가 각각의 하드웨어 스레드에 할당될 수 있다.
일 실시예에서, 그래픽 실행 유닛(508)은 복수의 명령어를 공동 발행할 수 있으며, 이는 각각 다른 명령어일 수 있다. 그래픽 실행 유닛 스레드(508)의 스레드 중재자(522)는 실행을 위해 명령어를 전송 유닛(530), 분기 유닛(532) 또는 SIMD FPU(들)(534) 중 하나에 디스패치할 수 있다. 각각의 실행 스레드는 GRF(524) 내의 128개의 범용 레지스터에 액세스할 수 있는데, 각각의 레지스터는 32 비트 데이터 요소의 SIMD 8 요소 벡터로서 액세스가능한 32 바이트를 저장할 수 있다. 일 실시예에서, 각각의 실행 유닛 스레드는 GRF(524) 내에서 4KB에 액세스할 수 있지만, 실시예는 이에 한정되지 않고, 더 많거나 또는 더 적은 레지스터 리소스가 다른 실시예에서 제공될 수 있다. 일 실시예에서, 그래픽 실행 유닛(508)은 계산 동작을 독립적으로 수행할 수 있는 7개의 하드웨어 스레드로 분할되지만, 실행 유닛 당 스레드의 개수는 또한 실시예에 따라 변할 수 있다. 예를 들어, 일 실시예에서 최대 16개의 하드웨어 스레드가 지원된다. 7개의 스레드가 4KB에 액세스할 수 있는 실시예에서, GRF(524)는 총 28KB를 저장할 수 있다. 16개의 스레드가 4KB에 액세스할 수 있는 경우 GRF(524)는 총 64KB를 저장할 수 있다. 유연한 어드레싱 모드는 레지스터들을 함께 어드레싱하여 효과적으로 더 넓은 레지스터를 구성하거나 또는 스트라이드된(strided) 사각형 블록 데이터 구조를 나타낼 수 있다.
일 실시예에서, 메모리 동작, 샘플러 동작 및 다른 대기 시간이 긴 시스템 통신은 메시지 전달 송신 유닛(530)에 의해 실행되는 "송신" 명령어를 통해 디스패치된다. 일 실시예에서, 분기 명령어는 전용 분기 유닛(532)으로 디스패치되어 SIMD 발산 및 최종 수렴을 용이하게 한다.
일 실시예에서, 그래픽 실행 유닛(508)은 부동 소수점 연산을 수행하는 하나 이상의 SIMD 부동 소수점 유닛(FPU)(534)을 포함한다. 일 실시예에서, FPU(들)(534)는 또한 정수 계산을 지원한다. 일 실시예에서, FPU(들)(534)는 M개의 32 비트 부동 소수점(또는 정수) 연산까지 SIMD를 실행할 수 있거나, 또는 최대 2M개의 16 비트 정수 또는 16 비트 부동 소수점 연산까지 SIMD를 실행할 수 있다. 일 실시예에서, FPU(들) 중 적어도 하나는 고처리량 초월 산술 함수 및 배정밀도 54 비트 부동 소수점을 지원하는 확장된 산술 능력을 제공한다. 일부 실시예에서, 8 비트 정수 SIMD ALU 세트(535)가 또한 존재하며, 머신 학습 계산과 관련된 동작을 수행하도록 특별히 최적화될 수 있다.
일 실시예에서, 그래픽 실행 유닛(508)의 복수 인스턴스의 어레이는 그래픽 서브-코어 그룹(예를 들어, 서브-슬라이스)에서 인스턴스화될 수 있다. 확장성을 위해, 제품 설계자는 서브-코어 그룹 당 실행 유닛의 정확한 개수를 선택할 수 있다. 일 실시예에서, 실행 유닛(508)은 복수의 실행 채널에 걸쳐 명령어를 실행할 수 있다. 다른 실시예에서, 그래픽 실행 유닛(508) 상에서 실행된 각각의 스레드는 다른 채널 상에서 실행된다.
도 6은 일 실시예에 따른 추가 실행 유닛(600)을 도시한다. 실행 유닛(600)은, 예를 들어 도 3c에서와 같이 컴퓨팅 엔진 타일(340A-340D)에 사용하기 위해 컴퓨팅 최적화된 실행 유닛일 수 있지만, 이에 한정되는 것은 아니다. 변형된 실행 유닛(600)이 또한 도 3b에서와 같이 그래픽 엔진 타일(310A-310D)에서 사용될 수 있다. 일 실시예에서, 실행 유닛(600)은 스레드 제어 유닛(601), 스레드 상태 유닛(602), 명령어 페치/프리페치 유닛(603) 및 명령어 디코딩 유닛(604)을 포함한다. 실행 유닛(600)은 실행 유닛 내에서 하드웨어 스레드에 할당될 수 있는 레지스터를 저장하는 레지스터 파일(606)을 추가로 포함한다. 실행 유닛(600)은 송신 유닛(607) 및 분기 유닛(608)을 추가로 포함한다. 일 실시예에서, 송신 유닛(607) 및 분기 유닛(608)은 도 5b의 그래픽 실행 유닛(508)의 송신 유닛(530) 및 분기 유닛(532)과 유사하게 동작할 수 있다.
실행 유닛(600)은 또한 복수의 상이한 타입의 기능 유닛을 포함하는 컴퓨팅 유닛(610)을 포함한다. 일 실시예에서, 컴퓨팅 유닛(610)은 산술 로직 유닛의 어레이를 포함하는 ALU 유닛(611)을 포함한다. ALU 유닛(611)은 64 비트, 32 비트 및 16 비트 정수 및 부동 소수점 연산을 수행하도록 구성될 수 있다. 정수 및 부동 소수점 연산은 동시에 수행될 수 있다. 컴퓨팅 유닛(610)은 또한 시스토릭(systolic) 어레이(612) 및 산술 유닛(613)을 포함할 수 있다. 시스토릭 어레이(612)는 시스토릭 방식으로 벡터 또는 다른 데이터-병렬 연산을 수행하는데 사용될 수 있는 데이터 프로세싱 유닛으로 이루어진 W(와이드) 및 D(딥) 네트워크를 포함한다. 일 실시예에서, 시스토릭 어레이(612)는 매트릭스 내적 연산과 같은 매트릭스 연산을 수행하도록 구성될 수 있다. 일 실시예에서, 시스토릭 어레이(612)는 16 비트 부동 소수점 연산뿐만 아니라 8 비트 및 4 비트 정수 연산을 지원한다. 일 실시예에서, 시스토릭 어레이(612)는 머신 학습 동작을 가속화하도록 구성될 수 있다. 이러한 실시예에서, 시스토릭 어레이(612)는 bfloat 16 비트 부동 소수점 포맷을 지원하도록 구성될 수 있다. 일 실시예에서, 산술 유닛(613)은 ALU 유닛(611)보다 효율적이고 저전력 방식으로 수학적 연산의 특정 서브세트를 수행하도록 포함될 수 있다. 산술 유닛(613)은 다른 실시예에서 제공되는 그래픽 프로세싱 엔진의 공유 기능 로직(예를 들어, 도 4의 공유 기능 로직(420)의 산술 로직(422))에서 발견될 수 있는 산술 로직의 변형을 포함할 수 있다. 일 실시예에서, 산술 유닛(613)은 32 비트 및 64 비트 부동 소수점 연산을 수행하도록 구성될 수 있다.
스레드 제어 유닛(601)은 실행 유닛 내에서 스레드의 실행을 제어하는 로직을 포함한다. 스레드 제어 유닛(601)은 실행 유닛(600) 내에서 스레드의 실행을 시작, 중지 및 선점하는 스레드 중재 로직을 포함할 수 있다. 스레드 상태 유닛(602)은 실행 유닛(600) 상에서 실행되도록 할당된 스레드에 대한 스레드 상태를 저장하는데 사용될 수 있다. 실행 유닛(600) 내에 스레드 상태를 저장함으로써 이들 스레드가 차단되거나 유휴 상태일 때 스레드를 신속하게 선점할 수 있다. 명령어 페치/프리페치 유닛(603)은 더 높은 레벨의 실행 로직의 명령어 캐시(예를 들어, 도 5a에서와 같은 명령어 캐시(506))로부터 명령어를 페치할 수 있다. 명령어 페치/프리페치 유닛(603)은 또한 현재 실행 중인 스레드의 분석에 기초하여 명령어가 명령어 캐시에 로딩될 수 있도록 프리페치 요청을 발행할 수 있다. 명령어 디코딩 유닛(604)은 컴퓨팅 유닛에 의해 실행될 명령어를 디코딩하는데 사용될 수 있다. 일 실시예에서, 명령어 디코딩 유닛(604)은 복잡한 명령어를 구성을 이루는 마이크로-동작으로 디코딩하는 2차 디코더로서 사용될 수 있다.
실행 유닛(600)은 실행 유닛(600) 상에서 실행되는 하드웨어 스레드에 의해 사용될 수 있는 레지스터 파일(606)을 추가로 포함한다. 레지스터 파일(606)의 레지스터는 실행 유닛(600)의 컴퓨팅 유닛(610) 내에서 복수의 동시 스레드를 실행하는데 사용되는 로직에 걸쳐 분할될 수 있다. 그래픽 실행 유닛(600)에 의해 실행될 수 있는 논리 스레드의 개수는 하드웨어 스레드의 개수로 제한되지 않고, 복수의 논리 스레드가 각각의 하드웨어 스레드에 할당될 수 있다. 레지스터 파일(606)의 크기는 지원되는 하드웨어 스레드의 개수에 따라 실시예마다 변할 수 있다. 일 실시예에서, 레지스터 명칭 변경은 레지스터를 하드웨어 스레드에 동적으로 할당하기 위해 사용될 수 있다.
도 7은 일부 실시예에 따른 그래픽 프로세서 명령어 포맷(700)을 도시한 블록도이다. 하나 이상의 실시예에서, 그래픽 프로세서 실행 유닛은 복수 포맷의 명령어를 갖는 명령어 세트를 지원한다. 실선 상자는 일반적으로 실행 유닛 명령어에 포함된 컴포넌트를 나타내는 반면, 점선은 선택 사항이거나 또는 명령어의 서브-세트에만 포함된 컴포넌트를 포함한다. 일부 실시예에서, 설명되고 도시된 명령어 포맷(700)은, 일단 명령어가 프로세싱되면 디코딩된 명령어로부터 기인하는 마이크로-동작과 달리, 실행 유닛에 제공되는 명령어라는 점에서 매크로-명령어이다.
일부 실시예에서, 그래픽 프로세서 실행 유닛은 기본적으로 128 비트 명령어 포맷(710)의 명령어를 지원한다. 64 비트 압축 명령어 포맷(730)은 선택된 명령어, 명령어 옵션 및 피연산자의 개수에 따라 일부 명령어에서 이용 가능하다. 기본적인 128 비트 명령어 포맷(710)은 모든 명령어 옵션에 대한 액세스를 제공하는 반면, 일부 옵션 및 동작은 64 비트 포맷(730)으로 제한된다. 64 비트 포맷(730)에서 이용 가능한 기본적인 명령어는 실시예에 따라 다르다. 일부 실시예에서, 명령어는 인덱스 필드(713)의 인덱스 값 세트를 사용하여 부분적으로 압축된다. 실행 유닛 하드웨어는 인덱스 값에 따라 압축 테이블 세트를 참조하고 압축 테이블 출력을 사용하여 128 비트 명령어 포맷(710)으로 기본적인 명령어를 재구성한다. 다른 크기 및 포맷의 명령어가 사용될 수 있다.
각각의 포맷에 대해, 명령어 연산 코드(opcode)(712)는 실행 유닛이 수행해야 할 동작을 정의한다. 실행 유닛은 각각의 피연산자의 복수의 데이터 요소에 걸쳐 각각의 명령어를 병렬로 실행한다. 예를 들어, 더하기 명령어(an add instruction)에 응답하여, 실행 유닛은 텍스처 요소 또는 화상 요소를 나타내는 각각의 컬러 채널에 걸쳐 동시적인 더하기 동작을 수행한다. 기본적으로 실행 유닛은 피연산자의 모든 데이터 채널에 걸쳐서 각각의 명령어를 수행한다. 일부 실시예에서, 명령어 제어 필드(714)는 채널 선택(예를 들어, 예측) 및 데이터 채널 순서(예를 들어, 스위즐(swizzle))와 같은 특정 실행 옵션에 대한 제어를 가능하게 한다. 128 비트 명령어 포맷(710)의 명령어에 대해, 실행-크기 필드(716)는 병렬로 실행될 데이터 채널의 개수를 제한한다. 일부 실시예에서, 실행-크기 필드(716)는 64 비트 압축 명령어 포맷(730)에서 사용 가능하지 않다.
일부 실행 유닛 명령어는 2개의 소스 피연산자인 SRC0(720) 및 SRC1(722)과 1개의 목적지(718)를 포함하여 최대 3개의 피연산자를 갖는다. 일부 실시예에서, 실행 유닛은 이중 목적지 명령어를 지원하고, 이중 하나의 목적지는 암시된다. 데이터 조작 명령어는 제 3 소스 피연산자(예를 들어, SRC2(724))를 가질 수 있으며, 여기서 명령어 연산 코드(712)는 소스 피연산자의 개수를 결정한다. 명령어의 마지막 소스 피연산자는 명령어와 함께 전달되는 이미디어트(immediate)(예를 들어, 하드-코딩된) 값일 수 있다.
일부 실시예에서, 128 비트 명령어 포맷(710)은, 예를 들어, 직접 레지스터 어드레싱 모드 또는 간접 레지스터 어드레싱 모드가 사용되는지를 지정하는 액세스/주소 모드 필드(726)를 포함한다. 직접 레지스터 어드레싱 모드가 사용될 때, 하나 이상의 피연산자의 레지스터 주소는 명령어의 비트에 의해 직접 제공된다.
일부 실시예에서, 128 비트 명령어 포맷(710)은 명령어에 대한 주소 모드 및/또는 액세스 모드를 지정하는 액세스/주소 모드 필드(726)를 포함한다. 일 실시예에서, 액세스 모드는 명령어에 대한 데이터 액세스 정렬을 정의하는데 사용된다. 일부 실시예는 16 바이트 정렬 액세스 모드 및 1 바이트 정렬 액세스 모드를 포함하는 액세스 모드를 지원하는데, 액세스 모드의 바이트 정렬은 명령어 피연산자의 액세스 정렬을 결정한다. 예를 들어, 제 1 모드에 있을 때, 명령어는 소스 및 목적지 피연산자에 대해 1 바이트 정렬된 어드레싱을 사용할 수 있고, 제 2 모드에 있을 때, 명령어는 모든 소스 및 목적지 피연산자에 대해 16 바이트 정렬된 어드레싱을 사용할 수 있다.
일 실시예에서, 액세스/주소 모드 필드(726)의 주소 모드 부분은 명령어가 직접 또는 간접 어드레싱을 사용해야 하는지 여부를 결정한다. 직접 레지스터 어드레싱 모드가 사용될 때, 명령어의 비트는 하나 이상의 피연산자의 레지스터 주소를 직접 제공한다. 간접 레지스터 어드레싱 모드가 사용될 때, 하나 이상의 피연산자의 레지스터 주소는 명령어의 주소 레지스터 값 및 주소 이미디어트 필드에 기초하여 계산될 수 있다.
일부 실시예에서, 명령어는 연산 코드 디코딩(740)을 단순화하는 연산 코드(712) 비트 필드에 따라 그룹화된다. 8 비트 연산 코드의 경우, 비트 4, 5 및 6은 실행 유닛이 연산 코드의 유형을 결정할 수 있도록 한다. 설명되는 구체적인 연산 코드 그룹은 단지 예시일 뿐이다. 일부 실시예에서, 이동 및 로직 연산 코드 그룹(742)은 데이터 이동 및 로직 명령어(예를 들어, 이동(mov), 비교(cmp))를 포함한다. 일부 실시예에서, 이동 및 로직 그룹(742)은 5개의 최상위 비트(MSB)를 공유하며, 여기서 이동(mov) 명령어는 0000xxxxb의 형태이고 로직 명령어는 0001xxxxb의 형태이다. 흐름 제어 명령어 그룹(744)(예를 들어, 호출, 점프(jmp))은 0010xxxxb의 형태(예를 들어, 0x20)의 명령어를 포함한다. 기타 명령어 그룹(746)은 0011xxxxb의 형태(예를 들어, 0x30)의 동기화 명령어(예를 들어, 대기, 송신)를 포함하는 명령어의 혼합을 포함한다. 병렬 산술 명령어 그룹(748)은 0100xxxxb의 형태(예를 들어, 0x40)의 컴포넌트 별 산술 명령어(예를 들어, 더하기, 곱하기(mul))를 포함한다. 병렬 산술 그룹(748)은 데이터 채널에 걸쳐 병렬로 산술 연산을 수행한다. 벡터 산술 그룹(750)은 0101xxxxb 형태(예를 들어, 0x50)의 산술 명령어(예를 들어, dp4)를 포함한다. 벡터 산술 그룹은 벡터 피연산자에 대한 내적 계산과 같은 산술을 수행한다. 일 실시예에서, 설명된 연산 코드 디코딩(740)은 실행 유닛의 어느 부분이 디코딩된 명령어를 실행하는데 사용될지를 결정하는데 사용될 수 있다. 예를 들어, 일부 명령어는 시스토릭 어레이에 의해 수행될 시스토릭 명령어로 지정될 수 있다. 광선 추적 명령어(도시하지 않음)와 같은 다른 명령어는 실행 로직의 슬라이스 또는 파티션 내에서 광선 추적 코어 또는 광선 추적 로직으로 라우팅될 수 있다.
그래픽 파이프라인
도 8은 그래픽 프로세서(800)의 다른 실시예의 블록도이다. 본 명세서에서 임의의 다른 도면의 요소와 동일한 참조 번호(또는 명칭)를 갖는 도 8의 요소는 본 명세서의 다른 곳에서 설명된 것과 유사한 방식으로 동작 또는 기능할 수 있으나, 이에 한정되는 것은 아니다.
일부 실시예에서, 그래픽 프로세서(800)는 기하 파이프라인(820), 미디어 파이프라인(830), 디스플레이 엔진(840), 스레드 실행 로직(850) 및 렌더링 출력 파이프라인(870)을 포함한다. 일부 실시예에서, 그래픽 프로세서(800)는 하나 이상의 범용 프로세싱 코어를 포함하는 멀티-코어 프로세싱 시스템 내의 그래픽 프로세서이다. 그래픽 프로세서는 하나 이상의 제어 레지스터(도시하지 않음)에 대한 레지스터 기록에 의해 또는 링 상호 접속부(802)를 통해 그래픽 프로세서(800)에 발행된 커맨드를 통해 제어된다. 일부 실시예에서, 링 상호 접속부(802)는 그래픽 프로세서(800)를 다른 그래픽 프로세서 또는 범용 프로세서와 같은 다른 프로세싱 컴포넌트에 연결한다. 링 상호 접속부(802)로부터의 커맨드는 커맨드 스트리머(803)에 의해 해석되고, 이 커맨드 스트리머(803)는 기하 파이프라인(820) 또는 미디어 파이프라인(830)의 개별 컴포넌트에 명령어를 제공한다.
일부 실시예에서, 커맨드 스트리머(803)는 메모리로부터 정점 데이터를 판독하고 커맨드 스트리머(803)에 의해 제공된 정점-프로세싱 커맨드를 실행하는 정점 페처(805)의 동작을 지시한다. 일부 실시예에서, 정점 페처(805)는 정점 데이터를 정점 셰이더(807)에 제공하고, 이 정점 셰이더(807)는 각 정점에 좌표 공간 변환 및 조명 동작을 수행한다. 일부 실시예에서, 정점 페처(805) 및 정점 셰이더(807)는 실행 스레드를 스레드 디스패처(831)를 통해 실행 유닛(852A, 852B)에 디스패칭함으로써 정점-프로세싱 명령어를 실행한다.
일부 실시예에서, 실행 유닛(852A, 852B)은 그래픽 및 미디어 동작을 수행하는 명령어 세트를 갖는 벡터 프로세서의 어레이이다. 일부 실시예에서, 실행 유닛(852A, 852B)은 각각의 어레이에 대해 특정되거나 또는 어레이 사이에서 공유되는 부착된 L1 캐시(851)를 갖는다. 캐시는 데이터 캐시, 명령어 캐시 또는 서로 다른 파티션에 데이터와 명령어를 포함하도록 분할된 단일 캐시로 구성될 수 있다.
일부 실시예에서, 기하 파이프라인(820)은 3D 객체의 하드웨어 가속 테셀레이션을 수행하는 테셀레이션 컴포넌트를 포함한다. 일부 실시예에서, 프로그램 가능한 헐(hull) 셰이더(811)는 테셀레이션 동작을 구성한다. 프로그램 가능한 도메인 셰이더(817)는 테셀레이션 출력의 백엔드(back-end) 평가를 제공한다. 테셀레이터(813)는 헐 셰이더(811)의 방향으로 동작하고, 기하 파이프라인(820)에 입력으로서 제공되는 대략적인(coarse) 기하학적 모델에 기초하여 상세한 기하학적 객체의 세트를 생성하는 특수 목적 로직을 포함한다. 일부 실시예에서, 테셀레이션이 사용되지 않으면, 테셀레이션 컴포넌트(예를 들어, 헐 셰이더(811), 테셀레이터(813) 및 도메인 셰이더(817))는 우회될 수 있다.
일부 실시예에서, 완전한 기하학적 객체는 실행 유닛(852A, 852B)으로 디스패치된 하나 이상의 스레드를 통해 기하 셰이더(819)에 의해 처리될 수 있거나, 또는 클리퍼(829)로 직접 진행될 수 있다. 일부 실시예에서, 기하 셰이더는 그래픽 파이프라인의 이전 단계에서와 같이 정점 또는 정점의 패치(patch)가 아닌 전체의 기하학적 객체에 대해 동작한다. 테셀레이션이 비활성화되면, 기하 셰이더(819)는 정점 셰이더(807)로부터 입력을 수신한다. 일부 실시예에서, 테셀레이션 유닛이 비활성화되면, 기하 셰이더(819)는 기하 테셀레이션을 수행하는 기하 셰이더 프로그램으로 프로그램 가능하다.
래스터화 이전에, 클리퍼(829)는 정점 데이터를 프로세싱한다. 클리퍼(829)는 고정 기능 클리퍼 또는 클리핑 및 기하 셰이더 기능을 갖는 프로그램 가능한 클리퍼일 수 있다. 일부 실시예에서, 렌더링 출력 파이프라인(870)의 래스터화기(rasterizer) 및 깊이 테스트 컴포넌트(873)는 픽셀 셰이더를 디스패치하여 기하학적 객체를 픽셀 당 표현으로 변환한다. 일부 실시예에서, 픽셀 셰이더 로직은 스레드 실행 로직(850)에 포함된다. 일부 실시예에서, 애플리케이션은 래스터화기 및 깊이 테스트 컴포넌트(873)를 우회하고 스트림 아웃 유닛(823)을 통해 래스터화되지 않은 정점 데이터에 액세스할 수 있다.
그래픽 프로세서(800)는 상호 접속 버스, 상호 접속 패브릭, 또는 프로세서의 주요 컴포넌트 사이에 데이터 및 메시지 전달을 허용하는 다른 상호 접속 메커니즘을 갖는다. 일부 실시예에서, 실행 유닛(852A, 852B) 및 관련 로직 유닛(예를 들어, L1 캐시(851), 샘플러(854), 텍스처 캐시(858) 등)은 메모리 액세스를 수행하고 프로세서의 렌더링 출력 파이프라인 컴포넌트와 통신하는 데이터 포트(856)를 통해 상호 접속된다. 일부 실시예에서, 샘플러(854), 캐시(851, 858) 및 실행 유닛(852A, 852B)은 각각 별개의 메모리 액세스 경로를 갖는다. 일 실시예에서, 텍스처 캐시(858)는 또한 샘플러 캐시로서 구성될 수 있다.
일부 실시예에서, 렌더링 출력 파이프라인(870)은 정점 기반 객체를 관련 픽셀 기반 표현으로 변환하는 래스터화기 및 깊이 테스트 컴포넌트(873)를 포함한다. 일부 실시예에서, 래스터화기 로직은 고정 기능 삼각형 및 라인 래스터화를 수행하는 윈도우/마스커 유닛을 포함한다. 관련된 렌더 캐시(878) 및 깊이 캐시(879)는 또한 일부 실시예에서 이용가능할 수 있다. 픽셀 동작 컴포넌트(877)는 데이터에 대해 픽셀 기반 동작을 수행하지만, 일부 예에서는 2D 동작(예를 들어, 블렌딩을 통한 비트 블록 이미지 전송)과 관련된 픽셀 동작은 2D 엔진(841)에 의해 수행되거나 또는 디스플레이 시간에 오버레이 디스플레이 평면을 사용하여 디스플레이 제어기(843)에 의해 대체된다. 일부 실시예에서, 공유 L3 캐시(875)는 모든 그래픽 컴포넌트에 이용 가능하여, 주 시스템 메모리를 사용하지 않고 데이터를 공유할 수 있도록 한다.
일부 실시예에서, 그래픽 프로세서 미디어 파이프라인(830)은 미디어 엔진(837) 및 비디오 프론트-엔드(834)를 포함한다. 일부 실시예에서, 비디오 프론트-엔드(834)는 커맨드 스트리머(803)로부터 파이프라인 커맨드를 수신한다. 일부 실시예에서, 미디어 파이프라인(830)은 별도의 커맨드 스트리머를 포함한다. 일부 실시예에서, 비디오 프론트-엔드(834)는 미디어 커맨드를 미디어 엔진(837)에 전송하기 전에 이 커맨드를 프로세싱한다. 일부 실시예에서, 미디어 엔진(837)은 스레드 디스패처(831)를 통해 스레드 실행 로직(850)으로 디스패치하기 위한 스레드를 생성하는 스레드 생성 기능을 포함한다.
일부 실시예에서, 그래픽 프로세서(800)는 디스플레이 엔진(840)을 포함한다. 일부 실시예에서, 디스플레이 엔진(840)은 프로세서(800)의 외부에 있고, 링 상호 접속부(802) 또는 일부 다른 상호 접속 버스 또는 패브릭을 통해 그래픽 프로세서와 연결된다. 일부 실시예에서, 디스플레이 엔진(840)은 2D 엔진(841) 및 디스플레이 제어기(843)를 포함한다. 일부 실시예에서, 디스플레이 엔진(840)은 3D 파이프라인으로부터 독립적으로 동작할 수 있는 특수 목적 로직을 포함한다. 일부 실시예에서, 디스플레이 제어기(843)는, 랩톱 컴퓨터에서와 같이 시스템 통합형 디스플레이 장치 또는 디스플레이 장치 커넥터를 통해 부착된 외부 디스플레이 장치일 수 있는 디스플레이 장치(도시하지 않음)에 연결된다.
일부 실시예에서, 기하 파이프라인(820) 및 미디어 파이프라인(830)은 복수의 그래픽 및 미디어 프로그래밍 인터페이스에 따른 동작을 수행하도록 구성될 수 있고 임의의 하나의 애플리케이션 프로그래밍 인터페이스(API)에 한정되지 않는다. 일부 실시예에서, 그래픽 프로세서를 위한 드라이버 소프트웨어는 특정 그래픽 또는 미디어 라이브러리에 특정된 API 호출을 그래픽 프로세서에 의해 처리될 수 있는 커맨드로 변환한다. 일부 실시예에서, 모두 크로노스 그룹(Khronos Group)으로부터 발표된, OpenGL(Open Graphics Library), OpenCL(Open Computing Language) 및/또는 Vulkan 그래픽 및 컴퓨팅 API에 대한 지원이 제공된다. 일부 실시예에서, Microsoft Corporation으로부터 발표된 Direct3D 라이브러리에 대한 지원이 또한 제공될 수 있다. 일부 실시예에서, 이들 라이브러리의 조합이 지원될 수 있다. OpenCV(Open Source Computer Vision Library)에 대한 지원이 또한 제공될 수 있다. 향후 API의 파이프라인으로부터 그래픽 프로세서의 파이프라인으로 매핑이 가능하게 되면, 호환 가능한 3D 파이프라인을 갖는 향후 API도 지원될 것이다.
그래픽 파이프라인 프로그래밍
도 9a는 일부 실시예에 따른 그래픽 프로세서 커맨드 포맷(900)을 도시한 블록도이다. 도 9b는 일 실시예에 따른 그래픽 프로세서 커맨드 시퀀스(910)를 도시한 블록도이다. 도 9a의 실선 상자는 일반적으로 그래픽 커맨드에 포함된 컴포넌트를 도시하고, 점선은 선택 사항이거나 또는 그래픽 커맨드의 서브-세트에만 포함된 컴포넌트를 포함한다. 도 9a의 예시적인 그래픽 프로세서 커맨드 포맷(900)은 클라이언트(902), 커맨드 연산 코드(opcode)(904) 및 커맨드에 대한 데이터(906)를 식별하는 데이터 필드를 포함한다. 서브-연산 코드(905) 및 커맨드 크기(908)는 또한 일부 커맨드에 포함된다.
일부 실시예에서, 클라이언트(902)는 커맨드 데이터를 프로세싱하는 그래픽 장치의 클라이언트 유닛을 특정한다. 일부 실시예에서, 그래픽 프로세서 커맨드 파서(parser)는 커맨드의 추가 프로세싱을 조정하고 커맨드 데이터를 적절한 클라이언트 유닛으로 라우팅하기 위해 각 커맨드의 클라이언트 필드를 검사한다. 일부 실시예에서, 그래픽 프로세서 클라이언트 유닛은 메모리 인터페이스 유닛, 렌더 유닛, 2D 유닛, 3D 유닛 및 미디어 유닛을 포함한다. 각각의 클라이언트 유닛은 커맨드를 프로세싱하는 대응 프로세싱 파이프라인을 갖는다. 일단 커맨드가 클라이언트 유닛에 의해 수신되면, 클라이언트 유닛은 수행할 동작을 결정하기 위해 연산 코드(904) 및 존재한다면 서브-연산 코드(905)를 판독한다. 클라이언트 유닛은 데이터 필드(906)의 정보를 사용하여 커맨드를 수행한다. 일부 커맨드의 경우, 명시적인 커맨드 크기(908)는 커맨드의 크기를 특정할 것으로 예상된다. 일부 실시예에서, 커맨드 파서는 커맨드 연산 코드에 근거하여 커맨드 중 적어도 일부 커맨드의 크기를 자동으로 결정한다. 일부 실시예에서, 커맨드는 복수의 더블 워드를 통해 정렬된다. 다른 커맨드 포맷이 사용될 수 있다.
도 9b의 흐름도는 예시적인 그래픽 프로세서 커맨드 시퀀스(910)를 도시한다. 일부 실시예에서, 그래픽 프로세서의 실시예를 특징으로 하는 데이터 프로세싱 시스템의 소프트웨어 또는 펌웨어는 그래픽 동작의 세트를 설정, 실행 및 종료하기 위해 도시된 커맨드 시퀀스의 버전을 사용한다. 실시예는 특정 커맨드 또는 이 커맨드 시퀀스로 한정되지 않으므로, 샘플 커맨드 시퀀스는 예시의 목적으로만 도시되고 설명된다. 더욱이, 커맨드는 커맨드 시퀀스에서 커맨드의 배치(batch)로서 발행될 수 있으므로, 그래픽 프로세서는 커맨드의 시퀀스를 적어도 부분적으로 동시에 프로세싱할 것이다.
일부 실시예에서, 그래픽 프로세서 커맨드 시퀀스(910)는 임의의 활성 그래픽 파이프라인이 파이프라인에 현재 보류중인 커맨드를 완료하게 하는 파이프라인 플러시(flush) 커맨드(912)로 시작할 수 있다. 일부 실시예에서, 3D 파이프라인(922) 및 미디어 파이프라인(924)은 동시에 동작하지 않는다. 활성 그래픽 파이프라인이 임의의 진행 중인 커맨드를 완료하도록 파이프라인 플러시가 수행된다. 파이프라인 플러시에 대한 응답으로, 그래픽 프로세서에 대한 커맨드 파서는 활성 드로잉 엔진이 진행 중인 작업을 완료하고 관련된 판독 캐시가 무효화될 때까지 커맨드 프로세싱을 일시 중지할 것이다. 선택에 따라, '더러운'이라고 표시된 렌더 캐시의 모든 데이터는 메모리로 플러시될 수 있다. 일부 실시예에서, 파이프라인 플러시 커맨드(912)는 파이프라인 동기화를 위해 또는 그래픽 프로세서를 저전력 상태로 만들기 전에 사용될 수 있다.
일부 실시예에서, 파이프라인 선택 커맨드(913)는 그래픽 프로세서가 파이프라인 사이에서 명시적으로 전환할 것을 커맨드 시퀀스가 요구할 때 사용된다. 일부 실시예에서, 파이프라인 선택 커맨드(913)는 실행 컨텍스트가 두 파이프라인 모두에 대한 커맨드를 발행하지 않는다면 파이프라인 커맨드를 발행하기 전에 실행 컨텍스트 내에서 한 번만 필요하다. 일부 실시예에서, 파이프라인 플러시 커맨드(912)는 파이프라인 선택 커맨드(913)를 통한 파이프라인의 전환 직전에 요구된다.
일부 실시예에서, 파이프라인 제어 커맨드(914)는 동작을 위한 그래픽 파이프라인을 구성하고 3D 파이프라인(922) 및 미디어 파이프라인(924)을 프로그래밍하는데 사용된다. 일부 실시예에서, 파이프라인 제어 커맨드(914)는 활성 파이프라인에 대한 파이프라인 상태를 구성한다. 일 실시예에서, 파이프라인 제어 커맨드(914)는 파이프라인 동기화를 위해, 그리고 커맨드의 배치를 프로세싱하기 전에 활성 파이프라인 내의 하나 이상의 캐시 메모리로부터 데이터를 삭제하는데 사용된다.
일부 실시예에서, 반환 버퍼 상태 커맨드(916)는 데이터를 기록하기 위해 각각의 파이프라인에 대한 반환 버퍼 세트를 구성하는데 사용된다. 일부 파이프라인 동작은 프로세싱 중에 그 동작이 중간 데이터(intermediate data)를 기록하는 하나 이상의 반환 버퍼의 할당, 선택 또는 구성을 필요로 한다. 일부 실시예에서, 그래픽 프로세서는 또한 출력 데이터를 저장하고 교차 스레드 통신을 수행하기 위해 하나 이상의 반환 버퍼를 사용한다. 일부 실시예에서, 반환 버퍼 상태(916)는 파이프라인 동작 세트에 사용하는 반환 버퍼의 크기 및 개수를 선택하는 것을 포함한다.
커맨드 시퀀스에서 나머지 커맨드는 동작을 위한 활성 파이프라인에 따라 상이하다. 파이프라인 결정(920)에 따라, 커맨드 시퀀스는 3D 파이프라인 상태(930)에서 시작하는 3D 파이프라인(922) 또는 미디어 파이프라인 상태(940)에서 시작하는 미디어 파이프라인(924)에 맞춰진다(tailored).
3D 파이프라인 상태(930)를 구성하는 커맨드는 정점 버퍼 상태, 정점 요소 상태, 일정한 컬러 상태, 깊이 버퍼 상태, 및 3D 프리미티브 커맨드가 프로세싱되기 전에 구성될 다른 상태 변수에 대한 3D 상태 설정 커맨드를 포함한다. 이러한 커맨드의 값은 사용중인 특정 3D API에 근거하여 적어도 부분적으로 결정된다. 일부 실시예에서, 3D 파이프라인 상태(930) 커맨드는 또한 특정 파이프라인 요소가 사용되지 않을 경우 이들 요소를 선택적으로 비활성화시키거나 또는 우회할 수 있다.
일부 실시예에서, 3D 프리미티브(932) 커맨드는 3D 파이프라인에 의해 프로세싱될 3D 프리미티브를 제출하는데 사용된다. 3D 프리미티브(932) 커맨드를 통해 그래픽 프로세서로 전달되는 커맨드 및 관련 파라미터는 그래픽 파이프라인의 정점 페치 기능으로 전달된다. 정점 페치 기능은 3D 프리미티브(932) 커맨드 데이터를 사용하여 정점 데이터 구조를 생성한다. 정점 데이터 구조는 하나 이상의 반환 버퍼에 저장된다. 일부 실시예에서, 3D 프리미티브(932) 커맨드는 정점 셰이더를 통해 3D 프리미티브에 대한 정점 연산을 수행하는데 사용된다. 정점 셰이더를 프로세싱하기 위해, 3D 파이프라인(922)은 셰이더 실행 스레드를 그래픽 프로세서 실행 유닛으로 디스패치한다.
일부 실시예에서, 3D 파이프라인(922)은 실행(934) 커맨드 또는 이벤트를 통해 트리거된다. 일부 실시예에서, 레지스터 기록은 커맨드 실행을 트리거한다. 일부 실시예에서, 실행은 커맨드 시퀀스에서 'go' 또는 'kick' 커맨드를 통해 트리거된다. 일 실시예에서, 커맨드 실행은 그래픽 파이프라인을 통해 커맨드 시퀀스를 플러시하는 파이프라인 동기화 커맨드를 사용하여 트리거된다. 3D 파이프라인은 3D 프리미티브에 대한 기하 프로세싱을 수행할 것이다. 동작이 완료되면 결과로 생성된 기하학적 객체가 래스터화되고 픽셀 엔진이 결과 픽셀을 채색한다. 픽셀 셰이딩 및 픽셀 백 엔드 동작을 제어하는 추가 커맨드가 또한 이러한 동작에 포함될 수 있다.
일부 실시예에서, 그래픽 프로세서 커맨드 시퀀스(910)는 미디어 동작을 수행할 때 미디어 파이프라인(924) 경로를 따른다. 일반적으로, 미디어 파이프라인(924)에 대한 프로그래밍의 특정 사용 및 방식은 수행될 미디어 또는 컴퓨팅 동작에 의존한다. 미디어를 디코딩하는 동안 특정 미디어 디코딩 동작이 미디어 파이프라인으로 오프로딩될 수 있다. 일부 실시예에서, 미디어 파이프라인은 또한 우회될 수 있고 미디어 디코딩은 하나 이상의 범용 프로세싱 코어에 의해 제공되는 리소스를 사용하여 전체적으로 또는 부분적으로 수행될 수 있다. 일 실시예에서, 미디어 파이프라인은 또한 범용 그래픽 프로세서 유닛(GPGPU) 동작을 위한 요소를 포함하며, 여기서 그래픽 프로세서는 그래픽 프리미티브의 렌더링에 명시적으로 관련되지 않은 계산 셰이더 프로그램을 사용하여 SIMD 벡터 연산을 수행하는데 사용된다.
일부 실시예에서, 미디어 파이프라인(924)은 3D 파이프라인(922)과 유사한 방식으로 구성된다. 미디어 파이프라인 상태(940)를 구성하는 커맨드 세트는 미디어 객체 커맨드(942) 이전에 커맨드 큐(queue)에 디스패치 또는 배치된다. 일부 실시예에서, 미디어 파이프라인 상태(940)에 대한 커맨드는 미디어 객체를 프로세싱하는데 사용될 미디어 파이프라인 요소를 구성하는 데이터를 포함한다. 여기에는 인코딩 또는 디코딩 포맷과 같은, 미디어 파이프라인 내에서 비디오 디코딩 및 비디오 인코딩 로직을 구성하는 데이터가 포함된다. 일부 실시예에서, 미디어 파이프라인 상태(940)에 대한 커맨드는 또한 상태 설정의 배치를 포함하는 "간접" 상태 요소에 대한 하나 이상의 포인터의 사용을 지원한다.
일부 실시예에서, 미디어 객체 커맨드(942)는 미디어 파이프라인에 의한 프로세싱을 위해 미디어 객체에 대한 포인터를 제공한다. 미디어 객체는 프로세싱될 비디오 데이터를 포함하는 메모리 버퍼를 포함한다. 일부 실시예에서, 미디어 객체 커맨드(942)를 발행하기 전에 모든 미디어 파이프라인 상태는 유효해야 한다. 일단 파이프라인 상태가 구성되고 미디어 객체 커맨드(942)가 큐잉되면, 미디어 파이프라인(924)은 실행 커맨드(944) 또는 동등한 실행 이벤트(예를 들어, 레지스터 기록)를 통해 트리거된다. 이후 미디어 파이프라인(924)으로부터의 출력은 3D 파이프라인(922) 또는 미디어 파이프라인(924)에 의해 제공되는 동작에 의해 사후 프로세싱될 수 있다. 일부 실시예에서, GPGPU 동작은 미디어 동작과 유사한 방식으로 구성되고 실행된다.
그래픽 소프트웨어 아키텍처
도 10은 일부 실시예에 따른 데이터 프로세싱 시스템(1000)에 대한 예시적인 그래픽 소프트웨어 아키텍처를 도시한다. 일부 실시예에서, 소프트웨어 아키텍처는 3D 그래픽 애플리케이션(1010), 운영 시스템(1020) 및 적어도 하나의 프로세서(1030)를 포함한다. 일부 실시예에서, 프로세서(1030)는 그래픽 프로세서(1032) 및 하나 이상의 범용 프로세서 코어(들)(1034)를 포함한다. 그래픽 애플리케이션(1010) 및 운영 시스템(1020)은 각각 데이터 프로세싱 시스템의 시스템 메모리(1050)에서 실행된다.
일부 실시예에서, 3D 그래픽 애플리케이션(1010)은 셰이더 명령어(1012)를 포함하는 하나 이상의 셰이더 프로그램을 포함한다. 셰이더 언어 명령어는 Direct3D의 HLSL(High-Level Shader Language), GLSL(OpenGL Shader Language) 등과 같은 고급 셰이더 언어로 작성될 수 있다. 애플리케이션은 또한 범용 프로세서 코어(1034)에 의해 실행하기에 적합한 기계어로 작성된 실행 가능한 명령어(1014)를 포함한다. 애플리케이션은 또한 정점 데이터에 의해 정의된 그래픽 객체(1016)를 포함한다.
일부 실시예에서, 운영 시스템(1020)은 Microsoft Corporation의 Microsoft®Windows® 운영 시스템, 사유 UNIX 계열 운영 시스템 또는 Linux 커널의 변형을 사용하는 오픈 소스 UNIX 계열 운영 시스템이다. 운영 시스템(1020)은 Direct3D API, OpenGL API 또는 Vulkan API와 같은 그래픽 API(1022)를 지원할 수 있다. Direct3D API가 사용 중일 때, 운영 시스템(1020)은 프론트-엔드 셰이더 컴파일러(1024)를 사용하여 HLSL로 작성된 모든 셰이더 명령어(1012)를 하위 레벨 셰이더 언어로 컴파일한다. 컴파일은 JIT(Just-In-Time) 컴파일이거나 또는 애플리케이션은 셰이더 사전 컴파일을 수행할 수 있다. 일부 실시예에서, 고급 셰이더는 3D 그래픽 애플리케이션(1010)을 컴파일하는 동안 저급 셰이더로 컴파일된다. 일부 실시예에서, 셰이더 명령어(1012)는 Vulkan API에서 사용되는 SPIR(Standard Portable Intermediate Representation)의 버전과 같은 중간 형태로 제공된다.
일부 실시예에서, 사용자 모드 그래픽 드라이버(1026)는 셰이더 명령어(1012)를 하드웨어 특정 표현으로 변환하는 백-엔드 셰이더 컴파일러(1027)를 포함한다. OpenGL API가 사용중일 때, GLSL 고급 언어로 작성된 셰이더 명령어(1012)는 컴파일을 위해 사용자 모드 그래픽 드라이버(1026)로 전달된다. 일부 실시예에서, 사용자 모드 그래픽 드라이버(1026)는 커널 모드 그래픽 드라이버(1029)와 통신하는 운영 시스템 커널 모드 기능(1028)을 사용한다. 일부 실시예에서, 커널 모드 그래픽 드라이버(1029)는 커맨드 및 명령어를 디스패치하기 위해 그래픽 프로세서(1032)와 통신한다.
IP 코어 구현
적어도 하나의 실시예의 하나 이상의 측면은 프로세서와 같은 집적 회로 내의 로직을 나타내고 및/또는 정의하는, 머신 판독 가능 매체 상에 저장된 전형적인 코드에 의해 구현될 수 있다. 예를 들어, 머신 판독 가능 매체는 프로세서 내의 다양한 로직을 표현하는 명령어를 포함할 수 있다. 머신에 의해 판독될 때, 명령어는 머신으로 하여금 본 명세서에 설명된 기술을 수행하는 로직을 제조하게 할 수 있다. "IP 코어"로 알려진 이러한 표현은 집적 회로의 구조를 설명하는 하드웨어 모델로서 유형의 머신 판독 가능 매체 상에 저장될 수 있는 집적 회로에 대한 로직의 재사용 가능한 유닛이다. 하드웨어 모델은 다양한 고객 또는 제작 시설에 공급될 수 있으며, 이들은 집적 회로를 제조하는 제조 기계에 하드웨어 모델을 로딩한다. 집적 회로는 본 명세서에 설명된 임의의 실시예와 관련하여 설명된 동작을 수행하도록 제조될 수 있다.
도 11a는 일 실시예에 따른 동작을 수행하기 위해 집적 회로를 제작하는데 사용될 수 있는 IP 코어 개발 시스템(1100)을 도시하는 블록도이다. IP 코어 개발 시스템(1100)은 더 큰 설계에 통합될 수 있거나 또는 전체 집적 회로(예를 들어, SOC 집적 회로)를 구성하는데 사용될 수 있는 모듈식의 재사용 가능한 설계를 생성하는데 사용될 수 있다. 설계 설비(1130)는 고급 프로그래밍 언어(예를 들어, C/C ++)로 IP 코어 설계의 소프트웨어 시뮬레이션(1110)을 생성할 수 있다. 소프트웨어 시뮬레이션(1110)은 시뮬레이션 모델(1112)을 사용하여 IP 코어의 행동을 설계, 테스트 및 검증하는데 사용될 수 있다. 시뮬레이션 모델(1112)은 기능, 행동 및/또는 타이밍 시뮬레이션을 포함할 수 있다. 이후 레지스터 전송 레벨(RTL) 설계(1115)는 시뮬레이션 모델(1112)로부터 생성 또는 합성될 수 있다. RTL 설계(1115)는 모델링된 디지털 신호를 사용하여 수행되는 관련 로직을 포함하는 하드웨어 레지스터들 사이의 디지털 신호의 흐름을 모델링하는 집적 회로의 동작의 추상화를 가리킨다. RTL 설계(1115)에 더하여, 로직 레벨 또는 트랜지스터 레벨에서의 저급 설계가 또한 생성, 설계 또는 합성될 수 있다. 따라서 초기 설계 및 시뮬레이션의 특정 세부 사항은 다를 수 있다.
RTL 설계(1115) 또는 등가물은 설계 설비에 의해 하드웨어 모델(1120)로 추가적으로 합성될 수 있으며, 이 하드웨어 모델(120)은 하드웨어 기술 언어(HDL)로 작성되거나, 또는 물리적 설계 데이터의 다른 표현일 수 있다. IP 코어 설계를 검증하기 위해 HDL을 추가로 시뮬레이션하거나 또는 테스트할 수 있다. IP 코어 설계는 제 3 자 제조 설비(1165)로 전달하기 위해 비휘발성 메모리(1140)(예를 들어, 하드 디스크, 플래시 메모리 또는 임의의 비휘발성 저장 매체)를 사용하여 저장될 수 있다. 이와 달리, IP 코어 설계는 유선 접속(1150) 또는 무선 접속(1160)을 통해(예를 들어, 인터넷을 통해) 전송될 수 있다. 이후 제조 설비(1165)는 IP 코어 설계에 적어도 부분적으로 기초한 집적 회로를 제조할 수 있다. 제조된 집적 회로는 본 명세서에 설명된 적어도 하나의 실시예에 따른 동작을 수행하도록 구성될 수 있다.
도 11b는 본 명세서에 설명된 일부 실시예에 따른 집적 회로 패키지 어셈블리(1170)의 측단면도를 도시한다. 집적 회로 패키지 어셈블리(1170)는 본 명세서에 설명된 것과 같은 하나 이상의 프로세서 또는 가속기 장치의 구현예를 도시한다. 패키지 어셈블리(1170)는 기판(1180)에 접속된 하드웨어 로직(1172, 1174)의 복수의 유닛을 포함한다. 로직(1172, 1174)은 적어도 부분적으로 구성 가능한 로직 또는 고정 기능 로직 하드웨어로 구현될 수 있으며, 본 명세서에 설명된 프로세서 코어(들), 그래픽 프로세서(들) 또는 다른 가속기 장치 중 어느 것의 하나 이상의 부분을 포함할 수 있다. 로직(1172, 1174)의 각각의 유닛은 반도체 다이 내에 구현될 수 있고 상호 접속 구조(1173)를 통해 기판(1180)에 연결될 수 있다. 상호 접속 구조(1173)는 로직(1172, 1174)과 기판(1180) 사이에서 전기적 신호를 라우팅하도록 구성될 수 있으며, 범프 또는 기둥과 같은 상호 접속부를 포함하지만 이에 한정되는 것은 아니다. 일부 실시예에서, 상호 접속 구조(1173)는, 예를 들어, 로직(1172, 1174)의 동작과 관련된 입력/출력(I/O) 신호 및/또는 전력 또는 접지 신호와 같은 전기 신호를 라우팅하도록 구성될 수 있다. 일부 실시예에서, 기판(1180)은 에폭시계 라미네이트 기판이다. 기판(1180)은 다른 실시예에서 다른 적합한 타입의 기판을 포함할 수 있다. 패키지 어셈블리(1170)는 패키지 상호 접속부(1183)를 통해 다른 전기 장치에 접속될 수 있다. 패키지 상호 접속부(1183)는 기판(1180)의 표면에 연결되어 전기 신호를 마더보드, 다른 칩셋 또는 멀티-칩 모듈과 같은 다른 전기 장치로 라우팅할 수 있다.
일부 실시예에서, 로직(1172, 1174)의 유닛은 로직(1172, 1174) 사이에 전기 신호를 라우팅하도록 구성된 브리지(1182)와 전기적으로 연결된다. 브리지(1182)는 전기 신호에 대한 경로를 제공하는 밀집된 상호 접속 구조일 수 있다. 브리지(1182)는 유리 또는 적절한 반도체 재료로 구성된 브리지 기판을 포함할 수 있다. 전기적 라우팅 특징부가 로직(1172, 1174) 사이에 칩과 칩의 접속을 제공하기 위해 브리지 기판 상에 형성될 수 있다.
로직(1172, 1174)의 2개의 유닛 및 브리지(1182)가 도시되어 있지만, 본 명세서에 설명된 실시예는 하나 이상의 다이 위에 더 많거나 더 적은 로직 유닛을 포함할 수 있다. 하나 이상의 다이는 로직이 단일 다이 위에 포함될 때 브리지(1182)가 배제될 수 있으므로 0개 이상의 브리지에 의해 접속될 수 있다. 이와 달리, 복수의 다이 또는 로직의 유닛은 하나 이상의 브리지에 의해 접속될 수 있다. 또한 복수의 로직 유닛, 다이 및 브리지는, 3 차원 구성을 포함한 다른 가능한 구성으로 함께 접속될 수 있다.
도 11c는 기판(1180)(예를 들어, 베이스 다이)에 접속된 하드웨어 로직 칩렛의 복수의 유닛을 포함하는 패키지 어셈블리(1190)를 도시한다. 본 명세서에 설명된 그래픽 프로세싱 유닛, 병렬 프로세서 및/또는 컴퓨팅 가속기는 개별적으로 제작된 다양한 실리콘 칩렛으로 구성될 수 있다. 이러한 맥락에서, 칩렛은 다른 칩렛과 함께 더 큰 패키지로 조립될 수 있는 로직의 별개의 유닛을 포함하는 적어도 부분적으로 패키지된 집적 회로이다. 다른 IP 코어 로직을 갖는 칩렛의 다양한 세트가 단일 장치에 조립될 수 있다. 또한 칩렛은 액티브 인터포저 기술을 사용하여 베이스 다이 또는 베이스 칩렛에 통합될 수 있다. 본 명세서에 설명된 개념은 GPU 내에서 IP의 상이한 형태 사이의 상호 접속 및 통신을 가능하게 한다. IP 코어는 서로 다른 프로세스 기술을 사용하여 제작될 수 있으며 제작 과정에서 구성될 수 있으므로, 이는, 특히 여러 가지 특징적 IP를 구비한 대형 SoC에서 복수의 IP를 동일한 제작 프로세스로 수렴시키는 복잡성을 회피할 수 있다. 복수의 프로세스 기술을 사용할 수 있으므로, 출시 시간을 단축시키고 또한 복수의 제품 SKU를 생성하는 비용 효율적인 방법이 제공된다. 또한, 분리된 IP는 독립적으로 파워를 켜고 끌 수 있고, 주어진 워크로드 상에서 사용되지 않는 컴포넌트의 전원을 차단할 수 있어 전체 전력 소비를 줄일 수 있다.
하드웨어 로직 칩렛은 특수 목적 하드웨어 로직 칩렛(1172), 로직 또는 I/O 칩렛(1174) 및/또는 메모리 칩렛(1175)을 포함할 수 있다. 하드웨어 로직 칩렛(1172) 및 로직 또는 I/O 칩렛(1174)은 적어도 부분적으로 구성 가능한 로직 또는 고정 기능 로직 하드웨어로 구현될 수 있으며, 프로세서 코어(들), 그래픽 프로세서(들), 병렬 프로세서 또는 본 명세서에 설명된 다른 가속기 장치 중 임의의 것의 하나 이상의 부분을 포함할 수 있다. 메모리 칩렛(1175)은 DRAM(예를 들어, GDDR, HBM) 메모리 또는 캐시(SRAM) 메모리일 수 있다.
각각의 칩렛은 개별 반도체 다이로서 제조될 수 있고 상호 접속 구조(1173)를 통해 기판(1180)에 연결될 수 있다. 상호 접속 구조(1173)는 다양한 칩렛과 기판(1180) 내의 로직 사이에서 전기 신호를 라우팅하도록 구성될 수 있다. 상호 접속 구조(1173)는 범프 또는 기둥과 같은 상호 접속부를 포함할 수 있지만, 이에 한정되는 것은 아니다. 일부 실시예에서, 상호 접속 구조(1173)는, 예를 들어, 로직, 입력/출력(I/O) 및 메모리 칩렛의 동작과 관련된 I/O 신호 및/또는 전력 또는 접지 신호와 같은 전기 신호를 라우팅하도록 구성될 수 있다.
일부 실시예에서, 기판(1180)은 에폭시계 라미네이트 기판이다. 기판(1180)은 다른 실시예에서 다른 적합한 타입의 기판을 포함할 수 있다. 패키지 어셈블리(1190)는 패키지 상호 접속부(1183)를 통해 다른 전기 장치에 접속될 수 있다. 패키지 상호 접속부(1183)는 기판(1180)의 표면에 연결되어 전기 신호를 마더보드, 다른 칩셋 또는 멀티-칩 모듈과 같은 다른 전기 장치로 라우팅할 수 있다.
일부 실시예에서, 로직 또는 I/O 칩렛(1174) 및 메모리 칩렛(1175)은 로직 또는 I/O 칩렛(1174)과 메모리 칩렛(1175) 사이에서 전기 신호를 라우팅하도록 구성된 브리지(1187)를 통해 전기적으로 연결될 수 있다. 브리지(1187)는 전기 신호에 대한 경로를 제공하는 밀집된 상호 접속 구조일 수 있다. 브리지(1187)는 유리 또는 적절한 반도체 재료로 구성된 브리지 기판을 포함할 수 있다. 전기적 라우팅 특징부가 브리지 기판 상에 형성되어 로직 또는 I/O 칩렛(1174)과 메모리 칩렛(1175) 사이에 칩과 칩의 접속을 제공할 수 있다. 브리지(1187)는 또한 실리콘 브리지 또는 상호 접속 브리지로 지칭될 수 있다. 예를 들어, 일부 실시예에서 브리지(1187)는 EMIB(Embedded Multi-die Interconnect Bridge)이다. 일부 실시예에서, 브리지(1187)는 단순히 하나의 칩렛에서 다른 칩렛으로의 직접 접속일 수 있다.
기판(1180)은 I/O(1191), 캐시 메모리(1192) 및 다른 하드웨어 로직(1193)을 위한 하드웨어 컴포넌트를 포함할 수 있다. 패브릭(1185)은 기판(1180)에 내장되어 기판(1180) 내의 다양한 로직 칩렛과 로직(1191, 1193) 사이의 통신을 가능하게 한다. 일 실시예에서, I/O(1191), 패브릭(1185), 캐시, 브리지 및 다른 하드웨어 로직(1193)은 기판(1180)의 위쪽에 층을 이루는 베이스 다이에 통합될 수 있다.
다양한 실시예에서, 패키지 어셈블리(1190)는 패브릭(1185) 또는 하나 이상의 브리지(1187)에 의해 상호 접속된 더 적거나 더 많은 개수의 컴포넌트 및 칩렛을 포함할 수 있다. 패키지 어셈블리(1190) 내의 칩렛은 3D 또는 2.5D 배열로 배열될 수 있다. 일반적으로, 브리지 구조(1187)는, 예를 들어, 로직 또는 I/O 칩렛과 메모리 칩렛 사이의 포인트-투-포인트 상호 접속을 용이하게 하는데 사용될 수 있다. 패브릭(1185)은 다양한 로직 및/또는 I/O 칩렛(예를 들어, 칩렛(1172, 1174, 1191, 1193))을 다른 로직 및/또는 I/O 칩렛에 상호 접속하는데 사용될 수 있다. 일 실시예에서, 기판 내의 캐시 메모리(1192)는 패키지 어셈블리(1190)를 위한 전역 캐시, 분산된 전역 캐시의 일부, 또는 패브릭(1185)을 위한 전용 캐시로서 동작할 수 있다.
도 11d는 일 실시예에 따른 교환 가능한 칩렛(1195)을 포함하는 패키지 어셈블리(1194)를 도시한다. 교환 가능한 칩렛(1195)은 하나 이상의 베이스 칩렛(1196, 1198) 상의 표준화된 슬롯에 조립될 수 있다. 베이스 칩렛(1196, 1198)은 본 명세서에 설명된 다른 브리지 상호 접속부와 유사할 수 있는 브리지 상호 접속부(1197)를 통해 연결될 수 있으며, 예를 들어, EMIB일 수 있다. 메모리 칩렛은 또한 브리지 상호 접속부를 통해 로직 또는 I/O 칩렛에 연결될 수 있다. I/O 및 로직 칩렛은 상호 접속 패브릭을 통해 통신할 수 있다. 베이스 칩렛은 각각 로직 또는 I/O 또는 메모리/캐시 중 하나에 대해 표준화된 포맷으로 하나 이상의 슬롯을 지원할 수 있다.
일 실시예에서, SRAM 및 전력 전달 회로는 하나 이상의 베이스 칩렛(1196, 1198)으로 제조될 수 있으며, 이 베이스 칩렛(1196, 1198)은 베이스 칩렛의 상부에 적층된 교환 가능한 칩렛(1195)과는 상이한 프로세스 기술을 사용하여 제조될 수 있다. 예를 들어, 베이스 칩렛(1196, 1198)은 더 큰 공정 기술을 사용하여 제조될 수 있는 반면, 교환 가능한 칩렛은 더 작은 공정 기술을 사용하여 제조될 수 있다. 하나 이상의 교환 가능한 칩렛(1195)은 메모리(예를 들어, DRAM) 칩렛일 수 있다. 전력 및/또는 패키지 조립체(1194)를 사용하는 제품에 대한 목표 성능에 따라 상이한 메모리 밀도가 패키지 조립체(1194)에 대해 선택될 수 있다. 또한, 상이한 개수의 기능 유닛의 타입을 갖는 로직 칩렛은 전력 및/또는 제품에 대한 목표 성능에 따라 조립시에 선택될 수 있다. 또한, 서로 다른 타입의 IP 로직 코어를 포함하는 칩렛을 교환 가능한 칩렛 슬롯에 삽입하여, 상이한 기술의 IP 블록을 혼합하고 매칭시킬 수 있는 하이브리드 프로세서 설계가 가능하다.
예시적인 시스템 온 칩 집적 회로
도 12 내지 도 14는 본 명세서에 설명된 다양한 실시예에 따라 하나 이상의 IP 코어를 사용하여 제조될 수 있는 예시적인 집적 회로 및 관련 그래픽 프로세서를 도시한다. 도시된 것에 더하여, 추가 그래픽 프로세서/코어, 주변 장치 인터페이스 제어기, 또는 범용 프로세서 코어를 포함하는 다른 로직 및 회로가 포함될 수 있다.
도 12는 일 실시예에 따른 하나 이상의 IP 코어를 사용하여 제조될 수 있는 예시적인 시스템 온 칩 집적 회로(1200)을 도시하는 블록도이다. 예시적인 집적 회로(1200)는 하나 이상의 애플리케이션 프로세서(들)(1205)(예를 들어, CPU), 적어도 하나의 그래픽 프로세서(1210)를 포함하고, 이미지 프로세서(1215) 및/또는 비디오 프로세서(1220)를 추가로 포함할 수 있으며, 이들 중 임의의 것은 동일하거나 또는 복수의 다른 설계 시설로부터 제조된 모듈식 IP 코어일 수 있다. 집적 회로(1200)는 USB 제어기(1225), UART 제어기(1230), SPI/SDIO 제어기(1235) 및 I2S/I2C 제어기(1240)를 포함하는 주변 장치 또는 버스 로직을 포함한다. 또한, 집적 회로는 하나 이상의 HDMI(high-definition multimedia interface) 제어기(1250) 및 MIPI(mobile industry processor interface) 디스플레이 인터페이스(1255)에 연결된 디스플레이 장치(1245)를 포함할 수 있다. 플래시 메모리 및 플래시 메모리 제어기를 포함하는 플래시 메모리 서브시스템(1260)에 의해 스토리지가 제공될 수 있다. 메모리 인터페이스는 SDRAM 또는 SRAM 메모리 장치에 액세스하기 위한 메모리 제어기(1265)를 통해 제공될 수 있다. 일부 집적 회로는 내장형 보안 엔진(1270)을 추가로 포함한다.
도 13 및 도 14는 본 명세서에 설명된 실시예에 따른, SoC 내에서 사용하기 위한 예시적인 그래픽 프로세서를 나타내는 블록도이다. 도 13은 일 실시예에 따른 하나 이상의 IP 코어를 사용하여 제조될 수 있는 시스템 온 칩 집적 회로의 예시적인 그래픽 프로세서(1310)를 도시한다. 도 14는 일 실시예에 따른 하나 이상의 IP 코어를 사용하여 제조될 수 있는 시스템 온 칩 집적 회로의 추가 예시적인 그래픽 프로세서(1340)를 도시한다. 도 13의 그래픽 프로세서(1310)는 저전력 그래픽 프로세서 코어의 예이다. 도 14의 그래픽 프로세서(1340)는 고성능 그래픽 프로세서 코어의 예이다. 그래픽 프로세서(1310, 1340) 각각은 도 12의 그래픽 프로세서(1210)의 변형일 수 있다.
도 13에 도시된 것과 같이, 그래픽 프로세서(1310)는 정점 프로세서(1305) 및 하나 이상의 프래그먼트 프로세서(들)(1315A-1315N)(예를 들어, 1315A, 1315B, 1315C, 1315D, 내지 1315N-1 및 1315N)를 포함한다. 그래픽 프로세서(1310)는 별개의 로직을 통해 상이한 셰이더 프로그램을 실행할 수 있으므로, 하나 이상의 프래그먼트 프로세서(들)(1315A-1315N)가 프래그먼트 또는 픽셀 셰이더 프로그램에 대한 프래그먼트(예를 들어, 픽셀) 셰이딩 동작을 실행하는 동안, 정점 프로세서(1305)는 정점 셰이더 프로그램에 대한 동작을 실행하도록 최적화한다. 정점 프로세서(1305)는 3D 그래픽 파이프라인의 정점 프로세싱 단계를 수행하고 프리미티브 및 정점 데이터를 생성한다. 프래그먼트 프로세서(들)(1315A-1315N)는 정점 프로세서(1305)에 의해 생성된 프리미티브 및 정점 데이터를 사용하여 디스플레이 디바이스 상에 디스플레이되는 프레임 버퍼를 생성한다. 일 실시예에서, 프래그먼트 프로세서(들)(1315A-1315N)는 OpenGL API에서 제공되는 프래그먼트 셰이더 프로그램을 실행하도록 최적화되며, Direct 3D API에서 제공되는 픽셀 셰이더 프로그램과 유사한 동작을 수행하는데 사용될 수 있다.
그래픽 프로세서(1310)는 하나 이상의 메모리 관리 유닛(MMU)(1320A, 1320B), 캐시(들)(1325A, 1325B) 및 회로 상호 접속부(들)(1330A, 1330B)를 추가로 포함한다. 하나 이상의 MMU(들)(1320A, 1320B)는, 하나 이상의 캐시(들)(1325A, 1325B)에 저장된 정점 또는 이미지/텍스처 데이터에 더하여 메모리에 저장된 정점 또는 이미지/텍스처를 참조할 수 있는, 정점 프로세서(1305) 및/또는 프래그먼트 프로세서(들)(1315A-1315N)를 포함하는 그래픽 프로세서(1310)에 대해 가상 주소를 물리 주소로 매핑한다. 일 실시예에서, 하나 이상의 MMU(들)(1320A, 1320B)는, 도 12의 하나 이상의 애플리케이션 프로세서(1205), 이미지 프로세서(1215) 및/또는 비디오 프로세서(1220)와 관련된 하나 이상의 MMU를 포함하는 시스템 내의 다른 MMU와 동기화되어, 각각의 프로세서(1205-1220)가 공유 또는 통합 가상 메모리 시스템에 참여할 수 있다. 하나 이상의 회로 상호 접속부(들)(1330A, 1330B)는, 그래픽 프로세서(1310)가 실시예에 따라 SoC의 내부 버스를 통해 또는 직접 접속을 통해 SoC 내의 다른 IP 코어와 인터페이스할 수 있도록 한다.
도 14에 도시된 것과 같이, 그래픽 프로세서(1340)는 도 13의 그래픽 프로세서(1310)의 하나 이상의 MMU(들)(1320A, 1320B), 캐시(들)(1325A, 1325B), 및 회로 상호 접속부(들)(1330A, 1330B)를 포함한다. 그래픽 프로세서(1340)는 하나 이상의 셰이더 코어(들)(1355A-1355N)(예를 들어, 1355A, 1355B, 1355C, 1355D, 1355E, 1355F 내지 1355N-1 및 1355N)를 포함하며, 이는, 단일 코어 또는 임의의 타입의 코어가 정점 셰이더, 프래그먼트 셰이더 및/또는 컴퓨팅 셰이더를 구현하는 셰이더 프로그램 코드를 포함하는 프로그램 가능한 셰이더 코드의 모든 타입을 실행할 수 있는 통합 셰이더 코어 아키텍처를 제공한다. 존재하는 셰이더 코어의 정확한 개수는 실시예 및 구현예에 따라 달라질 수 있다. 또한, 그래픽 프로세서(1340)는 스레드 디스패처로서 동작하여 실행 스레드를 하나 이상의 셰이더 코어(1355A-1355N)에 디스패치하는 코어 간(inter-core) 태스크 관리자(1345)와, 타일 기반 렌더링을 위한 타일링 동작을 가속화하는 타일링 유닛(1358)을 포함하고, 이 타일링 유닛에서는 장면에 대한 렌더링 작업이 이미지 공간에서 세분화되어, 예를 들어, 장면 내의 로컬 공간 일관성을 이용하거나 또는 내부 캐시의 사용을 최적화한다.
머신 학습을 이용한 광선 추적
앞서 언급된 바와 같이, 광선 추적은 물리적 기반 렌더링을 통해 광 전송이 시뮬레이션되는 그래픽 처리 기법이다. 광선 추적에서의 핵심 동작 중 하나는 경계 볼륨 계층 구조(Bounding Volume Hierarchy: BVH) 내의 노드의 탐색 및 교차 테스트를 요구하는 가시성 쿼리를 처리하는 것이다.
광선 추적 기반 기법 및 경로 추적 기반 기법은 각각의 픽셀을 통해서 광선 및 경로를 추적하고 음영(shadow), 윤기(glossiness), 간접 조명(indirect illumination) 등과 같은 고급 효과를 계산하는 데에 랜덤 샘플링(random sampling)을 사용함으로써 이미지를 계산한다. 소수의 샘플만을 사용하는 것은 빠르기는 하나 잡음성(noisy) 이미지를 산출하고 이에 반해 많은 샘플을 사용하는 것은 고품질 이미지를 산출하나, 가격이 엄청나다.
머신 학습은 지정된 작업의 성능을 점진적으로 개선하거나 점진적으로 더 정확한 예측 또는 결정을 내릴 수 있는 임의의 회로, 프로그램 코드 또는 이들의 조합을 포함한다. 일부 머신 학습 엔진은 이들 작업을 수행하거나 이들 예측/결정을 내리도록 명시적으로 프로그래밍되는 일 없이 이들 작업을 수행하거나 이들 예측/결정을 내릴 수 있다. 지도 및 반 지도 학습(supervised and semi-supervised learning), 비지도 학습 및 강화 학습을 포함하는(그러나 이에 국한되지 않음) 다양한 머신 학습 기법이 존재한다.
지난 몇 년 간에, 실시간 사용을 위한 광선/경로 추적에 대한 타개책이 "잡음제거"의 형태 - 잡음성의 저 샘플 카운트(low-sample count) 입력으로부터 고품질의 필터링된/잡음제거된 이미지를 산출하는 데에 이미지 처리 기법을 사용하는 프로세스 - 로 나왔다. 가장 효과적인 잡음제거 기법은, 잡음성 이미지가 더 많은 샘플을 이용하여 계산되었다면 이 잡음성 이미지가 어떻게 보였을지를 머신 학습 엔진이 학습하는 머신 학습 기법에 의존한다. 하나의 특정한 구현에서, 머신 학습은 콘볼루션 신경망(Convolutional Neural Network: CNN)에 의해 수행되는데, 다만, 본 발명의 기본 원리는 CNN 구현에 한정되지 않는다. 그러한 구현에서, 훈련 데이터는 저 샘플 카운트 입력 및 실측 자료(ground-truth)에 의해 산출된다. CNN은 잡음성 픽셀 입력들 중에서 해당 픽셀 주변의 이웃으로부터 수렴되는 픽셀을 예측하도록 훈련된다.
완벽하지는 않지만, 이 AI 기반 잡음제거 기법은 의외로 효과적인 것으로 판명되었다. 그러나, 주의사항(caveat)은 양호한 훈련 데이터가 요구된다는 것인데, 그렇지 않다면 그 망은 잘못된 결과를 예측할 수 있기 때문이다. 예를 들어, 애니메이션 영화 스튜디오가 육상에서의 장면을 가진 과거 영화에 대해 잡음제거 CNN을 훈련하였고, 이후 그 훈련된 CNN을 새 영화의 수상 세트(movie set on water)로부터의 프레임을 잡음제거하는 데에 사용하고자 시도하였다면, 잡음제거 동작은 최적으로 수행되지는 못할 것이다.
이 문제를 다루기 위해, 렌더링하는 동안에, 학습 데이터가 동적으로 수집될 수 있고, CNN과 같은 머신 학습 엔진이 자신이 현재 가동되고 있는 데이터에 기반하여 계속해서 훈련되는바, 이로써 당면한 작업에 대한 머신 학습 엔진을 계속해서 개선한다. 따라서, 런타임 전에 훈련 단계가 여전히 수행될 수 있으나, 런타임 동안에 필요에 따라 머신 학습 가중치를 계속해서 조절한다. 그에 따라, 매 프레임마다 또는 N개 프레임마다 이미지의 부영역(sub-region)으로 학습 데이터의 생성을 제한함으로써 훈련에 요구되는 참조 데이터(reference data)를 계산하는 데 드는 높은 비용을 피한다. 특히, 프레임의 잡음성 입력은 현재의 망을 이용하여 전(full) 프레임을 잡음제거하기 위해 생성된다. 추가로, 아래에서 기술되는 바와 같이, 연속적인 훈련을 위해 참조 픽셀의 작은 영역이 생성되고 사용된다.
본 명세서에서는 CNN 구현이 기술되나, 지도 학습(supervised learning)(가령, 입력 및 원하는 출력 양자 모두를 포함한 데이터의 세트의 수학적 모델을 구축하는 것), 비지도 학습(unsupervised learning)(가령, 소정 타입의 구조에 대해 입력 데이터를 평가하는 것) 및/또는 지도 학습과 비지도 학습의 조합을 수행하는 시스템을 포함하지만 이에 한정되지는 않는 임의의 형태의 머신 학습 엔진이 사용될 수 있다.
기존의 잡음 제거 구현은 훈련 단계 및 런타임 단계에서 동작한다. 훈련 단계 동안에, 픽셀 컬러, 깊이, 법선(normal), 법선 편차(normal deviation), 프리미티브 ID, 및 알베도(albedo)와 같은 다양한 픽셀당 데이터 채널을 갖는 NxN 픽셀의 영역을 수신하고 최종 픽셀 컬러를 생성하는 망 토폴로지(topology)가 정의된다. 1개 프레임어치의 저 샘플 카운트 입력을 사용하여, 그리고 매우 높은 샘플 카운트로써 계산된 "원하는" 픽셀 컬러를 참조하여 "표상적인"(representative) 훈련 데이터의 세트가 생성된다. 망은 이들 입력에 대해 훈련되어, 망을 위한 "이상적인" 가중치의 세트를 생성한다. 이들 구현에서, 참조 데이터는 망의 출력을 원하는 결과에 가장 가깝게 매칭하기 위해 망의 가중치를 훈련하는 데에 사용된다.
런타임에서, 주어진 사전계산된 이상적인 망 가중치가 로딩되고 망이 초기화된다. 각각의 프레임에 대해, 잡음제거 입력의 저 샘플 카운트 이미지(즉, 훈련을 위해 사용되는 것과 동일함)가 생성된다. 각각의 픽셀에 대해, 픽셀의 입력들 중 주어진 이웃으로 하여금 망을 통과하도록 해서, "잡음제거된" 픽셀 컬러를 예측함으로써, 잡음제거된 프레임을 생성한다.
도 15는 초기 훈련 구현예를 도시한다. 머신 학습 엔진(1500)(예를 들어, CNN)은 픽셀 컬러, 깊이, 법선, 법선 편차, 프리미티브 ID, 및 알베도(albedo)와 같은 다양한 픽셀 당 데이터 채널을 구비한 많은 샘플 카운트의 이미지 데이터(1502)로서 N x N 픽셀의 영역을 수신하고, 최종 픽셀 색상을 생성한다. 대표적인 훈련 데이터는 적은 샘플 카운트의 입력(1501)에 해당하는 하나의 프레임을 사용하여 생성된다. 네트워크는 이들 입력에 대해 훈련되어, 이후 머신 학습 엔진(1500)이 런타임에 적은 샘플 카운트 이미지의 노이즈를 제거하기 위해 사용하는 "이상적인" 가중치(1505)의 세트를 생성한다.
상기 기술을 개선하기 위해, 프레임 또는 프레임의 서브세트마다(예를 들어, N = 2, 3, 4, 10, 25 등인 매 N개의 프레임마다) 새로운 훈련 데이터를 생성하는 노이즈 제거 단계가 추가된다. 특히, 도 16에 도시된 것과 같이, 각각의 프레임에서 "새로운 참조 영역"(1602)으로 지칭되는 하나 이상의 영역이 선택되는데, 이는 많은 샘플 카운트로 렌더링되어 별도의 많은 샘플 카운트 버퍼(1604)로 보내진다. 적은 샘플 카운트 버퍼(1603)는 적은 샘플 카운트 입력 프레임(1601)(새로운 참조 영역(1602)에 대응하는 적은 샘플 영역(1607)을 포함함)을 저장한다.
새로운 참조 영역(1602)의 위치는 랜덤하게 선택된다. 이와 달리, 새로운 참조 영역(1602)의 위치는 각각의 새로운 프레임에 대해 사전-지정 방식으로 조정될 수 있다(예를 들어, 프레임들 사이의 영역의 사전 정의된 이동을 사용하여, 프레임의 중심에서 특정 영역으로 제한됨 등).
새로운 참조 영역이 어떻게 선택되는지에 관계없이, 머신 학습 엔진(1600)은 노이즈 제거에 사용되는 훈련된 가중치(1605)를 지속적으로 개선하고 업데이트하기 위해 새로운 참조 영역을 사용한다. 특히, 각각의 새로운 참조 영역(1602)으로부터의 참조 픽셀 컬러 및 대응하는 적은 샘플 카운트 영역(1607)으로부터의 노이즈가 많은 참조 픽셀 입력이 렌더링된다. 그 후, 많은 샘플 카운트 참조 영역(1602) 및 대응하는 적은 샘플 카운트 영역(1607)을 사용하여 머신 학습 엔진(1600)에 대한 보충 훈련이 수행된다. 초기 훈련과 달리, 이 훈련은 각각의 새로운 참조 영역(1602)에 대해 런타임 동안 연속적으로 수행되어, 머신 학습 엔진(1600)이 정확하게 훈련되는 것을 보장한다. 예를 들어, 픽셀 당 데이터 채널(예를 들어, 픽셀 색상, 깊이, 법선, 법선 편차 등)이 평가될 수 있고, 머신 학습 엔진(1600)은 이것을 사용하여 훈련된 가중치(1605)를 조정한다. 훈련의 경우(도 15)와 같이, 머신 학습 엔진(1600)은 적은 샘플 카운트 입력 프레임(1601)으로부터 노이즈를 제거하여 노이즈가 제거된 프레임(1620)을 생성하기 위한 이상적인 가중치 세트(1605)를 향해 훈련된다. 그러나, 훈련된 가중치(1605)는 적은 샘플 카운트 입력 프레임(1601)의 새로운 타입의 새로운 이미지 특성에 따라 지속적으로 업데이트된다.
머신 학습 엔진(1600)에 의해 수행되는 재훈련 동작은 그래픽 프로세서 유닛(GPU) 또는 호스트 프로세서 상의 백그라운드 프로세스에서 동시에 실행될 수 있다. 드라이버 컴포넌트 및/또는 GPU 하드웨어 컴포넌트로서 구현될 수 있는 렌더 루프는, 큐(queue)에 배치되는 새로운 훈련 데이터(예를 들어, 새로운 참조 영역(1602)의 형태)를 지속적으로 생성할 수 있다. GPU 또는 호스트 프로세서 상에서 실행되는 백그라운드 훈련 프로세스는 이 큐로부터 새로운 훈련 데이터를 지속적으로 판독하고 머신 학습 엔진(1600)을 다시 훈련하고 적절한 간격으로 새로운 가중치(1605)를 이용하여 업데이트할 수 있다.
도 17은 백그라운드 훈련 프로세스(1700)가 호스트 CPU(1710)에 의해 구현되는 일 구현예를 도시한다. 특히, 백그라운드 훈련 프로세스(1700)는 많은 샘플 카운트의 새로운 참조 영역(1602) 및 대응하는 적은 샘플 영역(1607)을 사용하여 훈련된 가중치(1605)를 지속적으로 업데이트하여, 머신 학습 엔진(1600)을 업데이트한다.
멀티-플레이어 온라인 게임의 비제한적 예에 대한 도 18a에 도시된 것과 같이, 상이한 호스트 머신(1820-1822)은 백그라운드 훈련 프로세스(1700A-C)가 서버(1800)(예를 들어, 게임 서버)로 전송하는 참조 영역을 개별적으로 생성한다. 이후, 서버(1800)는 각각의 호스트(1820-1822)로부터 수신된 새로운 참조 영역을 이용하여 머신 학습 엔진(1810)에 대한 훈련을 수행하고, 전술한 것과 같이 가중치(1805)를 업데이트한다. 이 가중치(1805)를 가중치(1605A-C)를 저장하는 호스트 머신(1820-1822)에 전송하여, 각각의 개별 머신 훈련 엔진(도시되지 않음)을 업데이트한다. 서버(1800)는 단기간에 많은 수의 참조 영역을 제공받을 수 있기 때문에, 사용자에 의해 실행되는 임의의 주어진 애플리케이션(예를 들어, 온라인 게임)에 대한 가중치를 효율적이고 정확하게 업데이트할 수 있다.
도 18b에 도시된 것과 같이, 상이한 호스트 머신은(예를 들어, 전술한 훈련/참조 영역(1602)에 기초하여) 새로운 훈련된 가중치를 생성하고, 새로운 훈련된 가중치를 서버(1800)(예를 들어, 게임 서버)와 공유할 수 있거나, 또는 이와 달리, P2P 공유 프로토콜을 사용할 수 있다. 서버 상의 머신 학습 관리 컴포넌트(1811)는 각각의 호스트 머신으로부터 수신된 새로운 가중치를 사용하여 결합된 가중치 세트(1805)를 생성한다. 결합된 가중치(1805)는, 예를 들어, 새로운 가중치로부터 생성된 평균일 수 있고, 여기에 설명된 것과 같이 지속적으로 업데이트될 수 있다. 일단 생성되면, 결합된 가중치(1805)의 카피가 각각의 호스트 머신(1820-1822)에 전송되고 저장될 수 있으며, 호스트 머신(1820-1822)은 이후 여기에 설명된 것과 같이 결합된 가중치를 사용하여 노이즈 제거 동작을 수행할 수 있다.
반-폐루프 업데이트 메커니즘은 또한 하드웨어 제조자에 의해 사용될 수 있다. 예를 들어, 참조 네트워크는 하드웨어 제조자에 의해 분배된 드라이버의 일부로서 포함될 수 있다. 드라이버는 여기에 설명된 기술을 사용하여 새로운 훈련 데이터를 생성하고 이를 다시 하드웨어 제조자에게 지속적으로 제출하기 때문에, 하드웨어 제조자는 이 정보를 사용하여 다음 드라이버 업데이트를 위한 머신 학습 구현을 지속적으로 개선한다.
일 예시적 구현에서(예를 들어, 렌더링 팜에서의 배치 영화 렌더링에서) 렌더러는 새로 생성된 훈련 영역을, 시간에 따라 복수의 렌더 노드로부터 이 데이터를 수집하는 전용 서버 또는 데이터베이스(스튜디오의 렌더링 팜 내)로 전송한다. 별도의 머신에서 별도의 프로세스를 수행하면 스튜디오의 전용 노이즈 제거 네트워크가 지속적으로 향상되며, 새로운 렌더링 작업은 항상 최신의 훈련된 네트워크를 사용한다.
머신-학습 방법이 도 19에 도시되어 있다. 이 방법은 본 명세서에 설명된 아키텍처 상에서 구현될 수 있지만, 임의의 특정 시스템 또는 그래픽 프로세싱 아키텍처에 한정되는 것은 아니다.
1901에서, 초기 훈련 단계의 일부로서, 적은 샘플 카운트 이미지 데이터 및 많은 샘플 카운트 이미지 데이터가 복수의 이미지 프레임에 대해 생성된다. 1902에서, 머신-학습 노이즈 제거 엔진은 많은/적은 샘플 카운트 이미지 데이터를 사용하여 훈련된다. 예를 들어, 픽셀 특징과 관련된 컨볼루션 신경망 가중치 세트는 훈련에 따라 업데이트될 수 있다. 그러나, 임의의 머신-학습 아키텍처가 사용될 수 있다.
1903에서, 런타임에, 적은 샘플 카운트 이미지 프레임은 많은 샘플 카운트를 갖는 적어도 하나의 참조 영역과 함께 생성된다. 1904에서, 머신 학습 엔진 및/또는 별도의 훈련 로직(예를 들어, 백그라운드 훈련 모듈(1700))은 많은 샘플 카운트 참조 영역을 사용하여 머신 학습 엔진의 훈련을 지속적으로 개선한다. 예를 들어, 많은 샘플 카운트 참조 영역은 적은 샘플 카운트 이미지의 대응 부분과 결합하여 머신 학습 엔진(1904)에게 가장 효과적으로 노이즈 제거를 수행하는 방법을 지속적으로 가르치는 데 사용될 수 있다. 예를 들어 CNN 구현에서, 이것은 CNN과 관련된 가중치를 업데이트하는 것을 포함할 수 있다.
머신 학습 엔진으로의 피드백 루프를 구성하는 방식, 훈련 데이터를 생성하는 엔티티, 훈련 데이터를 훈련 엔진에 피드백하는 방식 및 개선된 네트워크를 렌더링 엔진에 제공하는 방법과 같은, 전술한 복수의 변형이 구현될 수 있다. 또한, 전술한 예는 단일 참조 영역을 사용하여 지속적 훈련을 수행하지만, 임의의 개수의 참조 영역이 사용될 수 있다. 또한, 전술한 것과 같이, 참조 영역은 상이한 크기일 수 있고, 상이한 개수의 이미지 프레임 상에서 사용될 수 있고, 상이한 기술을 사용하여 이미지 프레임 내에 상이한 위치에 위치할 수 있다(예를 들어, 랜덤하게 또는 사전 결정된 패턴에 따라 등).
또한, 머신 학습 엔진(1600)의 일례로서 CNN을 설명하였지만, 본 발명의 기본 원리는 새로운 훈련 데이터를 사용하여 결과를 지속적으로 개선할 수 있는 임의의 형태의 머신 학습 엔진을 사용하여 구현될 수 있다. 예를 들어 다른 머신 학습 구현예를 몇 가지 언급하면, GMDH(group method of data handling), 장기 단기 메모리(long short-term memory), 심층 축적 컴퓨팅(deep reservoir computing), 심층 신뢰 네트워크(deep belief networks), 텐서 심층 스태킹 네트워크(tensor deep stacking networks) 및 심층 예측 코딩 네트워크(deep predictive coding netwokrs)를 포함하지만 이에 한정되지 않는다.
효율적인 분산 노이즈 제거 장치 및 방법
전술한 것과 같이, 노이즈 제거는 매끄럽고 노이즈 없는 이미지를 갖는 실시간 광선 추적을 위한 중요한 특징이 되었다. 복수의 장치 상의 분산 시스템에 걸쳐 렌더링이 수행될 수 있지만, 지금까지 기존의 노이즈 제거 프레임워크는 모두 단일 시스템 상의 단일 인스턴스에서 동작한다. 렌더링이 복수의 장치에 걸쳐 수행되면, 복수의 장치는 이미지의 노이즈가 제거된 부분을 컴퓨팅하기 위해 액세스할 수 있는 렌더링된 픽셀을 모두 갖지 못할 수도 있다.
인공 지능(AI) 및 비-AI 기반의 노이즈 제거 기술과 함께 작동하는 분산 노이즈 제거 알고리즘이 제시된다. 이미지의 영역은 분산 렌더링 동작을 통해 노드에 이미 분산되어 있거나 또는 단일 프레임버퍼에서 분리되어 분산되어 있다. 충분한 노이즈 제거를 컴퓨팅하는데 필요한 인접 영역의 고스트 영역은 필요할 때에 인접 노드로부터 수집되며, 최종 결과 타일은 최종 이미지로 합성된다.
분산 프로세싱
도 20은 렌더링을 수행하는 복수의 노드(2021-2023)를 도시한다. 간략화를 위해 단지 3개의 노드만이 도시되어 있지만, 본 발명의 기본 원리는 임의의 특정 개수의 노드로 한정되지 않는다. 실제로, 단일 노드가 본 발명의 특정 실시예를 구현하기 위해 사용될 수 있다.
노드(2021-2023)는 각각 이미지의 일부를 렌더링하여, 이 예에서, 영역(2011-2013)을 산출한다. 도 20에는 직사각형 영역(2011-2013)이 도시되어 있지만, 임의의 형상의 영역이 사용될 수 있고, 임의의 장치가 임의의 개수의 영역을 프로세싱할 수 있다. 충분히 부드러운 노이즈 제거 동작을 수행하기 위해 노드에 필요한 영역을 고스트 영역(2001-2003)이라고 한다. 다시 말해서, 고스트 영역(2001-2003)은 특정 품질 레벨에서 노이즈 제거를 수행하는 데 필요한 데이터 전체를 나타낸다. 품질 레벨을 낮추면 고스트 영역의 크기 및 그에 따른 필요한 데이터 양이 줄어들고, 품질 레벨을 높이면 고스트 영역 및 대응하는 필요한 데이터가 증가한다.
노드(2021)와 같은 노드가 특정 품질 레벨로 자신의 영역(2011)의 노이즈를 제거하는 데 필요한 고스트 영역(2001)의 일부의 로컬 카피를 갖는 경우, 그 노드는, 도시된 것과 같이 고스트 영역(2001)의 일부를 소유하는 노드(2022)와 같은 하나 이상의 "인접" 노드로부터 필요한 데이터를 검색할 것이다. 유사하게, 노드(2022)가 특정 품질 레벨로 자신의 영역(2012)의 노이즈를 제거하는 데 필요한 고스트 영역(2002)의 일부의 로컬 카피를 갖는 경우, 노드(2022)는 노드(2021)로부터 필요한 고스트 영역 데이터(2032)를 검색할 것이다. 검색은 버스, 상호 접속부, 고속 메모리 패브릭, 네트워크(예를 들어, 고속 이더넷)를 통해 수행되거나, 또는(예를 들어, 극단적 해상도에서 또는 시간 변화에 따라 큰 이미지를 렌더링하는데 사용되는) 복수의 코어 사이에서 렌더링 작업을 분산시킬 수 있는 멀티-코어 칩의 온-칩 상호 접속부를 통해 수행될 수도 있다. 각각의 노드(2021-2023)는 그래픽 프로세서 내에 개별 실행 유닛 또는 실행 유닛의 지정된 세트를 포함할 수 있다.
전송될 데이터의 특정 양은 사용되는 노이즈 제거 기술에 의존한다. 또한, 고스트 영역으로부터의 데이터는 각각의 영역의 노이즈 제거를 개선하는데 필요한 임의의 데이터를 포함할 수 있다. 예를 들어, 고스트 영역 데이터는 이미지 컬러/파장, 강도/알파 데이터 및/또는 법선을 포함할 수 있다. 그러나, 본 발명의 기본 원리는 임의의 고스트 영역 데이터의 임의의 특정 세트로 한정되지 않는다.
추가 세부 사항
더 느린 네트워크 또는 상호 접속부에 대해, 기존의 범용 무손실 또는 손실 압축을 사용하여 이 데이터의 압축을 이용할 수 있다. 그 예로는 zlib, gzip 및 LZMA(Lempel-Ziv-Markov chain algorithm)이 있지만, 이에 한정되는 것은 아니다. 프레임 사이의 광선 히트 정보의 델타가 상당히 희박할 수 있으며, 노드가 이전 프레임으로부터 수집된 델타를 이미 가지고 있는 경우 그 델타에 기여하는 샘플만이 전송될 필요가 있다는 점을 고려하면, 컨텐츠-지정 압축도 또한 사용될 수 있다. 이들은 샘플을 수집하는 노드 i로 선택적으로 푸시될 수 있거나, 또는 노드 i가 다른 노드로부터 샘플을 요청할 수 있다. 무손실 압축은 특정 타입의 데이터 및 프로그램 코드에 사용되는 반면, 손실 압축은 다른 타입의 데이터에 사용된다.
도 21은 노드(2021, 2022) 사이의 트랜잭션의 추가 세부 사항을 도시한다. 각각의 노드(2021, 2022)는 각각의 이미지 영역(2011, 2012) 및 고스트 영역(2001, 2002)을 렌더링하기 위한 광선 추적 렌더링 회로(2081, 2082)를 포함한다. 디노이저(denoiser)(2100, 2111)는 각각 영역(2011, 2012)에서 노이즈 제거 동작을 실행하며, 각각의 노드(2021, 2022)는 렌더링 및 노이즈 제거를 담당한다. 디노이저(2100, 2111)는, 예를 들어, 노이즈가 제거된 영역(2121, 2122)을 각각 생성하기 위해 회로, 소프트웨어 또는 이들의 임의의 조합을 포함할 수 있다. 전술한 것과 같이, 노이즈가 제거된 영역을 생성할 때, 디노이저(2100, 2111)는 다른 노드가 소유한 고스트 영역 내의 데이터에 의존할 필요가 있을 수 있다(예를 들어, 디노이저(2100)는 노드(2022)가 소유한 고스트 영역(2002)로부터의 데이터를 필요로 할 수 있다).
따라서, 디노이저(2100, 2111)는 영역(2011, 2012) 및 각각 적어도 일부가 다른 노드로부터 수신될 수 있는 고스트 영역(2001, 2002)으로부터의 데이터를 사용하여 노이즈가 제거된 영역(2121, 2122)을 생성한다. 영역 데이터 관리자(2101, 2102)는 본 명세서에 설명된 것과 같이 고스트 영역(2001, 2002)으로부터의 데이터 전송을 관리한다. 압축기/압축 해제기 유닛(2131, 2132)은 각각 노드(2021, 2022) 사이에서 교환되는 고스트 영역 데이터의 압축 및 압축 해제를 수행한다.
예를 들어, 노드(2021)의 영역 데이터 관리자(2101)는 노드(2022)로부터의 요청에 따라 고스트 영역(2001)으로부터 압축기/압축 해제기(2131)로 데이터를 전송할 수 있으며, 압축기/압축 해제기(2131)는 이 데이터를 압축하고 압축된 데이터(2106)를 생성하여 이를 노드(2022)로 전송하므로, 상호 접속부, 네트워크, 버스 또는 다른 데이터 통신 링크를 통한 대역폭을 감소시킬 수 있다. 이후, 노드(2022)의 압축기/압축 해제기(2132)는 압축된 데이터(2106)를 압축 해제하고, 디노이저(2111)는 압축 해제된 고스트 데이터를 사용하여 영역(2012)으로부터의 데이터만으로 가능한 것보다 고품질의 노이즈가 제거된 영역(2012)을 생성한다. 영역 데이터 관리자(2102)는 노이즈가 제거된 영역(2122)을 생성할 때 디노이저(2111)가 이용할 수 있도록 고스트 영역(2001)으로부터의 압축 해제된 데이터를 캐시, 메모리, 레지스터 파일 또는 다른 스토리지에 저장할 수 있다. 고스트 영역(2002)으로부터의 데이터를 노드(2021) 상의 디노이저(2100)에 제공하고, 디노이저(2100)에서 이 데이터를 영역(2011)으로부터의 데이터와 함께 사용하여 고품질의 노이즈가 제거된 영역(2121)을 생성하기 위해 유사한 동작 세트가 수행될 수 있다.
데이터 그랩 또는 렌더링
노드(2021, 2022)와 같은 장치들 사이의 접속이 느리면(즉, 임계 대기 시간 및/또는 임계 대역폭보다 낮으면), 다른 장치로부터 결과를 요청하는 것보다 고스트 영역을 국부적으로 렌더링하는 것이 더 빠를 수 있다. 이것은 네트워크 트랜잭션 속도와 고스트 영역 크기에 대한 선형 외삽 렌더링 시간을 트래킹하여 런타임에서 결정될 수 있다. 전체 고스트 영역을 렌더링하는 것이 더 빠른 경우, 복수의 장치는 결국 이미지의 동일한 부분을 렌더링할 수 있다. 고스트 영역의 렌더링된 부분의 해상도는 베이스 영역의 변동 및 결정된 흐림의 정도에 따라 조정될 수 있다.
로드 밸런싱
정적 및/또는 동적 로드 밸런싱 방식은 다양한 노드(2021-2023) 사이에서 로드 프로세싱을 분산시키는데 사용될 수 있다. 동적 로드 밸런싱의 경우, 노이즈 제거 필터에 의해 결정된 변동은 노이즈 제거에 더 많은 시간을 필요로 하지만, 장면의 특정 영역을 렌더링하는데 사용되는 샘플의 양에 있어서는, 이미지의 변동이 적고 흐릿한 영역에 대해서는 더 적은 샘플이 필요하다. 특정 노드에 할당된 특정 영역은 이전 프레임의 데이터를 기반으로 동적으로 조정되거나 또는 렌더링될 때 장치간에 동적으로 통신될 수 있으므로, 모든 장치가 동일한 양의 작업을 가지게 될 것이다.
도 22는 각각의 노드(2021, 2022) 상에서 동작하는 모니터(2201, 2202)가 네트워크 인터페이스(2211, 2212)를 통해 데이터를 전송하는데 소비된 시간,(고스트 영역 데이터를 사용하여 그리고 사용하지 않으면서) 영역의 노이즈를 제거할 때 소비된 시간, 및 각각의 영역/고스트 영역을 렌더링하는데 소요된 시간을 포함하지만 이에 한정되지 않는 성능 메트릭스 데이터를 어떻게 수집하는지를 도시한다. 모니터(2201, 2202)는 이러한 성능 메트릭스를 관리자 또는 로드 밸런서 노드(2201)로 다시 보고하고, 로드 밸런서 노드(2201)는 데이터를 분석하여 각 노드(2021, 2022)의 현재 워크로드를 식별하고 다양한 노이즈가 제거된 영역(2121, 2122)을 프로세싱할 보다 효율적인 모드를 잠정적으로 결정한다. 이후, 관리자 노드(2201)는 새로운 영역에 대한 새로운 워크로드를 검출된 부하에 따라 노드(2021, 2022)에 분산시킨다. 예를 들어, 관리자 노드(2201)는 과도하게 로딩되지 않은 노드에 더 많은 작업을 전송하고/하거나 과도하게 로딩된 노드로부터 작업을 재할당할 수 있다. 또한, 로드 밸런서 노드(2201)는 각각의 노드에 의해 렌더링 및/또는 노이즈 제거가 수행되는 특정 방식을 조정하기 위해 재구성 커맨드를 전송할 수 있다(이에 대한 일부 예는 전술됨).
고스트 영역 결정
고스트 영역(2001, 2002)의 크기 및 형상은 디노이저(2100, 2111)에 의해 구현된 노이즈 제거 알고리즘에 따라 결정될 수 있다. 이후, 고스트 영역의 각각의 크기는 노이즈가 제거된 샘플의 감지된 변동에 따라 동적으로 수정될 수 있다. AI 노이즈 제거 자체에 사용되는 학습 알고리즘은 적절한 영역 크기를 결정하는 데 사용될 수 있거나, 또는 양방향 블러와 같은 다른 경우에는 사전 결정된 필터 폭이 고스트 영역(2001, 2002)의 크기를 결정할 것이다. 학습 알고리즘을 사용하는 예시적 구현에서, 머신 학습 엔진은 관리자 노드(2201) 상에서 실행될 수 있고/있거나 머신 학습의 일부는 각각의 개별 노드(2021-2023)에서 실행될 수 있다(예를 들어, 도 18a 및 도 18b와 전술한 관련 텍스트 참조).
최종 이미지 획득
최종 이미지는 고스트 영역 또는 법선이 필요없이, 각각의 노드(2021-2023)로부터 렌더링 및 노이즈가 제거된 영역을 수집함으로써 생성된다. 도 22에서, 예를 들어, 노이즈가 제거된 영역(2121, 2122)은 관리자 노드(2201)의 영역 프로세서(2280)로 전송되고, 여기에서 영역들을 결합하여 최종 노이즈가 제거된 이미지(2290)를 생성한 다음, 디스플레이(2290)에 디스플레이된다. 영역 프로세서(2280)는 다양한 2D 합성 기술을 사용하여 영역을 결합한다. 별도의 컴포넌트로서 도시되어 있지만, 영역 프로세서(2280) 및 노이즈가 제거된 이미지(2290)는 디스플레이(2290)에 통합될 수 있다. 다양한 노드(2021, 2022)는 노이즈가 제거된 영역(2121, 2122)을 전송하는 직접 전송 기술을 사용할 수 있고, 또한 영역 데이터의 다양한 손실 또는 무손실 압축을 잠재적으로 사용할 수 있다.
AI 노이즈 제거는 게임이 클라우드로 이동함에 따라 여전히 비용이 많이 드는 동작이다. 이와 같이, 전통적인 게임 또는 더 높은 프레임 레이트를 필요로 하는 가상 현실(VR)에서 실시간 프레임 레이트를 달성하기 위해 복수의 노드(2021, 2022)에 걸쳐 노이즈 제거 프로세싱을 분산시키는 것이 필요할 수 있다. 영화 스튜디오는 또한 종종 더 빠른 노이즈 제거를 위해 활용될 수 있는 대형 렌더링 팜에서 렌더링을 수행한다.
분산 렌더링 및 노이즈 제거를 수행하기 위한 예시적 방법이 도 23에 도시되어 있다. 이 방법은 전술한 시스템 아키텍처의 맥락 내에서 구현될 수 있지만, 임의의 특정 시스템 아키텍처로 한정되는 것은 아니다.
2301에서, 그래픽 작업은 이미지 프레임의 영역을 렌더링하기 위해 광선 추적 동작을 수행하는 복수의 노드로 디스패치된다. 각각의 노드는 동작을 수행하는 데 필요한 데이터를 메모리에 이미 가지고 있을 수 있다. 예를 들어, 둘 이상의 노드가 공통 메모리를 공유할 수 있거나 또는 노드의 로컬 메모리가 이전의 광선 추적 동작으로부터의 데이터를 이미 저장했을 수 있다. 이와 달리 또는 추가적으로, 특정 데이터가 각 노드로 전송될 수 있다.
2302에서, 특정 레벨(즉, 성능의 허용 가능한 레벨)의 노이즈 제거에 필요한 "고스트 영역"이 결정된다. 고스트 영역은 하나 이상의 다른 노드가 소유한 데이터를 포함하여 특정 레벨의 노이즈 제거를 수행하는 데 필요한 임의의 데이터를 포함한다.
2303에서, 고스트 영역(또는 그 일부)과 관련된 데이터가 노드 사이에서 교환된다. 2304에서, 각각의 노드는 각각의 영역에서(예를 들어, 교환된 데이터를 사용하여) 노이즈 제거를 수행하고, 2305에서 결과는 결합되어 최종 노이즈가 제거된 이미지 프레임을 생성한다.
도 22에 도시된 것과 같은 관리자 노드 또는 1차 노드는 작업을 노드에 디스패치한 다음 노드에 의해 수행된 작업을 결합하여 최종 이미지 프레임을 생성할 수 있다. 피어 기반 아키텍처가 사용될 수 있는데, 여기서 노드는 최종 이미지 프레임의 렌더링 및 노이즈 제거를 위해 데이터를 교환하는 피어(peer)이다.
본 명세서에 설명된 노드(예를 들어, 노드(2021-2023))는 고속 네트워크를 통해 상호 접속된 그래픽 프로세싱 컴퓨팅 시스템일 수 있다. 이와 달리, 노드는 고속 메모리 패브릭에 연결된 개별 프로세싱 요소일 수 있다. 모든 노드는 공통 가상 메모리 공간 및/또는 공통 물리 메모리를 공유할 수 있다. 이와 달리, 노드는 CPU와 GPU의 조합일 수 있다. 예를 들어, 전술한 관리자 노드(2201)는 CPU 및/또는 CPU 상에서 실행되는 소프트웨어일 수 있고, 노드(2021, 2022)는 GPU 및/또는 GPU 상에서 실행되는 소프트웨어일 수 있다. 본 발명의 기본 원리를 여전히 따르면서 다양한 상이한 타입의 노드가 사용될 수 있다.
예시적 신경망 구현
많은 타입의 신경망이 존재하며, 단순한 타입의 신경망은 피드포워드(feedforward) 네트워크이다. 피드포워드 네트워크는 노드가 계층으로 배열되는 비순환 그래프로서 구현될 수 있다. 일반적으로, 피드포워드 네트워크 토폴로지는 적어도 하나의 숨겨진 계층에 의해 분리된 입력 계층과 출력 계층을 포함한다. 숨겨진 계층은 입력 계층에 의해 수신된 입력을 출력 계층에서 출력을 생성하는데 유용한 표현으로 변환한다. 네트워크 노드는 에지를 통해 인접한 계층의 노드에 완전히 접속되어 있지만 각 계층 내의 노드 사이에는 에지가 없다. 피드포워드 네트워크의 입력 계층의 노드에서 수신된 데이터는 계층을 접속하는 각각의 에지와 각각 관련된 계수("가중치")에 기초하여 네트워크에서 각각의 연속 계층의 노드 상태를 계산하는 활성화 기능을 통해 출력 계층의 노드로 전파(즉, "피드포워드")된다. 실행되는 알고리즘으로 표현되는 특정 모델에 따라 신경망 알고리즘의 출력은 다양한 형태를 취할 수 있다.
머신 학습 알고리즘이 특정 문제를 모델링하기 위해 사용될 수 있기 전에, 알고리즘은 훈련 데이터 세트를 사용하여 훈련된다. 신경망 훈련은 네트워크 토폴로지를 선택하고, 네트워크가 모델링하는 문제를 나타내는 훈련 데이터 세트를 사용하고, 훈련 모델 세트의 모든 인스턴스에 대해 최소 오류로 네트워크 모델이 수행될 때까지 가중치를 조정하는 것을 포함한다. 예를 들어, 신경망에 대한 지도 학습 훈련 과정 동안, 훈련 데이터 세트에서 인스턴스를 나타내는 입력에 대한 응답으로 네트워크에 의해 생성된 출력은 해당 인스턴스에 대한 "정확한" 것으로 표시된 출력과 비교되고, 출력과 표시된 출력의 차이를 나타내는 오류 신호가 계산되며, 오류 신호가 네트워크의 계층을 통해 역방향으로 전파되고 해당 오류를 최소화하도록 접속과 관련된 가중치가 조정된다. 훈련 데이터 세트의 인스턴스로부터 생성된 각 출력에 대한 에러가 최소화될 때 네트워크는 "훈련된" 것으로 간주된다.
머신 학습 알고리즘의 정확도는 알고리즘을 훈련하는데 사용되는 데이터 세트의 품질에 의해 크게 영향을 받을 수 있다. 훈련 과정은 계산 집약적일 수 있고 종래의 범용 프로세서에서 상당한 시간을 필요로 할 수 있다. 따라서, 병렬 프로세싱 하드웨어가 사용되어 많은 타입의 머신 학습 알고리즘을 훈련한다. 이것은 신경망의 계수를 조정하는데 수행된 계산이 본질적으로 병렬 구현에 적합하므로 신경망 훈련을 최적화하는데 특히 유용하다. 특히, 많은 머신 학습 알고리즘 및 소프트웨어 애플리케이션은 범용 그래픽 프로세싱 장치 내에서 병렬 프로세싱 하드웨어를 사용하도록 조정되었다.
도 24는 머신 학습 소프트웨어 스택(2400)의 일반화된 도면이다. 머신 학습 애플리케이션(2402)은 훈련 데이터 세트를 사용하여 신경망을 훈련시키거나 또는 훈련된 심층 신경망을 사용하여 머신 지능을 구현하도록 구성될 수 있다. 머신 학습 애플리케이션(2402)은 신경망 및/또는 배치 전에 신경망을 훈련시키는데 사용될 수 있는 특수 소프트웨어를 위한 훈련 및 추론 기능을 포함할 수 있다. 머신 학습 애플리케이션(2402)은 이미지 인식, 매핑 및 위치 확인, 자율 내비게이션, 음성 합성, 의료 이미징 또는 언어 번역을 포함하지만 이에 한정되지 않는 임의의 타입의 머신 지능을 구현할 수 있다.
머신 학습 애플리케이션(2402)에 대한 하드웨어 가속은 머신 학습 프레임 프레임워크(2404)를 통해 활성화될 수 있다. 머신 학습 프레임워크(2404)는 본 명세서에 설명된 프로세서 및 컴포넌트를 포함하는 프로세싱 시스템(100)과 같은 본 명세서에 설명된 하드웨어 상에서 구현될 수 있다. 본 명세서의 임의의 다른 도면의 요소와 동일하거나 유사한 명칭을 갖는 도 24에 대해 설명된 요소는 다른 도면에서와 동일한 요소를 설명하고, 그와 유사한 방식으로 동작하거나 기능할 수 있고, 본 명세서의 다른 곳에서 설명된 것과 동일한 컴포넌트를 포함할 수 있으며 다른 엔티티에 연결될 수 있지만, 이에 한정되지는 않는다. 머신 학습 프레임워크(2404)는 머신 학습 프리미티브의 라이브러리를 제공할 수 있다. 머신 학습 프리미티브는 머신 학습 알고리즘에 의해 일반적으로 수행되는 기본적인 동작이다. 머신 학습 프레임워크(2404)가 없다면, 머신 학습 알고리즘의 개발자는 머신 학습 알고리즘과 관련된 주요 계산 로직을 생성 및 최적화한 다음 새로운 병렬 프로세서가 개발됨에 따라 계산 로직을 다시 최적화해야 한다. 대신에, 머신 학습 애플리케이션은 머신 학습 프레임워크(2404)에 의해 제공되는 프리미티브를 사용하여 필요한 계산을 수행하도록 구성될 수 있다. 예시적인 프리미티브는 텐서 컨벌루션, 활성화 기능 및 풀링을 포함하고, 이들은 컨볼루션 신경망(CNN)을 훈련하는 동안 수행되는 계산 동작이다. 머신 학습 프레임워크(2404)는 또한 매트릭스 및 벡터 연산과 같은 많은 머신 학습 알고리즘에 의해 수행되는 기본 선형 대수 서브프로그램을 구현하는 프리미티브를 제공할 수 있다.
머신 학습 프레임워크(2404)는 머신 학습 애플리케이션(2402)으로부터 수신된 입력 데이터를 프로세싱하고 컴퓨팅 프레임워크(2406)에 적절한 입력을 생성할 수 있다. 컴퓨팅 프레임워크(2406)는, 머신 학습 프레임워크(2404)가 GPGPU 하드웨어(2410)의 아키텍처에 대한 많은 지식을 가질 것을 요구하지 않고도 머신 학습 프레임워크(2404)가 GPGPU 하드웨어(2410)를 통한 하드웨어 가속의 이점을 이용할 수 있도록 GPGPU 드라이버(2408)에 제공되는 기본 명령어를 추상화할 수 있다. 또한, 컴퓨팅 프레임워크(2406)는 다양한 타입 및 세대의 GPGPU 하드웨어(2410)에 대해 머신 학습 프레임워크(2404)에 대한 하드웨어 가속을 가능하게 할 수 있다.
GPGPU 머신 학습 가속
도 25는 프로세싱 시스템(100)의 변형일 수 있는 멀티-GPU 컴퓨팅 시스템(2500)을 도시한다. 따라서, 본 명세서에서 프로세싱 시스템(100)과 결합된 임의의 특징의 개시는 또한 멀티-GPU 컴퓨팅 시스템(2500)과의 대응하는 결합을 개시하지만, 이에 한정되지는 않는다. 본 명세서의 임의의 다른 도면의 요소와 동일하거나 유사한 명칭을 갖는 도 25의 요소는 다른 도면에서와 동일한 요소를 설명하고, 그와 유사한 방식으로 동작하거나 기능할 수 있고, 본 명세서의 다른 곳에서 설명된 것과 동일한 컴포넌트를 포함할 수 있으며 다른 엔티티에 연결될 수 있지만, 이에 한정되지는 않는다. 멀티-GPU 컴퓨팅 시스템(2500)은 호스트 인터페이스 스위치(2504)를 통해 복수의 GPGPU(2506A-2506D)에 연결된 프로세서(2502)를 포함할 수 있다. 예를 들어, 호스트 인터페이스 스위치(2504)는 프로세서(2502)를 PCI 익스프레스 버스에 연결하는 PCI 익스프레스 스위치 장치일 수 있는데, 프로세서(2502)는 PCI 익스프레스 버스를 거쳐 GPGPU 세트(2506A-2506D)와 통신할 수 있다. 복수의 GPGPU(2506A-2506D) 각각은 전술한 GPGPU의 인스턴스일 수 있다. GPGPU(2506A-2506D)는 고속 포인트-투-포인트 GPU-투-GPU 링크 세트(2516)를 통해 상호 접속될 수 있다. 고속 GPU-투-GPU 링크는 전용 GPU 링크를 통해 각각의 GPGPU(2506A-2506D)에 접속될 수 있다. P2P GPU 링크(2516)는 프로세서(2502)가 접속된 호스트 인터페이스 버스를 통한 통신을 필요로 하지 않고 각각의 GPGPU(2506A-2506D) 사이의 직접 통신을 가능하게 한다. P2P GPU 링크로 향하는 GPU-투-GPU 트래픽을 사용하면, 호스트 인터페이스 버스는 시스템 메모리 액세스에 이용될 수 있는 상태로 유지되거나 또는 예를 들어 하나 이상의 네트워크 장치를 통해 멀티-GPU 컴퓨팅 시스템(2500)의 다른 인스턴스와 통신할 수 있는 상태로 유지된다. GPGPU(2506A-2506D)를 호스트 인터페이스 스위치(2504)를 통해 프로세서(2502)에 접속하는 것 대신에, 프로세서(2502)는 P2P GPU 링크(2516)에 대한 직접적인 지원을 포함할 수 있고, 따라서, GPGPU(2506A-2506D)에 직접 접속할 수 있다.
머신 학습 신경망 구현
본 명세서에서 설명된 컴퓨팅 아키텍처는 머신 학습을 위한 신경망을 훈련 및 전개하는데 특히 적합한 병렬 처리의 타입을 수행하도록 구성될 수 있다. 신경망은 그래프 관계를 갖는 기능의 네트워크로서 일반화될 수 있다. 이 기술 분야에 잘 알려진 것과 같이, 머신 학습에 사용되는 신경망 구현예에는 다양한 타입이 존재한다. 하나의 예시적인 타입의 신경망은 전술한 것과 같은 피드포워드 네트워크이다.
신경망의 제 2 예시적인 타입은 컨볼루션 신경망(CNN)이다. CNN은 이미지 데이터와 같이 공지의 그리드형 토폴로지를 갖는 데이터를 프로세싱하기 위한 특수 피드포워드 신경망이다. 따라서, CNN은 컴퓨팅 비전 및 이미지 인식 애플리케이션에 일반적으로 사용되지만, 스피치 및 언어 프로세싱과 같은 다른 타입의 패턴 인식에도 사용될 수 있다. CNN 입력 계층의 노드는 "필터"(망막에서 발견되는 수용 필드에서 영감을 얻은 특징 검출기) 세트로 구성되며, 각 필터 세트의 출력은 네트워크의 연속 계층의 노드로 전파된다. CNN의 계산은 컨볼루션 수학 연산을 각 필터에 적용하여 해당 필터의 출력을 생성하는 것을 포함한다. 컨볼루션은 2개의 오리지널 함수 중 하나의 수정된 버전인 세 번째 함수를 생성하기 위해 2개의 함수에 의해 수행되는 특수한 종류의 수학적 연산이다. 컨볼루션 네트워크 용어에서는, 컨볼루션에 대한 첫 번째 함수를 입력이라고 하고, 두 번째 함수를 컨볼루션 커널(kernel)이라고 한다. 출력은 특징 맵(feature map)이라고 한다. 예를 들어, 컨볼루션 계층에 대한 입력은 입력 이미지의 다양한 컬러 컴포넌트를 정의하는 데이터의 다차원 배열일 수 있다. 컨볼루션 커널은 파라미터의 다차원 배열일 수 있으며, 여기서 파라미터는 신경망에 대한 훈련 과정에 의해 조정된다.
순환 신경망(RNN; recurrent neural network)은 계층들 사이의 피드백 접속을 포함하는 피드포워드 신경망의 계열이다. RNN은 신경망의 다른 부분에 걸쳐 파라미터 데이터를 공유함으로써 시퀀스 데이터의 모델링을 가능하게 한다. RNN의 아키텍처는 주기를 포함한다. RNN으로부터의 출력 데이터의 적어도 일부가 시퀀스에서 후속 입력을 프로세싱하기 위한 피드백으로서 사용되므로, 주기는 변수의 현재 값이 미래의 그 자체의 값에 미치는 영향을 나타낸다. 이러한 특징으로 인해 RNN은 언어 데이터를 구성할 수 있는 변수의 본질에 따른 언어 처리에 특히 유용하다.
이하에서 설명된 도면은 예시적인 피드포워드, CNN 및 RNN 네트워크를 제시하고, 또한 이러한 타입의 네트워크 각각을 각각 훈련하고 전개하기 위한 일반적인 과정을 설명한다. 이들 설명은 예시적이고 비제한적이며, 설명된 개념은 일반적으로 심층 신경망 및 머신 학습 기술에 일반적으로 적용될 수 있음을 이해할 수 있을 것이다.
전술한 예시적인 신경망은 딥 학습(deep learning)을 수행하는데 사용될 수 있다. 딥 러닝은 심층 신경망을 사용한 머신 학습이다. 딥 학습에 사용되는 심층 신경망은 단일의 숨겨진 계층만을 포함하는 얕은 신경망과 달리 복수 개의 숨겨진 계층으로 구성된 인공 신경망이다. 보다 더 심층의 신경망은 일반적으로 훈련에 더욱 계산 집약적이다. 그러나, 네트워크의 추가의 숨겨진 계층은 복수 단계 패턴 인식을 가능하게 하여 얕은 머신 학습 기술에 비해 출력 오류를 줄인다.
딥 러닝에 사용되는 심층 신경망은 전형적으로, 모델에 제공된 특징 표현에 기초하여 동작(예를 들어, 객체 분류, 음성 인식 등)을 수행할 수 있는 수학적 모델을 나타내는 백-엔드 네트워크에 연결된 특징 인식을 수행하는 프론트-엔드 네트워크를 포함한다. 딥 러닝을 사용하면, 모델에 대해 수동적으로 설계된 특징의 엔지니어링을 수행하지 않고도 머신 학습을 수행할 수 있다. 대신, 심층 신경망은 입력 데이터 내의 통계적 구조 또는 상관 관계를 기반으로 특징을 학습할 수 있다. 학습된 특징은 감지된 특징을 출력에 매핑할 수 있는 수학적 모델에 제공될 수 있다. 네트워크에서 사용하는 수학적 모델은 일반적으로 수행할 특정 작업에 특화되어 있으며 다른 모델은 다른 작업을 수행하는 데 사용된다.
신경망이 구성되면, 학습 모델이 네트워크에 적용되어 특정 태스크를 수행하도록 네트워크를 훈련시킬 수 있다. 학습 모델은 모델 내의 가중치를 조정하여 네트워크의 출력 오류를 줄이는 방법을 설명한다. 오류의 역전파는 신경망을 훈련하는데 사용되는 일반적인 방법이다. 프로세싱을 위해 입력 벡터가 네트워크에 제공된다. 네트워크의 출력은 손실 함수를 사용하여 원하는 출력과 비교되며, 출력 계층의 각각의 뉴런에 대해 오류 값이 계산된다. 오류 값은 각각의 뉴런이 오리지널 출력에 대한 기여를 대략적으로 나타내는 관련 오류 값을 가질 때까지 역전파된다. 그러면, 네트워크는 확률적 감소 그래디언트 알고리즘(stochastic gradient descent algorithm)과 같은 알고리즘을 사용하여 이러한 오류로부터 학습하여, 신경망의 가중치를 업데이트할 수 있다.
도 26 및 도 27은 예시적인 컨볼루션 신경망을 도시한다. 도 26은 CNN 내의 다양한 계층을 도시한다. 도 26에 도시된 것과 같이, 이미지 프로세싱을 모델링하기 위해 사용된 예시적인 CNN은 입력 이미지의 레드, 그린 및 블루(RGB) 컴포넌트를 설명하는 입력(2602)을 수신할 수 있다. 입력(2602)은 복수의 컨볼루션 계층(예를 들어, 컨볼루션 계층(2604), 컨볼루션 계층(2606))에 의해 프로세싱될 수 있다. 복수의 컨볼루션 계층으로부터의 출력은 선택에 따라, 완전히 접속된 계층(2608)의 세트에 의해 프로세싱될 수 있다. 완전히 접속된 계층의 뉴런은 피드포워드 네트워크에 대해 전술한 것과 같이, 이전 계층에서의 모든 활성화에 완전히 접속된다. 완전히 접속된 계층(2608)으로부터의 출력은 네트워크로부터 출력 결과를 생성하는 데 사용될 수 있다. 완전히 접속된 계층(2608) 내의 활성화는 컨볼루션 대신 매트릭스 곱셈을 사용하여 컴퓨팅될 수 있다. 모든 CNN 구현예가 완전히 접속된 계층을 사용하는 것은 아니다. 예를 들어, 일부 구현예에서, 컨볼루션 계층(2606)은 CNN에 대한 출력을 생성할 수 있다.
컨볼루션 계층은 드물게 접속되며, 이는 완전히 접속된 계층(2608)에서 발견된 전통적인 신경망 구성과 다르다. 전통적인 신경망 계층은 모든 출력 유닛이 모든 입력 유닛과 상호 작용하도록 완전히 접속된다. 그러나, 전술한 것과 같이,(필드 내의 각 노드의 각각의 상대적 상태 값을 대신하여) 필드의 컨볼루션의 출력이 후속 계층의 노드에 입력되기 때문에, 컨볼루션 계층은 드물게 접속된다. 컨볼루션 계층과 관련된 커널은 컨볼루션 연산을 수행하며 그 결과는 다음 계층으로 전송된다. 컨볼루션 계층 내에서 수행되는 차원 축소는 CNN이 큰 이미지를 프로세싱하도록 확장할 수 있게 하는 하나의 측면이다.
도 27은 CNN의 컨볼루션 계층 내의 예시적인 계산 단계를 도시한다. CNN의 컨볼루션 계층으로의 입력(2712)은 컨볼루션 계층(2714)의 3 단계로 프로세싱될 수 있다. 3 단계는 컨볼루션 단계(2716), 검출기 단계(2718) 및 풀링 단계(2720)를 포함할 수 있다. 이후, 컨볼루션 계층(2714)은 후속 컨볼루션 계층으로 데이터를 출력할 수 있다. 네트워크의 최종 컨볼루션 계층은 출력 특징 맵 데이터를 생성하거나 또는 완전히 접속된 계층에 입력을 제공하여, 예를 들어, CNN으로의 입력에 대한 분류 값을 생성할 수 있다.
컨벌루션 단계(2716)에서는 선형 활성화 세트(set of linear activations)를 생성하기 위해 여러 컨볼루션을 병렬로 수행한다. 컨벌루션 단계(2716)는 아핀(affine) 변환을 포함할 수 있으며, 이 아핀 변환은 선형 변환과 이동의 합으로 지정될 수 있는 임의의 변환이다. 아핀 변환은 회전, 이동, 확대 및 이러한 변환의 조합을 포함한다. 컨벌루션 단계는 뉴런과 관련된 로컬 영역으로서 결정될 수 있는 입력의 특정 영역에 접속된 함수(예를 들어, 뉴런)의 출력을 컴퓨팅한다. 뉴런은 뉴런의 가중치와 뉴런이 접속된 로컬 입력 영역 사이의 내적을 컴퓨팅한다. 컨볼루션 단계(2716)로부터의 출력은 컨볼루션 계층(2714)의 후속 단계에 의해 프로세싱되는 선형 활성화 세트를 정의한다.
선형 활성화는 검출기 단계(2718)에 의해 프로세싱될 수 있다. 검출기 단계(2718)에서, 각각의 선형 활성화는 비선형 활성화 함수에 의해 프로세싱된다. 비선형 활성화 함수는 컨볼루션 계층의 수용 필드에 영향을 미치지 않으면서 전체 네트워크의 비선형 속성을 증가시킨다. 여러 타입의 비선형 활성화 함수가 사용될 수 있다. 하나의 특정 타입은 f(x) = max(0, x)로 정의된 활성화 함수를 사용하여 활성화가 0에서 임계값이 되도록 하는 정류 선형 유닛(ReLU)이다.
풀링 단계(2720)는 컨볼루션 계층(2706)의 출력을 근처의 출력의 요약 통계로 대체하는 풀링 함수를 사용한다. 풀링 함수는 신경망에 이동 불변성을 도입하는데 사용할 수 있으므로, 입력에 대한 작은 이동은 풀링된 출력을 변경하지 않는다. 로컬 이동에 대한 불변성은 입력 데이터에 특징의 존재가 특징의 정확한 위치보다 중요한 시나리오에서 유용할 수 있다. 풀링 단계(2720) 동안, 최대 풀링, 평균 풀링 및 l2-표준(norm) 풀링을 포함하는 다양한 타입의 풀링 함수를 사용할 수 있다. 또한, 일부 CNN 구현예에는 풀링 단계가 포함되지 않는다. 대신에, 이러한 구현예는 이전 컨볼루션 단계에 비해 증가된 스트라이드(stride)를 갖는 추가 컨볼루션 단계로 대체한다.
컨볼루션 계층(2714)으로부터의 출력은 다음 계층(2722)에 의해 프로세싱될 수 있다. 다음 계층(2722)은 완전히 접속된 계층(2608) 중 하나 또는 추가 컨볼루션 계층일 수 있다. 예를 들어, 도 26의 제 1 컨볼루션 계층(2604)은 제 2 컨볼루션 계층(2606)으로 출력할 수 있고, 제 2 컨볼루션 계층은 완전히 접속된 계층(2608)의 제 1 계층으로 출력할 수 있다.
도 28은 예시적인 순환 신경망(2800)을 도시한다. 순환 신경망(RNN)에서, 네트워크의 이전 상태는 네트워크의 현재 상태의 출력에 영향을 미친다. RNN은 다양한 함수를 사용하여 다양한 방식으로 구축될 수 있다. RNN의 사용은 일반적으로 입력의 이전 시퀀스에 기초하여 미래를 예측하는 수학적 모델을 사용하는 것을 중심으로 이루어진다. 예를 들어, RNN은 단어의 이전 시퀀스가 주어지면 다음의 단어를 예측하는 통계 언어 모델링을 수행하는데 사용될 수 있다. 도시된 RNN(2800)은 입력 벡터를 수신하는 입력 계층(2802), 순환 기능을 구현하는 숨겨진 계층(2804), 이전 상태의 '메모리'를 가능하게 하는 피드백 메커니즘(2805), 및 결과를 출력하는 출력 계층(2806)을 갖는 것으로 설명될 수 있다. RNN(2800)은 시간 단계에 따라 동작한다. 주어진 시간 단계에서 RNN의 상태는 피드백 메커니즘(2805)을 통해 이전 시간 단계에 따라 영향을 받는다. 주어진 시간 단계에서, 숨겨진 계층(2804)의 상태는 이전 상태 및 현재 시간 단계에서의 입력에 의해 정의된다. 제 1 시간 단계에서의 초기 입력(x1)은 숨겨진 계층(2804)에 의해 프로세싱될 수 있다. 제 2 입력(x2)은 초기 입력(x1)의 프로세싱 동안 결정된 상태 정보를 사용하여 숨겨진 계층(2804)에 의해 프로세싱될 수 있다. 주어진 상태는 st = f(Uxt + Wst-1)로 컴퓨팅될 수 있으며, 여기서 U와 W는 파라미터 매트릭스이다. 함수(f)는 일반적으로 쌍곡선 탄젠트 함수(Tanh) 또는 정류기 함수 f(x) = max(0, x)의 변형과 같은 비선형이다. 그러나, 숨겨진 계층(2804)에서 사용되는 특정 산술 함수는 RNN(2800)의 특정 구현예의 세부 사항에 따라 변할 수 있다.
설명된 기본 CNN 및 RNN 네트워크 외에, 이들 네트워크에 대한 변형이 가능할 수 있다. RNN 변형의 일 예는 LSTM(long short term memory) RNN이다. LSTM RNN은 언어의 더 긴 시퀀스를 처리하는데 필요할 수 있는 장기적인 종속성을 학습할 수 있다. CNN의 변형은 컨볼루션 DBN(deep belief network)으로서, CNN과 유사한 구조를 가지며 DBN과 유사한 방식으로 훈련된다. DBN은 확률적(랜덤) 변수의 복수 계층으로 구성된 생산적 신경망이다. 욕심 많은(greedy) 비지도(unsupervised) 학습을 사용하여 DBN을 계층별로 훈련할 수 있다. 이후, DBN의 학습된 가중치는 신경망에 대한 최적의 초기 가중치 세트를 결정함으로써 사전 훈련된 신경망을 제공하는데 사용될 수 있다.
도 29는 심층 신경망의 훈련 및 전개를 도시한다. 주어진 네트워크가 태스크를 위해 구성되면, 신경망은 훈련 데이터세트(2902)를 사용하여 훈련된다. 훈련 과정의 하드웨어 가속이 가능하도록 다양한 훈련 프레임워크(2904)가 개발되었다. 예를 들어, 전술한 머신 학습 프레임워크가 훈련 프레임워크로서 구성될 수 있다. 훈련 프레임워크(2904)는 훈련되지 않은 신경망(2906)에 연결될 수 있고 본 명세서에 설명된 병렬 프로세싱 리소스를 사용하여 훈련되지 않은 신경망을 훈련시켜 훈련된 신경망(2908)을 생성할 수 있다.
훈련 과정을 시작하기 위해, 초기 가중치는 랜덤하게 또는 DBN을 사용하는 사전 훈련에 의해 선택될 수 있다. 훈련 주기는 지도 또는 비지도 방식으로 수행될 수 있다.
지도 학습은, 훈련 데이터세트(2902)가 입력에 대한 원하는 출력과 쌍을 이루는 입력을 포함하는 경우, 또는 훈련 데이터세트가 알려진 출력을 갖는 입력을 포함하고 신경망의 출력이 수동적으로 등급이 정해지는 경우와 같이, 훈련이 중재된 동작으로서 수행되는 학습 방법이다. 네트워크는 입력을 프로세싱하고 산출되는 출력을 예상 또는 원하는 출력 세트와 비교한다. 이후 시스템을 통해 오류가 역전파된다. 훈련 프레임워크(2904)는 훈련되지 않은 신경망(2906)을 제어하는 가중치를 조정하도록 조정할 수 있다. 훈련 프레임워크(2904)는 훈련되지 않은 신경망(2906)이 알려진 입력 데이터에 기초하여 정확한 답변을 생성하는 적합한 모델을 향해 얼마나 잘 수렴하는지를 모니터하는 도구를 제공할 수 있다. 훈련 과정은 신경망에 의해 생성된 출력을 개선하기 위해 네트워크의 가중치가 조정됨에 따라 반복적으로 발생한다. 훈련 과정은 신경망이 훈련된 신경망(2908)과 관련된 통계적으로 원하는 정확도에 도달할 때까지 계속될 수 있다. 이후 훈련된 신경망(2908)은 임의의 개수의 머신 학습 동작을 구현하도록 전개될 수 있다.
비지도 학습은 네트워크가 라벨링되지 않은 데이터(unlabeled data)를 사용하여 스스로 학습을 시도하는 학습 방법이다. 따라서, 비지도 학습을 위해, 훈련 데이터세트(2902)는 어떠한 관련된 출력 데이터 없이 입력 데이터를 포함할 것이다. 훈련되지 않은 신경망(2906)은 표시되지 않은 입력 내의 그룹화를 학습할 수 있고 개별 입력이 전체 데이터세트와 어떻게 관련되는지를 결정할 수 있다. 비지도 훈련은 데이터의 차원을 감소시키는데 유용한 연산을 수행할 수 있는 훈련된 신경망(2907)의 타입인 자체 구성 맵(self-organizing map)을 생성하는데 사용될 수 있다. 비지도 훈련은 또한 비정상 탐지를 수행하는데 이용될 수 있으며, 이로 인해 데이터의 정상적인 패턴에서 벗어난 입력 데이터세트에서의 데이터 포인트를 식별할 수 있다.
지도 및 비지도 훈련에 대한 변형이 또한 사용될 수 있다. 반지도(semi-supervised) 학습은 훈련 데이터세트(2902)에 동일한 분포의 라벨링된 데이터와 라벨링되지 않은 데이터가 혼합된 것이 포함되는 기술이다. 증분 학습은 입력 데이터를 지속적으로 사용하여 모델을 추가 훈련하는 지도 학습의 변형이다. 증분 학습은 훈련된 신경망(2908)이 초기 훈련 동안 네트워크 내에 주입된 지식을 잊지 않고 새로운 데이터(2912)에 적응할 수 있도록 한다.
지도 및 비지도에 관계없이, 특히 심층 신경망에 대한 훈련 과정은 단일 컴퓨팅 노드에 대해 너무 계산 집약적일 수 있다. 단일 컴퓨팅 노드를 사용하는 대신 컴퓨팅 노드의 분산 네트워크를 사용하여 훈련 과정을 가속화할 수 있다.
도 30a는 분산 학습을 도시한 블록도이다. 분산 학습은 전술한 노드와 같은 복수의 분산 컴퓨팅 노드를 사용하여 신경망의 지도 또는 비지도 훈련을 수행하는 훈련 모델이다. 분산 컴퓨팅 노드는 각각, 고-병렬성 범용 그래픽 프로세싱 유닛과 같은 하나 이상의 범용 프로세싱 노드 및 하나 이상의 호스트 프로세서를 포함할 수 있다. 도시된 것과 같이, 분산 학습은 모델 병렬성(3002), 데이터 병렬성(3004), 또는 모델과 데이터 병렬성의 결합으로 수행될 수 있다.
모델 병렬성(3002)에서, 분산 시스템의 상이한 컴퓨팅 노드는 단일 네트워크의 상이한 부분에 대한 훈련 계산을 수행할 수 있다. 예를 들어, 신경망의 각각의 계층은 분산 시스템의 다른 프로세싱 노드에 의해 학습될 수 있다. 모델 병렬성의 이점은 특히 큰 모델로 확장할 수 있는 기능을 포함한다. 신경망의 다른 계층과 관련된 계산을 분할하면, 모든 계층의 가중치가 단일 컴퓨팅 노드의 메모리에 맞지 않는 매우 큰 신경망을 훈련할 수 있다. 일부 인스턴스에서, 모델 병렬성은 대규모 신경망의 비지도 훈련을 수행하는데 특히 유용할 수 있다.
데이터 병렬성(3004)에서, 분산 네트워크의 다른 노드는 모델의 완료된 인스턴스를 가지며 각각의 노드는 데이터의 다른 부분을 수신한다. 이후 다른 노드로부터의 결과가 결합된다. 데이터 병렬성에 대한 다른 접근법이 가능하지만, 데이터 병렬 훈련 접근법은 모두 결과를 결합하고 각각의 노드 사이에서 모델 파라미터를 동기화하는 기술을 필요로 한다. 데이터를 결합하는 예시적인 방법은 파라미터 평균화 및 업데이트 기반 데이터 병렬성을 포함한다. 파라미터 평균화는 훈련 데이터의 서브세트 상에서 각각의 노드를 훈련시키고, 전역 파라미터(예를 들어, 가중치, 바이어스)를 각각의 노드로부터의 파라미터의 평균으로 설정한다. 파라미터 평균화는 파라미터 데이터를 관리하는 중앙 파라미터 서버를 사용한다. 업데이트 기반 데이터 병렬성은 노드로부터의 파라미터를 파라미터 서버로 전송하는 대신 모델에 대한 업데이트가 전송된다는 점을 제외하고는 파라미터 평균화와 유사하다. 또한 업데이트 기반 데이터 병렬성은 분산된 방식으로 수행될 수 있으며, 여기서 업데이트는 압축되어 노드간에 전송된다.
결합된 모델 및 데이터 병렬성(3006)은, 예를 들어 각각의 컴퓨팅 노드가 복수의 GPU를 포함하는 분산 시스템으로 구현될 수 있다. 각각의 노드는 모델의 완료된 인스턴스를 가질 수 있고, 각각의 노드 내의 별도의 GPU는 모델의 다른 부분을 훈련시키는 데 사용된다.
분산 훈련은 단일 머신 상에서의 훈련에 비해 오버헤드가 증가된다. 그러나, 본 명세서에 설명된 병렬 프로세서 및 GPGPU는 각각 고대역폭 GPU-GPU 데이터 전송 및 가속 원격 데이터 동기화를 가능하게 하는 기술을 포함하여 분산 훈련의 오버헤드를 감소시키는 다양한 기술을 구현할 수 있다.
예시적 머신 학습 애플리케이션
머신 학습은, 컴퓨터 비전, 자율 주행 및 내비게이션, 음성 인식 및 언어 프로세싱을 포함하지만 이에 한정되지 않는 다양한 기술적 문제를 해결하기 위해 적용될 수 있다. 컴퓨터 비전은 전통적으로 머신 학습 애플리케이션에서 가장 활발한 연구 분야 중 하나였다. 컴퓨터 비전의 애플리케이션은 얼굴 인식과 같은 인간의 시각 능력의 재생에서 시각 능력의 새로운 범주를 생성하는 것에까지 이른다. 예를 들어, 컴퓨터 비전 애플리케이션은 비디오에서 볼 수 있는 물체에 유도된 진동으로부터 음파를 인식하도록 구성될 수 있다. 병렬 프로세서 가속 머신 학습을 사용하면, 이전에 가능했던 것보다 훨씬 많은 훈련 데이터세트를 사용하여 컴퓨터 비전 애플리케이션을 훈련하고 저전력 병렬 프로세서를 사용하여 추론 시스템을 전개할 수 있다.
병렬 프로세서 가속 머신 학습은 차선 및 도로 표지판 인식, 장애물 회피, 내비게이션 및 주행 제어를 포함하는 자율 주행 애플리케이션을 갖는다. 가속 머신 학습 기술을 사용하여 특정 훈련 입력에 대한 적절한 응답을 정의하는 데이터세트를 기반으로 주행 모델을 훈련할 수 있다. 본 명세서에 설명된 병렬 프로세서를 사용하면, 자율 주행 솔루션에 사용되는 점점 더 복잡한 신경망의 빠른 훈련이 가능하고 자율 주행 차량에 통합하기에 적합한 모바일 플랫폼에 저전력 추론 프로세서를 전개할 수 있다.
병렬 프로세서 가속 심층 신경망은 자동 음성 인식(ASR)에 대한 머신 학습 접근법을 가능하게 하였다. ASR은 입력 음향 시퀀스가 주어지면 가장 가능성 있는 언어 시퀀스를 컴퓨팅하는 기능의 생성을 포함한다. 심층 신경망을 사용하는 가속 머신 학습을 사용하면, 이전에 ASR에 사용된 HMM(hidden Makov model) 및 GMM(Gaussian mixture model)을 대체할 수 있었다.
병렬 프로세서 가속 머신 학습은 또한 자연 언어 프로세싱을 가속화하는데 사용될 수 있다. 자동 학습 절차는 통계적 추론 알고리즘을 사용하여 잘못되었거나 또는 익숙하지 않은 입력에 대해 강건한(robust) 모델을 생성할 수 있다. 예시적인 자연 언어 프로세서 애플리케이션은 인간 언어 간의 자동 머신 번역을 포함한다.
머신 학습에 사용되는 병렬 프로세싱 플랫폼은 훈련 플랫폼 및 전개 플랫폼으로 나뉠 수 있다. 훈련 플랫폼은 일반적으로 고도로 병렬적이며 멀티-GPU 단일 노드 훈련 및 멀티-노드 멀티-GPU 훈련을 가속화하는 최적화 기능을 포함한다. 훈련에 적합한 예시적인 병렬 프로세서는 본 명세서에 설명된 고-병렬성 범용 그래픽 프로세싱 유닛 및/또는 복수 GPU 컴퓨팅 시스템을 포함한다. 반대로, 전개된 머신 학습 플랫폼은 일반적으로 카메라, 자율 로봇 및 자율 주행 차량과 같은 제품에 사용하기에 적합한 저전력 병렬 프로세서를 포함한다.
도 30b는 훈련된 모델을 사용하여 추론을 수행하기에 적합한 예시적인 추론 시스템 온 칩(SOC)(3100)을 도시한다. 본 명세서의 임의의 다른 도면의 요소와 동일하거나 유사한 명칭을 갖는 도 30b의 요소는 다른 도면에서와 동일한 요소를 설명하고, 그와 유사한 방식으로 동작하거나 기능할 수 있고, 본 명세서의 다른 곳에서 설명된 것과 동일한 컴포넌트를 포함할 수 있으며 다른 엔티티에 연결될 수 있지만, 이에 한정되지는 않는다. SOC(3100)는 미디어 프로세서(3102), 비전 프로세서(3104), GPGPU(3106) 및 멀티-코어 프로세서(3108)를 포함하는 프로세싱 컴포넌트를 통합할 수 있다. SOC(3100)는 각각의 프로세싱 컴포넌트가 액세스할 수 있는 공유 온-칩 데이터 풀을 가능하게 하는 온-칩 메모리(3105)를 추가로 포함할 수 있다. 프로세싱 컴포넌트는 저전력 동작에 최적화되어 자율 주행 차량 및 자율 로봇을 포함한 다양한 머신 학습 플랫폼으로의 전개를 가능하게 할 수 있다. 예를 들어, SOC(3100)의 일 구현예는 자율 주행 차량을 위한 주 제어 시스템의 일부로서 사용될 수 있다. SOC(3100)가 자율 주행 차량에 사용되도록 구성되는 경우 SOC는 전개되는 관할 구역의 관련 기능성 안전 표준을 준수하도록 설계 및 구성된다.
동작하는 동안, 미디어 프로세서(3102) 및 비전 프로세서(3104)는 컴퓨터 비전 동작을 가속화하기 위해 함께 작동할 수 있다. 미디어 프로세서(3102)는 복수의 고해상도(예를 들어, 4K, 8K) 비디오 스트림의 낮은 대기 시간 디코딩을 가능하게 할 수 있다. 디코딩된 비디오 스트림은 온-칩 메모리(3105)의 버퍼에 기록될 수 있다. 이후 비전 프로세서(3104)는, 디코딩된 비디오를 파싱하고 훈련된 이미지 인식 모델을 사용하여 프레임을 프로세싱할 준비를 위해, 디코딩된 비디오의 프레임에 대해 예비 프로세싱 동작을 수행할 수 있다. 예를 들어, 비전 프로세서(3104)는 고해상도 비디오 데이터에 대한 이미지 인식을 수행하는 데 사용되는 CNN에 대한 컨볼루션 연산을 가속화할 수 있고, 백 엔드 모델 계산은 GPGPU(3106)에 의해 수행된다.
멀티-코어 프로세서(3108)는 미디어 프로세서(3102) 및 비전 프로세서(3104)에 의해 수행되는 데이터 전송 및 공유 메모리 동작의 시퀀싱 및 동기화를 보조하는 제어 로직을 포함할 수 있다. 멀티-코어 프로세서(3108)는 또한 GPGPU(3106)의 추론 컴퓨팅 능력을 사용할 수 있는 소프트웨어 애플리케이션을 실행하는 애플리케이션 프로세서로서 기능할 수 있다. 예를 들어, 내비게이션 및 구동 로직의 적어도 일부는 멀티-코어 프로세서(3108) 상에서 실행되는 소프트웨어로 구현될 수 있다. 이러한 소프트웨어는 직접 계산 워크로드를 GPGPU(3106)로 발행하거나 또는 계산 워크로드가 멀티-코어 프로세서(3108)로 발행될 수 있으며, 멀티-코어 프로세서(3108)는 이러한 동작의 적어도 일부를 GPGPU(3106)로 오프로딩할 수 있다.
GPGPU(3106)는 고-병렬성 병렬 범용 그래픽 프로세싱 유닛(DPLAB00) 내의 프로세싱 클러스터(DPLAB06A-DPLAB06H)의 저전력 구성과 같은 프로세싱 클러스터를 포함할 수 있다. GPGPU(3106) 내의 프로세싱 클러스터는 훈련된 신경망에서 추론 계산을 수행하도록 구체적으로 최적화된 명령어를 지원할 수 있다. 예를 들어, GPGPU(3106)는 8 비트 및 4 비트 정수 벡터 연산과 같은 낮은 정밀도 계산을 수행하는 명령어를 지원할 수 있다.
광선 추적 아키텍처
일 구현예에서, 그래픽 프로세서는 실시간 광선 추적을 수행하기 위한 회로 및/또는 프로그램 코드를 포함한다. 광선 탐색 및/또는 광선 교차 동작을 포함하여, 본 명세서에 설명된 다양한 광선 추적 동작을 수행하는 광선 추적 코어의 전용 세트가 그래픽 프로세서에 포함될 수 있다. 광선 추적 코어에 추가하여, 프로그램 가능한 셰이딩 동작을 수행하기 위한 복수의 그래픽 프로세싱 코어 세트 및 텐서 데이터에 대한 매트릭스 동작을 수행하기 위한 복수의 텐서 코어 세트가 또한 포함될 수 있다.
도 31은 멀티-코어 그룹(3100A-3100N)으로 배열된 그래픽 프로세싱 리소스의 전용 세트를 포함하는 하나의 그래픽 프로세싱 유닛(GPU)(3105)의 예시적인 부분을 도시한다. 그래픽 프로세싱 유닛(GPU)(3105)은 그래픽 프로세서(300), GPGPU(1340) 및/또는 본 명세서에 설명된 임의의 다른 그래픽 프로세서의 변형일 수 있다. 따라서, 그래픽 프로세서에 대한 임의의 특징의 개시는 또한 GPU(3105)와의 대응하는 결합을 개시하지만, 이에 한정되지는 않는다. 또한, 본 명세서의 임의의 다른 도면의 요소와 동일하거나 유사한 명칭을 갖는 도 31의 요소는 다른 도면에서와 동일한 요소를 설명하고, 그와 유사한 방식으로 동작하거나 기능할 수 있고, 본 명세서의 다른 곳에서 설명된 것과 동일한 컴포넌트를 포함할 수 있으며 다른 엔티티에 연결될 수 있지만, 이에 한정되지는 않는다. 하나의 멀티-코어 그룹(3100A)의 세부 사항만이 제공되지만, 다른 멀티-코어 그룹(3100B-3100N)은 동일하거나 유사한 그래픽 프로세싱 리소스 세트를 구비할 수 있음을 이해할 것이다.
도시된 것과와 같이, 멀티-코어 그룹(3100A)은 그래픽 코어 세트(3130), 텐서 코어 세트(3140), 및 광선 추적 코어 세트(3150)를 포함할 수 있다. 스케줄러/디스패처(3110)는 다양한 코어(3130, 3140, 3150) 상에서의 실행을 위해 그래픽 스레드를 스케줄링하고 디스패치한다. 레지스터 파일 세트(3120)는 그래픽 스레드를 실행할 때 코어(3130, 3140, 3150)에 의해 사용되는 피연산자 값을 저장한다. 이들은, 예를 들어, 정수 값을 저장하기 위한 정수 레지스터, 부동 소수점 값을 저장하기 위한 부동 소수점 레지스터, 패킹된 데이터 요소(정수 및/또는 부동 소수점 데이터 요소)를 저장하기 위한 벡터 레지스터 및 텐서/매트릭스 값을 저장하기 위한 타일 레지스터를 포함할 수 있다. 타일 레지스터는 벡터 레지스터의 결합된 세트로서 구현될 수 있다.
하나 이상의 레벨 1(L1) 캐시 및 텍스쳐 유닛(3160)은 텍스쳐 데이터, 정점 데이터, 픽셀 데이터, 광선 데이터, 경계 볼륨 데이터 등과 같은 그래픽 데이터를 각각의 멀티-코어 그룹(3100A) 내에 국부적으로 저장한다. 멀티-코어 그룹(3100A-3100N)의 전부 또는 서브세트에 의해 공유되는 레벨 2(L2) 캐시(3180)는 복수의 동시 그래픽 스레드에 대한 그래픽 데이터 및/또는 명령어를 저장한다. 도시된 것과 같이, L2 캐시(3180)는 복수의 멀티-코어 그룹(3100A-3100N)에 걸쳐 공유될 수 있다. 하나 이상의 메모리 제어기(3170)는 GPU(3105)를 시스템 메모리(예를 들어, DRAM) 및/또는 전용 그래픽 메모리(예를 들어, GDDR6 메모리)일 수 있는 메모리(3198)에 연결한다.
입/출력(IO) 회로(3195)는 GPU(3105)를 디지털 신호 프로세서(DSP), 네트워크 제어기, 또는 사용자 입력 장치와 같은 하나 이상의 IO 장치(3190)에 연결한다. 온-칩 상호 접속부는 I/O 장치(3190)를 GPU(3105) 및 메모리(3198)에 연결하는 데 사용될 수 있다. IO 회로(3195)의 하나 이상의 IOMMMU(IO memory management unit)(3170)는 I/O 장치(3190)를 시스템 메모리(3198)에 직접 연결한다. IOMMU(3170)는 페이지 테이블의 복수의 세트를 관리하여 가상 주소를 시스템 메모리(3198)의 물리 주소에 매핑할 수 있다. 또한, I/O 장치(3190), CPU(들)(3199) 및 GPU(들)(3105)는 동일한 가상 주소 공간을 공유할 수 있다.
IOMMU(3170)는 또한 가상화를 지원할 수 있다. 이 경우, 이것은 게스트/그래픽 가상 주소를 게스트/그래픽 물리 주소에 매핑하기 위해 페이지 테이블의 제 1 세트를 관리하고, 게스트/그래픽 물리 주소를 시스템/호스트 물리 주소(예를 들어, 시스템 메모리(3198) 내)에 매핑하기 위해 페이지 테이블의 제 2 세트를 관리할 수 있다. 페이지 테이블의 제 1 및 제 2 세트 각각의 베이스 주소는 제어 레지스터에 저장될 수 있고,(예를 들어, 새로운 컨텍스트에 페이지 테이블의 관련된 세트에 대한 액세스가 제공되도록) 컨텍스트 스위치 상에서 교환될 수 있다. 도 31에 도시되지 않았지만, 각각의 코어(3130, 3140, 3150) 및/또는 멀티-코어 그룹(3100A-3100N)은 게스트 가상을 게스트 물리로 변환, 게스트 물리를 호스트 물리로 변환, 및 게스트 가상을 호스트 물리로 변환을 캐싱하는 변환 색인 버퍼(TLB: translation lookaside buffer)를 포함할 수 있다.
CPU(3199), GPU(3105) 및 IO 장치(3190)는 단일 반도체 칩 및/또는 칩 패키지 상에 통합될 수 있다. 도시된 메모리(3198)는 동일한 칩 상에 통합될 수 있거나 또는 오프-칩 인터페이스를 통해 메모리 제어기(3170)에 연결될 수 있다. 일 구현예에서, 메모리(3198)는 다른 물리 시스템 레벨 메모리와 동일한 가상 주소 공간을 공유하는 GDDR6 메모리를 포함하지만, 본 발명의 기본 원리는 이러한 특정 구현예로 한정되는 것은 아니다.
텐서 코어(3140)는 매트릭스 연산을 수행하도록 구체적으로 설계된 복수의 실행 유닛을 포함할 수 있는데, 이러한 매트릭스 연산은 딥 러닝 동작을 수행하는데 사용되는 기본적인 컴퓨팅 연산이다. 예를 들어, 동시 매트릭스 곱셈 연산이 신경망 훈련 및 추론에 사용될 수 있다. 텐서 코어(3140)는 단정밀도 부동 소수점(예를 들어, 32 비트), 반정밀도 부동 소수점(예를 들어, 16 비트), 정수 워드(16 비트), 바이트(8 비트) 및 반 바이트(4 비트)를 포함하는 다양한 피연산자 정밀도를 사용하여 매트릭스 프로세싱을 수행할 수 있다. 신경망 구현예는 복수의 프레임으로부터 세부 사항을 잠재적으로 결합하는 각각의 렌더링된 장면의 특징을 추출하여 고품질의 최종 이미지를 구성할 수 있다.
딥 러닝 구현예에서, 병렬 매트릭스 곱셈 작업은 텐서 코어(3140) 상에서 실행되도록 스케줄링될 수 있다. 특히 신경망의 훈련은 상당한 수의 매트릭스 내적 연산을 요구한다. N x N x N 매트릭스 곱셈의 내적 공식을 프로세싱하기 위해, 텐서 코어(3140)는 적어도 N개의 내적 프로세싱 요소를 포함할 수 있다. 매트릭스 곱셈을 시작하기 전에 하나의 전체 매트릭스가 타일 레지스터에 로딩되고 두 번째 매트릭스의 적어도 하나의 열이 N개의 주기 동안 각각의 주기마다 로딩된다. 각각의 주기마다 프로세싱되는 N개의 내적이 존재한다.
매트릭스 요소는, 16 비트 워드, 8 비트 바이트(예를 들어, INT8) 및 4 비트 반 바이트(예를 들어, INT4)를 포함하는 특정 구현예에 따른 상이한 정밀도로 저장될 수 있다. 텐서 코어(3140)에 대해 상이한 정밀도 모드가 특정되어 상이한 워크로드(예를 들어, 바이트 및 반 바이트로 양자화를 허용할 수 있는 추론 워크로드)에 대해 가장 효율적인 정밀도가 사용되는 것을 보장할 수 있다.
광선 추적 코어(3150)는 실시간 광선 추적 및 비실시간 광선 추적 구현예 모두에 대해 광선 추적 동작을 가속화하는 데 사용될 수 있다. 특히, 광선 추적 코어(3150)는 경계 볼륨 계층 구조(BVH)를 사용하여 광선 탐색을 수행하고 BVH 볼륨 내에 둘러싸인 광선과 프리미티브 사이의 교차를 식별하기 위한 광선 탐색/교차 회로를 포함할 수 있다. 광선 추적 코어(3150)는 또한 깊이 테스트 및 컬링(culling)을 수행하기 위한 회로를 포함할 수 있다(예를 들어, Z 버퍼 또는 유사한 배열을 사용함). 일 구현예에서, 광선 추적 코어(3150)는 본 명세서에 설명된 이미지 노이즈 제거 기술과 협력하여 탐색 및 교차 동작을 수행하며, 이 중 적어도 일부는 텐서 코어(3140) 상에서 실행될 수 있다. 예를 들어, 텐서 코어(3140)는 딥 러닝 신경망을 구현하여 광선 추적 코어(3150)에 의해 생성된 프레임의 노이즈 제거를 수행할 수 있다. 그러나, CPU(3199), 그래픽 코어(3130) 및/또는 광선 추적 코어(3150)는 또한 노이즈 제거 및/또는 딥 러닝 알고리즘의 전부 또는 일부를 구현할 수 있다.
또한, 전술한 것과 같이, 노이즈 제거에 대한 분산 접근법이 사용될 수 있는데, 여기에서 GPU(3105)는 네트워크 또는 고속 상호 접속부를 통해 다른 컴퓨팅 장치에 연결된 컴퓨팅 장치에 존재한다. 또한, 상호 접속된 컴퓨팅 장치는 신경망 학습/훈련 데이터를 공유하여 전체 시스템이 상이한 타입의 이미지 프레임 및/또는 상이한 그래픽 애플리케이션에 대해 노이즈 제거를 수행하는 것을 학습하는 속도를 향상시킬 수 있다.
광선 추적 코어(3150)는 모든 BVH 탐색 및 광선-프리미티브 교차를 프로세싱하여 그래픽 코어(3130)가 광선 당 수천 개의 명령어로 인해 과부하되는 것을 방지할 수 있다. 각각의 광선 추적 코어(3150)는(예를 들어, 탐색 동작을 위한) 경계 박스 테스트를 수행하기 위한 특수 회로의 제 1 세트와,(예를 들어, 탐색된 광선을 교차시키는) 광선-삼각형 교차 테스트를 수행하기 위한 특수 회로의 제 2 세트를 포함할 수 있다. 따라서, 멀티-코어 그룹(3100A)은 단순히 광선 프로브를 발사할 수 있고, 광선 추적 코어(3150)는 독립적으로 광선 탐색 및 교차를 수행하고 히트 데이터(예를 들어, 히트, 히트 없음, 복수 히트 등)를 스레드 컨텍스트에 반환한다. 광선 추적 코어(3150)가 탐색 및 교차 동작을 수행하는 동안, 다른 코어(3130, 3140)는 다른 그래픽을 수행하거나 또는 작업을 컴퓨팅하기 위해 자유로운 상태가 될 수 있다.
각각의 광선 추적 코어(3150)는 BVH 테스트 동작을 수행하는 탐색 유닛 및 광선-프리미티브 교차 테스트를 수행하는 교차 유닛을 포함할 수 있다. 다음에, 교차 유닛은 "히트", "히트 없음" 또는 "복수 히트" 응답을 생성하여 적절한 스레드에 제공할 수 있다. 탐색 및 교차 동작 동안, 다른 코어(예를 들어, 그래픽 코어(3130) 및 텐서 코어(3140))의 실행 리소스는 다른 형태의 그래픽 작업을 수행하기 위해 자유로운 상태가 될 수 있다.
작업이 그래픽 코어(3130)와 광선 추적 코어(3150) 사이에 분산되는 하이브리드 래스터화/광선 추적 접근법이 또한 사용될 수 있다.
광선 추적 코어(3150)(및/또는 다른 코어(3130, 3140))는, 각각의 객체에 대해 셰이더 및 텍스처의 고유 세트를 할당하게 하는 광선 생성, 최근접 히트, 임의의 히트 및 비교차(miss) 셰이더 뿐만 아니라 DispatchRays 커맨드를 포함하는 Microsoft의 DXR(DirectX Ray Tracing)과 같은 광선 추적 명령어 세트에 대한 하드웨어 지원을 포함할 수 있다. 광선 추적 코어(3150), 그래픽 코어(3130) 및 텐서 코어(3140)에 의해 지원될 수 있는 다른 광선 추적 플랫폼으로는 Vulkan 1.1.85가 있다. 그러나, 본 발명의 기본 원리는 임의의 특정 광선 추적 ISA로 한정되지 않는 점에 유의한다.
일반적으로, 다양한 코어(3150, 3140, 3130)는, 광선 생성, 최근접 히트, 임의 히트, 광선-프리미티브 교차, 프리미티브 당 및 계층 구조 경계 박스 구성, 비교차, 방문 및 예외를 위한 명령어/기능을 포함하는 광선 추적 명령어 세트를 지원할 수 있다. 보다 구체적으로, 다음 기능을 수행하기 위해 광선 추적 명령어가 포함될 수 있다:
광선 생성 - 광선 생성 명령어는 각각의 픽셀, 샘플 또는 다른 사용자 정의 작업 할당에 대해 실행될 수 있다.
최근접 히트 - 장면 내에서 광선과 프리미티브의 최근접 교차를 찾기 위해 최근접 히트 명령어가 실행될 수 있다.
임의의 히트 - 임의의 히트 명령어는 장면 내에서 광선과 프리미티브 사이의 복수 교차를 식별하여 잠재적으로 새로운 최근접 교차점을 식별할 수 있다.
교차 - 교차 명령어는 광선-프리미티브 교차 테스트를 수행하고 결과를 출력한다.
프리미티브 당 경계 박스 구성 - 이 명령어는 주어진 프리미티브 또는 프리미티브 그룹 주위에 경계 박스를 구성한다(예를 들어, 새로운 BVH 또는 다른 가속도 데이터 구조를 구성할 때).
비교차 - 광선이 장면 내의 모든 기하 또는 장면의 지정된 영역과 교차하지 않는 것을 나타낸다.
방문 - 광선이 탐색될 자식 볼륨을 나타낸다.
예외 - 다양한 타입의 예외 핸들러(예를 들어, 다양한 오류 조건에 대해 호출됨)를 포함한다.
계층 구조적 빔 추적
경계 볼륨 계층 구조는 그래픽 프리미티브 및 다른 그래픽 객체에 대해 동작이 수행되는 효율을 개선하기 위해 일반적으로 사용된다. BVH는 기하학적 객체 세트에 기초하여 구축된 계층 구조적 트리 구조이다. 트리 구조의 맨 위에는 주어진 장면 내의 모든 기하학적 객체를 포함하는 루트 노드가 있다. 개별 기하학적 객체는 트리의 리프 노드를 형성하는 경계 볼륨으로 싸여 있다. 이후, 이들 노드는 작은 세트로 그룹화되어 더 큰 경계 볼륨 내에 포함된다. 다음에, 이들은 또한 재귀적인 방식으로 다른 더 큰 경계 볼륨 내에 그룹화되고 둘러싸여, 최종적으로 트리의 맨 위에 있는 루트 노드로 표시되는 단일 경계 볼륨을 가진 트리 구조를 초래한다. 경계 볼륨 계층 구조는, 충돌 감지, 프리미티브 컬링, 및 광선 추적에 사용되는 광선 탐색/교차 동작과 같은 기하학적 객체 세트에 대한 다양한 동작을 효율적으로 지원하는 데 사용된다.
광선 추적 아키텍처에서, 광선은 BVH를 통해 탐색되어 광선-프리미티브 교차를 결정한다. 예를 들어, 광선이 BVH의 루트 노드를 통과하지 않으면, 이 광선은 BVH에 의해 둘러싸인 어떤 프리미티브와도 교차하지 않으며 이 프리미티브 세트에 대해서는 광선의 추가 프로세싱이 필요하지 않다. 광선이 BVH의 첫 번째 자식 노드를 통과하지만 두 번째 자식 노드를 통과하지 않으면, 두 번째 자식 노드로 둘러싸인 어떤 프리미티브에 대해서도 광선을 테스트할 필요가 없다. 이러한 방식으로, BVH는 광선-프리미티브 교차를 테스트하는 효율적인 메커니즘을 제공한다.
개별 광선이 아닌, "빔(beam)"으로 지칭되는 인접한 광선의 그룹이 BVH에 대해 테스트될 수 있다. 도 32는 4개의 상이한 광선에 의해 개략적으로 도시된 예시적인 빔(3201)을 도시한다. 4개의 광선에 의해 정의된 부분(3200)과 교차하는 임의의 광선은 동일한 빔 내에 있는 것으로 간주된다. 도 32의 빔(3201)은 광선의 직사각형 배열에 의해 정의되지만, 빔은 본 발명의 기본 원리를 여전히 따르면서도 다양한 다른 방식으로 정의될 수 있다(예를 들어, 원, 타원 등).
도 33은 GPU(3320)의 광선 추적 엔진(3310)이 본 명세서에 설명된 빔 추적 기술을 어떻게 구현하는지를 도시한다. 특히, 광선 생성 회로(3304)는 탐색 및 교차 동작이 수행될 복수의 광선을 생성한다. 그러나, 개별 광선에 대한 탐색 및 교차 동작을 수행하기보다는, 빔 계층 구조 구성 회로(3305)에 의해 생성된 빔의 계층 구조(3307)를 사용하여 탐색 및 교차 동작이 수행된다. 빔 계층 구조는 경계 볼륨 계층 구조(BVH)와 유사하다. 예를 들어, 도 34는 복수의 상이한 컴포넌트로 세분될 수 있는 1차 빔(3400)의 예를 제공한다. 특히, 1차 빔(3400)은 사분면(3401-3404)으로 분할될 수 있고 각각의 사분면 자체는 사분면(3404) 내의 서브-사분면(A-D)과 같은 서브-사분면으로 분할될 수 있다. 1차 빔은 다양한 방식으로 세분될 수 있다. 예를 들어, 1차 빔은(사분면이 아닌) 절반으로 분할될 수 있고, 각각의 절반은 절반으로 분할될 수 있는 등이다. 세분이 어떻게 이루어지는 지에 관계없이, 계층적 구조는 BVH와 유사한 방식, 예를 들어 1차 빔(3400)을 나타내는 루트 노드, 사분면(3401-3404)으로 각각 표시되는 자식 노드의 제 1 레벨, 각각의 서브-사분면(A-D)에 대한 자식 노드의 제 2 레벨 등을 갖는 방식으로 생성된다.
일단 빔 계층 구조(3307)가 구성되면, 탐색/교차 회로(3306)는 빔 계층 구조(3307) 및 BVH(3308)를 사용하여 탐색/교차 동작을 수행할 수 있다. 특히, 이는 BVH에 대한 빔과, BVH의 어떤 부분과도 교차하지 않는 빔의 컬(cull) 부분을 테스트한다. 도 34에 도시된 데이터를 사용하여, 예를 들어, 서브-영역(3402 및 3403)과 관련된 서브-빔이 BVH 또는 BVH의 특정 분기와 교차하지 않으면, BVH 또는 분기에 대해 제거될 수 있다. 나머지 부분(3401, 3404)은 깊이 우선 탐색 또는 다른 탐색 알고리즘을 수행함으로써 BVH에 대해 테스트될 수 있다.
광선 추적을 위한 방법이 도 35에 도시되어 있다. 이 방법은 전술한 그래픽 프로세싱 아키텍처의 맥락 내에서 구현될 수 있지만, 임의의 특정 아키텍처로 한정되는 것은 아니다.
3500에서는 복수의 광선을 포함하는 1차 빔이 구성되고, 3501에서는 빔이 세분화되고 계층적 데이터 구조가 생성되어 빔 계층 구조를 생성한다. 일 실시예에서, 동작(3500, 3501)은 복수의 광선으로부터 빔 계층 구조를 구성하는 단일의 통합된 동작으로서 수행될 수 있다. 3502에서, 빔 계층 구조는(빔 계층 구조로부터의) 광선 및/또는 BVH로부터 노드/프리미티브를 컬링하기 위해 BVH와 함께 사용된다. 3503에서, 나머지 광선 및 프리미티브에 대한 광선-프리미티브 교차가 결정된다.
분산 광선 추적 시스템에서 손실 및 무손실 패킷 압축
광선 추적 동작은 네트워크를 통해 함께 연결된 복수의 컴퓨팅 노드에 걸쳐 분산될 수 있다. 예를 들어, 도 36은 복수의 광선 추적 노드(3610-3613)를 포함하는 광선 추적 클러스터(3600)가 광선 추적 동작을 병렬로 수행하여, 노드 중 하나에서 결과를 잠재적으로 결합하는 것을 도시한다. 도시된 아키텍처에서, 광선 추적 노드(3610-3613)는 게이트웨이를 통해 클라이언트측 광선 추적 애플리케이션(3630)에 통신 가능하게 연결된다.
분산 아키텍처의 어려움 중 하나는 각각의 광선 추적 노드(3610-3613) 사이에서 전송되어야 하는 대량의 패킷화된 데이터이다. 무손실 압축 기술 및 손실 압축 기술은 모두 광선 추적 노드(3610-3613) 사이에서 전송되는 데이터를 감소시키는 데 사용될 수 있다.
특정 타입의 동작의 결과로 채워진 패킷을 전송하는 대신에 무손실 압축을 구현하기 위해, 수신 노드로 하여금 결과를 재구성할 수 있게 하는 데이터 또는 커맨드가 전송된다. 예를 들어, 확률적으로 샘플링된 영역 광 및 AO(ambient occlusion) 동작은 반드시 방향을 필요로 하지는 않는다. 결과적으로, 송신 노드는 랜덤 시드(random seed)를 단순히 전송할 수 있고, 이후 수신 노드가 이를 사용하여 랜덤 샘플링을 수행한다. 예를 들어, 광 1을 포인트(p1-p3)에서 샘플링하기 위해 장면이 노드(3610-3612)에 걸쳐 분산된다면, 광 ID 및 원점 만이 노드(3610-3612)로 전송될 필요가 있다. 이후 각각의 노드는 광을 독립적으로 확률적으로 샘플링할 수 있다. 랜덤 시드는 수신 노드에 의해 생성될 수 있다. 유사하게, 1차 광선 히트 포인트에 대해, 후속 프레임에 대한 원래 포인트를 기다리지 않고 노드(3610-3612) 상에서 AO 및 소프트 셰도우 샘플링을 계산할 수 있다. 또한, 광선 세트가 동일한 포인트 광원으로 진행할 것을 알고 있다면, 광원을 식별하는 명령어가 수신 노드로 전송될 수 있고, 수신 노드는 이를 광선 세트에 적용할 것이다. 다른 예로서, N개의 AO 광선이 단일 포인트에 전송되면, 이 포인트으로부터 N개의 샘플을 생성하도록 커맨드가 전송될 수 있다.
손실 압축을 위해 다양한 추가 기술이 적용될 수 있다. 예를 들어, BVH, 프리미티브 및 광선과 관련된 모든 좌표 값을 양자화하기 위해 양자화 계수가 사용될 수 있다. 또한, BVH 노드 및 프리미티브와 같은 데이터에 사용되는 32 비트 부동 소수점 값은 8 비트 정수 값으로 변환될 수 있다. 예시적인 구현에서, 광선 패킷의 경계는 최대 정밀도로 저장되지만, 개별 광선 포인트(P1-P3)는 색인된 오프셋으로서 경계에 전송된다. 유사하게, 8 비트 정수 값을 로컬 좌표로 사용하는 복수의 로컬 좌표 시스템이 생성될 수 있다. 이들 로컬 좌표 시스템 각각의 원점의 위치는 최대 정밀도(예를 들어, 32 비트 부동 소수점) 값을 사용하여 인코딩되어, 전역 및 로컬 좌표 시스템을 효과적으로 접속시킬 수 있다.
다음은 무손실 압축의 예이다. 광선 추적 프로그램에서 내부적으로 사용되는 광선 데이터 포맷의 예는 다음과 같다.
struct Ray
{
uint32 pixId;
uint32 materialID;
uint32 instanceID;
uint64 primitiveID;
uint32 geometryID;
uint32 lightID;
float origin[3];
float direction[3];
float t0;
float t;
float time;
float normal[3]; //used for geometry intersections
float u;
float v;
float wavelength;
float phase; //Interferometry
float refractedOffset; //Schlieren-esque
float amplitude;
float weight;
};
생성된 각각의 및 모든 노드에 대한 미가공 데이터를 전송하는 대신, 이 데이터는 값을 그룹화하고 가능한 경우 적용 가능한 메타데이터를 사용하여 내재적 광선(implicit ray)을 생성함으로써 압축될 수 있다.
광선 데이터 묶음 및 그룹화
공통 데이터 또는 수정자를 갖는 마스크에 플래그가 사용될 수 있다.
struct RayPacket
{
uint32 size;
uint32 flags;
list<Ray> rays;
}
예를 들어, RayPacket.rays = ray_1 to ray_256
원점은 모두 공유됨
모든 광선에 걸쳐 하나의 단일 원점 만이 저장되는 것을 제외하고 모든 광선 데이터는 패킹된다. RAYPACKET_COMMON_ORIGIN에 대해 RayPacket.flags가 설정된다. 수신시 RayPacket의 언팩되면, 단일 원점 값으로부터 원점이 채워진다.
원점은 일부 광선에서만 공유됨
원점을 공유하는 광선을 제외한 모든 광선 데이터가 패킹된다. 고유한 공유 원점의 각 그룹에 대해, 동작(공유 원점)을 식별하고, 원점을 저장하며, 정보를 공유하는 광선을 마스킹하는 연산자가 패킹된다. 이러한 동작은 재질(material) ID, 프리미티브 ID, 원점, 방향, 법선 등과 같이 노드간에 공유된 값으로 수행될 수 있다.
struct RayOperation
{
uint8 operationID;
void* value;
uint64 mask;
}
내재적 광선 송신
종종, 광선 데이터는 그것을 생성하는데 사용되는 최소한의 메타 정보로 수신단에서 도출될 수 있다. 매우 일반적인 예는 복수의 보조 광선을 생성하여 영역을 확률적으로 샘플링하는 것이다. 발신기가 보조 광선을 생성하여 송신하고, 수신기가 그에 대해 동작하는 대신, 발신기는 임의의 종속 정보를 이용하여 광선을 생성해야 한다는 커맨드를 송신하고, 수신단에서 광선을 생성할 수 있다. 어떤 수신기로 광선을 보낼 것인지를 결정하기 위해 발신기가 광선을 먼저 생성해야 하는 경우, 광선이 생성되고 랜덤 시드를 보내 정확히 동일한 광선을 재생성할 수 있다.
예를 들어, 영역 광원을 샘플링하는 64개의 그림자 광선으로 히트 포인트를 샘플링하기 위해, 모든 64개의 광선이 동일한 컴퓨팅(N4)으로부터의 영역과 교차한다. 공통 원점과 법선을 가진 RayPacket이 생성된다. 수신기가 산출되는 픽셀의 기여도를 감추기 원한다면 더 많은 데이터가 전송될 수 있지만, 이 예에서는 광선이 다른 노드 데이터에 히트하는지 여부 만을 반환한다고 가정한다. 그림자 광선 생성 동작을 위해 RayOperation이 생성되고, 샘플링될 lightID 값과 랜덤 넘버 시드가 할당된다. N4가 광선 패킷을 수신하면, N4는 공유 원점 데이터를 모든 광선에 채우고 랜덤 넘버 시드로 확률적으로 샘플링된 lightID를 기초로 방향을 설정하여 완전히 채워진 광선 데이터를 생성함으로써 원래 발신기가 생성한 광선과 동일한 광선을 생성한다. 결과가 반환될 때, 모든 광선에 대한 이진 결과만을 반환하면 되고, 이것은 광선에 대한 마스크에 의해 처리될 수 있다.
이 예에서 원래의 64개의 광선을 전송하는 것은 104 바이트 * 64 광선 = 6656 바이트를 사용했을 것이다. 반환하는 광선이 또한 원래의 형태로 전송된다면, 이는 2배가 되어 13312 바이트가 된다. 시드 및 ID를 이용하여 공통 광선 원점, 법선 및 광선 생성 동작을 전송하는 것만을 무손실 압축하면, 29 바이트만 전송되고, 교차된 마스크에 대해 8 바이트가 반환된다. 결과적으로 네트워크를 통해 전송될 필요가 있는 데이터의 압축률이 약 360:1 임을 의미한다. 여기에는 어떤 방식으로 식별될 필요가 있는 메시지 자체를 프로세싱하는 오버헤드가 포함되지 않지만, 이는 구현예에 따른다. 1차 광선에 대한 픽셀 ID로부터 광선 원점 및 방향을 다시 컴퓨팅하고, 광선 패킷의 범위에 기초하여 픽셀 ID를 다시 계산하고, 값을 다시 컴퓨팅하기 위한 많은 다른 가능한 구현예를 위한 다른 동작이 수행될 수 있다. 그림자, 반사, 굴절, AO, 교차, 볼륨 교차, 셰이딩, 경로 추적의 반사 등을 포함하는, 전송된 광선의 단일 또는 그룹에 대해 유사한 동작을 사용할 수 있다.
도 37은 광선 추적 패킷의 압축 및 압축 해제를 수행하는 2개의 광선 추적 노드(3710, 3711)에 대한 추가 세부 사항을 도시한다. 특히, 제 1 광선 추적 엔진(3730)이 제 2 광선 추적 엔진(3731)으로 데이터를 전송할 준비가 되면, 광선 압축 회로(3720)는 본 명세서에 설명된 광선 추적 데이터의 손실 및/또는 무손실 압축을 수행한다(예를 들어, 32 비트 값에서 8 비트 값으로 변환, 미가공 데이터를 데이터 재구성 명령어로 대체하는 등). 압축된 광선 패킷(3701)은 로컬 네트워크(예를 들어, 10Gb/s, 100Gb/s 이더넷 네트워크)를 통해 네트워크 인터페이스(3725)로부터 네트워크 인터페이스(3726)로 전송된다. 이후, 광선 압축 해제 회로는 적절한 시기에 광선 패킷을 압축 해제한다. 예를 들어, 광선 추적 데이터를 재구성하는 커맨드를 실행할 수 있다(예를 들어, 랜덤 시드를 사용하여 조명 동작을 위한 랜덤 샘플링을 수행함). 이후, 광선 추적 엔진(3731)은 수신된 데이터를 사용하여 광선 추적 동작을 수행한다.
반대 방향에서, 광선 압축 회로(3741)는 광선 데이터를 압축하고, 네트워크 인터페이스(3726)는 압축된 광선 데이터를 네트워크를 통해(예를 들어, 본 명세서에 설명된 기술을 사용하여) 전송하고, 광선 압축 해제 회로(3740)는 필요할 때 광선 데이터를 압축 해제하고, 광선 추적 엔진(3730)은 광선 추적 동작에 그 데이터를 사용한다. 도 37에 별도의 유닛으로 도시되어 있지만, 광선 압축 해제 회로(3740, 3741)는 각각 광선 추적 엔진(3730, 3731) 내에 통합될 수 있다. 예를 들어, 압축된 광선 데이터가 광선 데이터를 재구성하는 커맨드를 포함하는 한, 이들 커맨드는 각각의 광선 추적 엔진(3730, 3731)에 의해 각각 실행될 수 있다.
도 38에 도시된 것과 같이, 광선 압축 회로(3720)는 본 명세서에 설명된 손실 압축 기술(예를 들어, 32 비트 부동 소수점 좌표를 8 비트 정수 좌표로 변환)을 수행하기 위한 손실 압축 회로(3801) 및 무손실 압축 기술(예를 들어, 광선 재압축 회로(3821)가 데이터를 재구성할 수 있도록 커맨드 및 데이터를 전송)을 수행하기 위한 무손실 압축 회로(3803)를 포함할 수 있다. 광선 압축 해제 회로(3721)는 손실 압축 해제 회로(3802) 및 무손실 압축 해제를 수행하기 위한 무손실 압축 해제 회로(3804)를 포함한다.
다른 예시적인 방법이 도 39에 도시되어 있다. 이 방법은 본 명세서에 설명된 광선 추적 아키텍처 또는 다른 아키텍처에서 구현될 수 있지만, 임의의 특정 아키텍처로 한정되는 것은 아니다.
3900에서, 제 1 광선 추적 노드로부터 제 2 광선 추적 노드로 전송될 광선 데이터가 수신된다. 3901에서는 손실 압축 회로가 제 1 광선 추적 데이터에 대해 손실 압축을 수행하고, 3902에서는 무손실 압축 회로가 제 2 광선 추적 데이터에 대해 무손실 압축을 수행한다. 3903에서, 압축된 광선 추적 데이터는 제 2 광선 추적 노드로 전송된다. 3904에서는 손실/무손실 압축 해제 회로가 광선 추적 데이터의 손실/무손실 압축 해제를 수행하고, 3905에서는 제 2 광선 추적 노드가 압축 해제된 데이터를 사용하여 광선 추적 동작을 수행한다.
하드웨어 가속된 하이브리드 광선 추적을 수행하는 그래픽 프로세서
다음에, 그래픽 코어(3130) 상에서 래스터화를 수행하고 광선 추적 코어(3150), 그래픽 코어(3130) 및/또는 CPU(3199) 코어 상에서 광선 추적 동작을 수행하는 하이브리드 렌더링 파이프라인이 제시된다. 예를 들어, 1차 광선 캐스팅 단계 대신에 그래픽 코어(3130) 상에서 래스터화 및 깊이 테스트가 수행될 수 있다. 이후, 광선 추적 코어(3150)는 광선 반사, 굴절 및 그림자에 대한 2차 광선을 생성할 수 있다. 또한, 광선 추적 코어(3150)가(예를 들어, 높은 반사율 레벨과 같은 재질 특성 임계값에 기초하여) 광선 추적 동작을 수행할 장면의 특정 영역이 선택될 것이고, 장면의 다른 영역은 그래픽 코어(3130) 상에서 래스터화되어 렌더링될 것이다. 이 하이브리드 구현예는 대기 시간이 중요한 문제인 실시간 광선 추적 애플리케이션에 사용될 수 있다.
후술되는 광선 탐색 아키텍처는, 예를 들어, 전용 하드웨어를 사용하여 BVH 탐색 및/또는 교차와 같은 중요한 기능을 가속시키면서 기존의 단일 명령어 복수 데이터(SIMD) 및/또는 단일 명령어 복수 스레드(SIMT) 그래픽 프로세서를 사용하여 광선 탐색의 프로그램 가능한 셰이딩 및 제어를 수행할 수 있다. 비간섭 경로에 대한 SIMD 점유는 탐색 동안 및 셰이딩 전에 특정 포인트에서 생성된 셰이더를 다시 그룹화함으로써 개선될 수 있다. 이는 온-칩에서 셰이더를 동적으로 정렬하는 전용 하드웨어를 사용하여 달성된다. 하나의 기능을 반환시 실행되는 연속물로 분할하고 개선된 SIMD 점유를 위해 실행 전에 연속물을 다시 그룹화함으로써 재귀성이 관리된다.
광선 탐색/교차의 프로그램 가능한 제어는, 탐색 기능을, 고정 기능 하드웨어로서 구현되는 내부 탐색과, GPU 프로세서 상에서 실행되고 사용자 정의 탐색 셰이더를 통해 프로그램 가능한 제어를 가능하게 하는 외부 탐색으로 나눔으로써 달성된다. 내부 탐색과 외부 탐색 사이의 전환 중에 내부 탐색 상태를 보수적으로 축소시킴으로써 하드웨어와 소프트웨어 사이의 탐색 컨텍스트를 전송하는 비용이 감소된다.
광선 추적의 프로그램 가능한 제어는 아래 표 A에 열거된 상이한 셰이더 타입을 통해 표현될 수 있다. 각 타입마다 복수의 셰이더가 있을 수 있다. 예를 들어 각각의 재질마다 다른 히트 셰이더가 있을 수 있다.
Figure pat00001
재귀적 광선 추적은 그래픽 프로세서가 1차 광선에 대한 광선-장면 교차를 생성할 수 있는 1차 셰이더 또는 교차 회로의 세트를 개시하도록 명령하는 API 기능에 의해 개시될 수 있다. 이것은 탐색, 히트 셰이더 또는 비교차 셰이더와 같은 다른 셰이더를 생성한다. 자식 셰이더를 생성하는 셰이더는 또한 해당 자식 셰이더로부터 반환 값을 수신할 수 있다. 호출 가능한 셰이더는 다른 셰이더가 직접 생성할 수 있고 또한 호출 셰이더에 값을 반환할 수 있는 범용 함수이다.
도 40은 셰이더 실행 회로(4000) 및 고정 기능 회로(4010)를 포함하는 그래픽 프로세싱 아키텍처를 도시한다. 범용 실행 하드웨어 서브시스템은 복수의 단일 명령어 복수 데이터(SIMD) 및/또는 단일 명령어 복수 스레드(SIMT) 코어/실행 유닛(EU)(4001)(즉, 각각의 코어는 복수의 실행 유닛을 포함할 수 있음), 하나 이상의 샘플러(4002), 및 레벨 1(L1) 캐시(4003) 또는 다른 형태의 로컬 메모리를 포함한다. 고정 기능 하드웨어 서브시스템(4010)은 메시지 유닛(4004), 스케줄러(4007), 광선-BVH 탐색/교차 회로(4005), 정렬 회로(4008) 및 로컬 L1 캐시(4006)를 포함한다.
동작 중에, 1차 디스패처(4009)는 SIMD/SIMT 코어/EU(4001) 상에서 실행되는 셰이더에 대한 작업을 스케줄링하는 스케줄러(4007)에 1차 광선 세트를 디스패치한다. SIMD 코어/EU(4001)는 전술한 광선 추적 코어(3150) 및/또는 그래픽 코어(3130)일 수 있다. 1차 셰이더를 실행하면 수행될(예를 들어, 하나 이상의 자식 셰이더 및/또는 고정 기능 하드웨어에 의해 실행될) 추가 작업이 생성된다. 메시지 유닛(4004)은 SIMD 코어/EU(4001)에 의해 생성된 작업을 스케줄러(4007)에 분산시키고, 필요에 따라 자유 스택 풀, 정렬 회로(4008) 또는 광선-BVH 교차 회로(4005)에 액세스한다. 추가 작업이 스케줄러(4007)에 전송되면, SIMD/SIMT 코어/EU(4001) 상에서의 프로세싱이 스케줄링된다. 스케줄링 전에, 정렬 회로(4008)는 본 명세서에 설명된 것과 같이 광선을 그룹 또는 빈(bin)으로 정렬할 수 있다(예를 들어, 유사한 특성을 갖는 광선을 그룹화함). 광선-BVH 교차 회로(4005)는 BVH 볼륨을 사용하여 광선의 교차 검사를 수행한다. 예를 들어, 광선-BVH 교차 회로(4005)는 광선에 의해 교차되는 볼륨을 식별하기 위해 광선 좌표를 BVH의 각각의 레벨과 비교할 수 있다.
셰이더는 셰이더 레코드, 엔트리 기능에 대한 포인터를 포함하는 사용자-할당 구조, 벤더-지정 메타데이터, 및 SIMD 코어/EU(4001)에 의해 실행되는 셰이더에 대한 전역 인수를 사용하여 참조될 수 있다. 셰이더의 각각의 실행 인스턴스는 호출 스택과 연관되며, 호출 스택은 부모 셰이더와 자식 셰이더 간에 전달되는 인수를 저장하는데 사용될 수 있다. 호출 스택은 또한 호출이 반환될 때 실행되는 연속 함수에 대한 참조를 저장할 수 있다.
도 41은 1차 셰이더 스택, 히트 셰이더 스택, 탐색 셰이더 스택, 연속 함수 스택 및 광선-BVH 교차 스택을 포함하는 할당된 스택(4101)의 예시적 세트를 도시한다(전술한 것과 같이, 할당된 스택은 고정 기능 하드웨어(4010)에 의해 실행될 수 있음). 새로운 셰이더 호출은 자유 스택 풀(4102)로부터 새로운 스택을 구현할 수 있다. 호출 스택(예를 들어, 할당된 스택의 세트에 의해 구성된 스택)은 액세스의 지연을 줄이기 위해 로컬 L1 캐시(4003, 4006)에 캐싱될 수 있다.
한정된 개수의 호출 스택이 존재할 수 있으며, 각각은 연속된 메모리 영역에 할당된 고정된 최대 크기 "Sstack"을 갖는다. 따라서 스택의 베이스 주소는, 베이스 주소 = SID * Sstack와 같이 스택 인덱스(SID)로부터 직접 계산될 수 있다. 스택 ID는 SIMD 코어/EU(4001)에 작업을 스케줄링할 때 스케줄러(4007)에 의해 할당 및 할당 해제될 수 있다.
1차 디스패처(4009)는 호스트(예를 들어, CPU)로부터의 디스패치 커맨드에 응답하여 1차 셰이더를 디스패치하는 그래픽 프로세서 커맨드 프로세서를 포함할 수 있다. 스케줄러(4007)는 이러한 디스패치 요청을 수신할 수 있고, 각각의 SIMD 레인에 대해 스택 ID를 할당할 수 있는 경우 SIMD 프로세서 스레드 상에 1차 셰이더를 개시한다. 스택 ID는 디스패치 커맨드의 시작 부분에서 초기화되는 자유 스택 풀(4102)로부터 할당될 수 있다.
실행 셰이더는 생성 메시지를 메시지 유닛(4004)에 전송함으로써 자식 셰이더를 생성할 수 있다. 이 커맨드는 셰이더와 관련된 스택 ID를 포함하고, 또한 각각의 활성 SIMD 레인에 대해 자식 셰이더 레코드에 대한 포인터를 포함한다. 부모 셰이더는 활성 레인에 대해 이 메시지를 한 번만 발행할 수 있다. 모든 관련 레인에 대한 생성 메시지를 전송한 후, 부모 셰이더는 종료될 수 있다.
SIMD 코어/EU(4001) 상에서 실행된 셰이더는 또한 고정 기능 하드웨어 용으로 예약된 셰이더 레코드 포인터를 가진 생성 메시지를 사용하여 광선-BVH 교차와 같은 고정 기능 태스크를 생성할 수 있다. 전술한 것과 같이, 메시지 유닛(4004)은 생성된 광선-BVH 교차 작업을 고정 기능 광선-BVH 교차 회로(4005)로 전송하고, 호출 가능 셰이더를 정렬 회로(4008)로 직접 전송한다. 정렬 회로는 셰이더 레코드 포인터에 의해 셰이더를 그룹화하여 비슷한 특성을 가진 SIMD 배치(batch)를 도출할 수 있다. 따라서, 상이한 부모 셰이더로부터의 스택 ID는 정렬 회로(4008)에 의해 동일한 배치로 그룹화될 수 있다. 정렬 회로(4008)는 그룹화된 배치를 스케줄러(4007)로 전송하고, 스케줄러는 그래픽 메모리(2511) 또는 LLC(4020)로부터의 셰이더 레코드에 액세스하고 프로세서 스레드 상에서 셰이더를 개시한다.
연속물은 호출 가능 셰이더로 취급되며 또한 셰이더 레코드를 통해 참조될 수 있다. 자식 셰이더가 생성되고 값을 부모 셰이더에 반환하면, 연속 셰이더 레코드에 대한 포인터가 도 47에 호출 스택(4101) 상에서 푸시될 수 있다. 자식 셰이더가 반환하면 연속 셰이더 레코드가 호출 스택(4101)으로부터 표시될 수 있고, 연속 셰이더가 생성될 수 있다. 선택적으로, 생성된 연속물은 호출 가능 셰이더와 유사한 정렬 유닛을 거쳐 프로세서 스레드 상에서 개시될 수 있다.
도 42에 도시된 것과 같이, 정렬 회로(4008)는 셰이딩을 위한 SIMD 배치를 생성하는 셰이더 레코드 포인터(4201A, 4201B, 4201n)에 의해 생성된 태스크를 그룹화한다. 정렬된 배치의 스택 ID 또는 컨텍스트 ID는 상이한 디스패치 및 상이한 입력 SIMD 레인으로부터 그룹화될 수 있다. 그룹화 회로(4210)는 태그(4201)로 각각 식별되는 복수의 엔트리를 포함하는 CAM(content addressable memory) 구조(4201)를 사용하여 정렬을 수행할 수 있다. 전술한 것과 같이, 태그(4201)는 대응하는 셰이더 레코드 포인터(4201A, 4201B, 4201n)일 수 있다. CAM 구조(4201)는 셰이더 레코드 포인터에 대응하는 불완전한 SIMD 배치와 각각 관련된 한정된 개수의 태그(예를 들어, 32, 64, 128 등)를 저장할 수 있다.
들어오는 생성 커맨드에 대해, 각각의 SIMD 레인은 대응하는 스택 ID(각각의 CAM 엔트리에서 16개의 컨텍스트 ID 0-15로 도시됨) 및 셰이더 레코드 포인터(4201A, 4201B 내지 4201n)(태그 값으로 작용함)를 갖는다. 그룹화 회로(4210)는 각각의 레인에 대한 셰이더 레코드 포인터를 CAM 구조(4201)에서의 태그(4201)와 비교하여 매칭하는 배치를 찾는다. 매칭하는 배치가 발견되면 스택 ID/컨텍스트 ID가 배치에 추가될 수 있다. 그렇지 않으면 새로운 셰이더 레코드 포인터 태그를 갖는 새로운 엔트리가 생성될 수 있고, 불완전한 배치를 갖는 오래된 엔트리는 제거될 수 있다.
실행 셰이더는 할당 해제 메시지를 메시지 유닛에 전송함으로써 호출 스택이 비었을 때 호출 스택의 할당을 해제할 수 있다. 할당 해제 메시지는 스케줄러로 전달되고, 스케줄러는 활성 SIMD 레인에 대한 스택 ID/컨텍스트 ID를 자유 풀(pool)로 반환한다.
고정 기능 광선 탐색 및 소프트웨어 광선 탐색의 결합을 사용하는 광선 탐색 동작을 위한 하이브리드 접근법이 제시된다. 결과적으로 이는 고정 기능 탐색의 효율성을 유지하면서 소프트웨어 탐색의 유연성을 제공한다. 도 43은 단일 상위 BVH(4300)과 몇몇의 하위 BVH(4301, 4302)를 가진 2 레벨 트리인 하이브리드 탐색에 사용될 수 있는 가속 구조를 도시한다. 오른쪽에 도시된 그래픽 요소는 내부 탐색 경로(4303), 외부 탐색 경로(4304), 탐색 노드(4305), 삼각형을 갖는 리프 노드(4306) 및 커스텀 프리미티브를 갖는 리프 노드(4307)를 표시한다.
상위 BVH(4300)에서 삼각형을 갖는 리프 노드(4306)는 삼각형, 커스텀 프리미티브를 위한 교차 셰이더 레코드 또는 탐색 셰이더 레코드를 참조할 수 있다. 하위 BVH(4301, 4302)의 삼각형을 갖는 리프 노드(4306)는 커스텀 프리미티브에 대한 삼각형 및 교차 셰이더 레코드만을 참조할 수 있다. 참조의 타입은 리프 노드(4306) 내에 인코딩된다. 내부 탐색(4303)은 각각의 BVH(4300-4302) 내의 탐색을 지칭한다. 내부 탐색 동작은 광선-BVH 교차의 계산을 포함하며, BVH 구조(4300-4302)에 걸친 탐색을 외부 탐색이라고 한다. 내부 탐색 동작은 고정 기능 하드웨어에서 효율적으로 구현될 수 있으며, 외부 탐색 동작은 프로그램 가능한 셰이더를 사용하여 허용 가능한 성능으로 수행될 수 있다. 결과적으로, 고정 기능 회로(4010)를 사용하여 내부 탐색 동작이 수행될 수 있고, 프로그램 가능한 셰이더를 실행하기 위해 SIMD/SIMT 코어/EU(4001)를 포함하는 셰이더 실행 회로(4000)를 사용하여 외부 탐색 동작이 수행될 수 있다.
SIMD/SIMT 코어/EU(4001)는 간결성을 위해 여기에서 간단히 "코어", "SIMD 코어", "EU" 또는 "SIMD 프로세서"라고 지칭된다. 유사하게, 광선-BVH 탐색/교차 회로(4005)는 때때로 간단히 "탐색 유닛", "탐색/교차 유닛" 또는 "탐색/교차 회로"라고 지칭된다. 다른 용어가 사용될 때, 각각의 회로/로직을 지정하는데 사용된 특정 명칭은, 본 명세서에 설명된 것과 같이, 회로/로직이 수행하는 기본 기능을 변경시키지 않는다.
더욱이, 설명을 위해 도 40에는 단일 컴포넌트로서 도시되어 있지만, 탐색/교차 유닛(4005)은 개별 탐색 유닛 및 개별 교차 유닛을 포함할 수 있으며, 이들 각각은 본 명세서에 설명된 것과 같이 회로 및/또는 로직으로 구현될 수 있다.
내부 탐색 동안 광선이 탐색 노드와 교차할 때, 탐색 셰이더가 생성될 수 ㅇ있다. 정렬 회로(4008)는 셰이더 레코드 포인터(4201A, 4201B, 4201n)에 의해 이들 셰이더를 그룹화하여 SIMD 배치를 생성할 수 있는데, SIMD 배치는 SIMD 코어/EU(4001) 상에서 SIMD 실행을 위해 스케줄러(4007)에 의해 개시된다. 탐색 셰이더는 여러 가지 방법으로 탐색을 수정할 수 있으므로, 광범위한 애플리케이션을 가능하게 한다. 예를 들어, 탐색 셰이더는 더 거친 LOD(level of detail)로 BVH를 선택하거나 또는 광선을 변형하여 강체 변환을 가능하게 할 수 있다. 이후, 탐색 셰이더는 선택된 BVH에 대한 내부 탐색를 생성할 수 있다.
내부 탐색은, BVH를 탐색하고 광선 박스 및 광선-삼각형 교차를 계산함으로써 광선-BVH 교차를 컴퓨팅한다. 내부 탐색은, 메시지를 메시지 회로(4004)에 전송하고, 메시지 회로가 대응하는 메시지를 광선-BVH 교차 회로(4005)에 전달하고, 광선-BVH 교차 회로가 광선-BVH 교차를 컴퓨팅함으로써 셰이더와 동일한 방식으로 생성된다.
내부 탐색을 위한 위한 스택은 고정 기능 회로(4010)(예를 들어, L1 캐시(4006) 내)에 로컬로 저장될 수 있다. 광선이 탐색 셰이더 또는 교차 셰이더에 대응하는 리프 노드와 교차하면 내부 탐색이 종료될 수 있고 내부 스택은 축소될 수 있다. 광선 및 BVH에 대한 포인터와 함께 축소된 스택은 호출 셰이더에 의해 지정된 위치에서 메모리에 기록될 수 있고, 이후 대응하는 탐색 셰이더 또는 교차 셰이더가 생성될 수 있다. 내부 탐색 동안 광선이 임의의 삼각형과 교차하면 아래의 코드에 도시된 바와 같이 대응하는 히트 정보가 이러한 셰이더에 대한 입력 인수로서 제공된다. 이 생성된 셰이더는 정렬 회로(4008)에 의해 그룹화되어 실행을 위한 SIMD 배치를 생성할 수 있다.
struct HitInfo {
float barycentrics[2];
float tmax;
bool innerTravComplete;
uint primID;
uint geomID;
ShaderRecord* leafShaderRecord;
}
내부 탐색 스택을 축소하면 스택을 메모리에 유출하는 비용이 줄어든다. 스택을 스택의 맨 위에서의 작은 수의 엔트리, 42 비트의 재시작 트레일 및 6 비트의 깊이 값으로 축소하기 위해, Restart Trail for Stackless BVH Traversal, High Performance Graphics(2010), 107-111 페이지에 설명된 접근법이 적용될 수 있다. 재시작 트레일은 BVH 내로 이미 가져온 분기를 나타내고, 깊이 값은 마지막 스택 엔트리에 대응하는 탐색의 깊이를 나타낸다. 이것은 나중에 내부 탐색을 재개하기에 충분한 정보이다.
내부 스택이 비어 있고 테스트할 BVH 노드가 더 이상 없을 때 내부 탐색이 완료된다. 이 경우, 외부 스택이 비어 있지 않다면, 외부 스택 핸들러가 생성되어 외부 스택의 맨 위에 표시되고, 탐색을 재개한다.
외부 탐색은 메인 탐색 상태 머신을 실행할 수 있고, 셰이더 실행 회로(4000)에 의해 실행되는 프로그램 코드로 구현될 수 있다. 이는(1) 새로운 광선이 히트 셰이더 또는 1차 셰이더에 의해 생성될 때;(2) 탐색 셰이더가 탐색을 위해 BVH를 선택할 때; 그리고(3) 외부 스택 핸들러가 BVH에 대한 내부 탐색을 재개할 때, 내부 탐색 쿼리를 생성할 수 있다.
도 44에 도시된 것과 같이, 내부 탐색이 생성되기 전에, 고정 기능 회로(4010)를 위해 호출 스택(4405) 상에 공간이 할당되어 축소된 내부 스택(4410)을 저장한다. 호출 스택 및 내부 스택의 상부에 대한 오프셋(4403, 4404)은 탐색 상태(4400)에 유지되고, 이는 또한 메모리(2511)에 저장된다. 탐색 상태(4400)는 또한 월드 공간(4401) 및 객체 공간(4402)의 광선뿐만 아니라 최근접 교차하는 프리미티브에 대한 히트 정보를 포함한다.
탐색 셰이더, 교차 셰이더 및 외부 스택 핸들러는 모두 광선-BVH 교차 회로(4005)에 의해 생성된다. 탐색 셰이더는 제 2 레벨 BVH에 대한 새로운 내부 탐색을 시작하기 전에 호출 스택(4405)에 할당된다. 외부 스택 핸들러는 히트 정보를 업데이트하고 보류 중인 내부 탐색 태스크를 재개하는 역할을 담당하는 셰이더이다. 외부 스택 핸들러는 또한 탐색이 완료될 때 히트 또는 비교차 셰이더를 생성하는 역할을 담당한다. 생성할 보류 중인 내부 탐색 쿼리가 없으면 탐색이 완료된다. 탐색이 완료되고 교차가 발견되면 히트 셰이더가 생성되고, 그렇지 않으면 비교차 셰이더가 생성된다.
전술한 하이브리드 탐색 방식은 2-레벨 BVH 계층 구조를 사용하지만, 외부 탐색 구현예에서 대응하는 변화를 갖는 임의의 개수의 BVH 레벨이 또한 구현될 수 있다.
또한, 광선-BVH 교차를 수행하기 위해 고정 기능 회로(4010)가 위에서 설명되었지만, 다른 시스템 컴포넌트도 또한 고정 기능 회로로 구현될 수 있다. 예를 들어, 전술한 외부 스택 핸들러는 고정 기능 BVH 탐색/교차 회로(4005)로 잠재적으로 구현될 수 있는 내부(사용자는 볼 수 없는) 셰이더일 수 있다. 이 구현예는 디스패치된 셰이더 단계의 개수 및 고정 기능 교차 하드웨어(4005)와 프로세서 사이의 왕복 횟수를 감소시키는 데 사용될 수 있다.
본 명세서에 설명된 예들은 기존 및 향후의 GPU 프로세서 상에서 더 큰 SIMD 효율로 실행될 수 있는 사용자 정의 함수를 사용하여 프로그램 가능한 셰이딩 및 광선 탐색 제어를 가능하게 한다. 광선 탐색을 프로그램 가능하게 제어하면 절차적 인스턴스화, 확률적 LOD(level-of-detail) 선택, 커스텀 프리미티브 교차 및 추후(lazy) BVH 업데이트와 같은 몇 가지 중요한 기능을 사용할 수 있다.
히트 및 교차 셰이더의 추론적 실행을 지원하는 프로그램 가능한 복수 명령어 복수 데이터(MIMD) 광선 추적 아키텍처가 또한 제공된다. 특히, 이 아키텍처는 하이브리드 광선 추적 아키텍처에서 도 40과 관련하여 앞서 설명된 프로그램 가능한 SIMD/SIMT 코어/실행 유닛(4001)과 고정 기능 MIMD 탐색/교차 유닛(4005) 사이의 스케줄링 및 통신 오버헤드를 감소시키는 데 초점을 둔다. 히트 및 교차 셰이더의 복수 추론 실행 방식은 이하에서 설명되어 있는데, 이는 탐색 하드웨어로부터 단일 배치(batch)로 디스패치되므로 여러 번의 탐색 및 셰이딩 왕복을 피할 수 있다. 이러한 기술을 구현하는 전용 회로가 사용될 수 있다.
본 발명의 실시예는 전용 하드웨어 지원없이 구현될 때 상당한 오버헤드를 발생시키는 광선 탐색 쿼리로부터 복수의 히트 또는 교차 셰이더의 실행이 요구되는 사용 사례에서 특히 유리하다. 여기에는 최근접 k-히트 쿼리(k 최근접 교차에 대한 히트 셰이더를 개시) 및 복수의 프로그램 가능한 교차 셰이더가 포함되지만, 이에 한정되는 것은 아니다.
본 명세서에 설명된 기술은 도 40에 도시된 아키텍처에 대한 확장으로서 구현될 수 있다(도 40-44에 관련하여 설명됨). 특히, 본 발명의 본 실시예는 전술한 사용 사례의 성능을 향상시키는 개선된 기능을 갖는 이러한 아키텍처를 기반으로 한다.
하이브리드 광선 추적 탐색 아키텍처의 성능 한계는 실행 유닛으로부터 탐색 쿼리를 개시하는 오버헤드와 광선 추적 하드웨어로부터 프로그램 가능한 셰이더를 호출하는 오버헤드이다. 동일한 광선의 탐색 동안 복수의 히트 또는 교차 셰이더가 호출되면 이 오버헤드는 프로그램 가능한 코어(4001)와 탐색/교차 유닛(4005) 사이에 "실행 왕복"을 생성한다. 이것은 또한 개별 셰이더 호출로부터 SIMD/SIMT 일관성을 추출할 필요가 있는 정렬 유닛(4008)에 추가적인 압력을 가한다.
광선 추적의 여러 측면은 앞서 표 A에 열거된 상이한 셰이더 타입(즉, 1차, 히트, 임의의 히트, 비교차, 교차, 탐색 및 호출 가능)을 통해 표현될 수 있는 프로그램 가능한 제어를 필요로 한다. 각 타입마다 복수의 셰이더가 있을 수 있다. 예를 들어, 각각의 재질마다 다른 히트 셰이더가 있을 수 있다. 이러한 셰이더 타입 중 일부는 현재 Microsoft® Ray Tracing API에 정의되어 있다.
간단하게 다시 정리하면, 재귀적 광선 추적은 GPU가 1차 광선에 대한 광선-장면 교차를 생성(하드웨어 및/또는 소프트웨어로 구현됨)할 수 있는 1차 셰이더 세트를 개시하도록 명령하는 API 기능에 의해 시작된다. 이것은 또한 탐색, 히트 또는 비교차 셰이더와 같은 다른 셰이더를 생성할 수 있다. 자식 셰이더를 생성하는 셰이더는 또한 해당 셰이더로부터 반환 값을 받을 수 있다. 호출 가능 셰이더는 다른 셰이더가 직접 생성할 수 있고 호출 셰이더에 값을 반환할 수 있는 범용 함수이다.
광선 탐색은 경계 볼륨 계층 구조(BVH)에서 노드를 탐색하고 교차시킴으로써 광선-장면 교차를 컴퓨팅한다. 최근의 연구에 따르면, 정밀 산술 감소, BVH 압축, 광선 당 상태 머신, 전용 교차 파이프라인 및 커스텀 캐시와 같은, 고정 기능 하드웨어에 더 적합한 기술을 사용하여 광선-장면 교차의 컴퓨팅 효율을 몇 배 이상 향상시킬 수 있다.
도 40에 도시된 아키텍처는 SIMD/SIMT 코어/실행 유닛(4001)의 어레이가 고정 기능 광선 추적/교차 유닛(4005)과 상호 작용하여 프로그램 가능한 광선 추적을 수행하는 시스템을 포함한다. 프로그램 가능한 셰이더는 실행 유닛/코어(4001) 상의 SIMD/SIMT 스레드에 매핑되고, 여기서 SIMD/SIMT 사용률, 실행 및 데이터 일관성은 최적의 성능을 위해 중요하다. 광선 쿼리는 종종 다음과 같은 여러 가지 이유로 일관성을 손상시킨다.
● 탐색 차이: BVH 탐색 기간은 비동기 광선 프로세싱을 선호하는 광선 중에서 매우 다양하다.
● 실행 차이: 동일한 SIMD/SIMT 스레드의 다른 레인에서 생성된 광선은 다른 셰이더 호출을 초래할 수 있다.
● 데이터 액세스 차이: 예를 들어, 서로 다른 표면에 닿는 광선은 서로 다른 BVH 노드와 프리미티브를 샘플링하고, 셰이더는 서로 다른 텍스처에 액세스한다. 다른 다양한 시나리오로 인해 데이터 액세스 차이가 발생할 수 있다.
SIMD/SIMT 코어/실행 유닛(4001)은, 그래픽 코어(들)(415A, 415B), 셰이더 코어(1355A-1355N), 그래픽 코어(3130), 그래픽 실행 유닛(608), 실행 유닛(852A, 852B), 또는 본 명세서에 설명된 임의의 다른 코어/실행 유닛를 포함하는, 본 명세서에 설명된 코어/실행 유닛의 변형일 수 있다. SIMD/SIMT 코어/실행 유닛(4001)은, 그래픽 코어(들)(415A, 415B), 셰이더 코어(1355A-1355N), 그래픽 코어(3130), 그래픽 실행 유닛(608), 실행 유닛(852A, 852B), 또는 본 명세서에 설명된 임의의 다른 코어/실행 유닛 대신 사용될 수 있다. 따라서, 그래픽 코어(들)(415A, 415B), 셰이더 코어(1355A-1355N), 그래픽 코어(3130), 그래픽 실행 유닛(608), 실행 유닛(852A, 852B), 또는 본 명세서에 설명된 임의의 다른 코어/실행 유닛과 결합된 임의의 특징의 개시는 또한 도 40의 SIMD/SIMT 코어/실행 유닛(4001)과의 대응하는 결합을 개시지만, 이에 한정되는 것은 아니다.
고정 기능 광선 탐색/교차 유닛(4005)은 각각의 광선을 개별적으로 그리고 비순차적으로 프로세싱함으로써 처음 2개의 과제를 극복할 수 있다. 그러나, 이로 인해 SIMD/SIMT 그룹이 손상된다. 따라서, 정렬 유닛(4008)은 새롭고 일관된 셰이더 호출의 SIMD/SIMT 그룹을 형성하여 다시 실행 유닛으로 디스패치하는 역할을 ㄷ담당한다.
SIMD/SIMT 프로세서 상에서 직접 소프트웨어만을 기반으로 하는 광선 추적 구현예과 비교하면, 이러한 아키텍처의 이점을 쉽게 발견할 수 있다. 그러나, SIMD/SIMT 코어/실행 유닛(4001)(때로는 간단히 SIMD/SIMT 프로세서 또는 코어/EU로 지칭됨)과 MIMD 탐색/교차 유닛(4005) 사이의 메시징과 관련된 오버헤드가 존재한다. 또한, 정렬 유닛(4008)은 일관되지 않는 셰이더 호출로부터 완벽한 SIMD/SIMT 활용을 이끌어 낼 수 없다.
탐색 동안 셰이더 호출이 특히 빈번할 수 있는 사용 사례가 식별될 수 있다. 코어/EU(4001)와 탐색/교차 유닛(4005) 사이의 통신 오버헤드를 상당히 감소시키는 하이브리드 MIMD 광선 추적 프로세서에 대한 개선이 설명된다. 이것은 k-최근접 교차 및 프로그램 가능한 교차 셰이더의 구현예를 발견할 때 특히 유리할 수 있다. 그러나 본 명세서에 설명된 기술은 특정 프로세싱 시나리오로 한정되지 않는다.
코어/EU(4001)와 고정 기능 탐색/교차 유닛(4005) 사이의 광선 추적 컨텍스트 전환의 높은 수준의 비용에 관한 요약은 아래에 제공된다. 대부분의 성능 오버헤드는 단일 광선 탐색 중에 셰이더 호출이 필요할 때마다 이 두 컨텍스트가 전환됨으로 인해 발생한다.
광선을 발사하는 각각의 SIMD/SIMT 레인은 탐색할 BVH와 관련된 탐색/교차 유닛(4005)에 생성 메시지를 생성한다. 데이터(광선 탐색 컨텍스트)는 생성 메시지 및(캐싱된) 메모리를 통해 탐색/교차 유닛(4005)으로 전달된다. 탐색/교차 유닛(4005)이 새로운 하드웨어 스레드를 생성 메시지에 할당할 준비가 되면 탐색 상태를 로딩하고 BVH 상에서 탐색을 수행한다. 또한, BVH 상에서 첫 번째 탐색 단계 전에 수행되어야 하는 설정 비용이 존재한다.
도 45는 프로그램 가능한 광선 추적 파이프라인의 동작 흐름을 도시한다. 탐색(4502) 및 교차(4503)를 포함하는 음영 처리된 요소는 고정 기능 회로에서 구현될 수 있고, 나머지 요소는 프로그램 가능한 코어/실행 유닛으로 구현될 수 있다.
1차 광선 셰이더(4501)는 BVH(또는 다른 가속 구조)를 통해 현재 광선(들)을 탐색하는 탐색 회로(4502)로 작업을 전송한다. 리프 노드에 도달하면, 탐색 회로는 교차 회로(4503)를 호출하고, 교차 회로는, 광선-삼각형 교차를 식별할 때, 임의의 히트 셰이더(4504)를 호출한다(임의의 히트 셰이더는 도시된 것과 같이 탐색 회로에 결과를 다시 제공할 수 있다).
이와 달리, 탐색은 리프 노드에 도달하기 전에 종료될 수 있고,(히트가 기록된 경우) 최근접 히트 셰이더(4507)가 호출되거나 또는(비교차인 경우) 에서 비교차 셰이더(4506)가 호출된다.
도시된 것과 같이, 탐색 회로가 커스텀 프리미티브 리프 노드에 도달하면 교차 셰이더(4505)가 호출될 수 있다. 커스텀 프리미티브는 다각형 또는 다면체(예를 들어, 사면체, 복셀(voxel), 육면체, 쐐기, 피라미드 또는 다른 "구조화되지 않은" 볼륨)와 같은 임의의 비삼각형 프리미티브일 수 있다. 교차 셰이더(4505)는 광선 및 커스텀 프리미티브 사이의 임의의 교차를 식별하고, 임의의 히트 프로세싱을 구현하는 임의의 히트 셰이더(4504)에 전달한다.
하드웨어 탐색(4502)이 프로그램 가능한 단계에 도달하면, 탐색/교차 유닛(4005)은 셰이더를 실행하는 데 사용되는 실행 유닛(들)의 단일 SIMD 레인에 대응하는 관련 셰이더(4505-4507)에 셰이더 디스패치 메시지를 생성할 수 있다. 디스패치는 광선의 임의의 순서로 발생하고, 호출된 프로그램에서 분기되므로, 정렬 유닛(4008)은 일관성 있는 SIMD 배치(batch)를 추출하기 위해 복수의 디스패치 호출을 축적할 수 있다. 업데이트된 탐색 상태 및 선택적인 셰이더 인수는 탐색/교차 유닛(4005)에 의해 메모리(2511)에 기록될 수 있다.
k-최근접 교차 문제에서, 최근접 히트 셰이더(4507)가 첫 번째 k 교차에 대해 실행된다. 기존 방식에서는, 최근접 교차를 찾고, 히트 셰이더를 호출하고, 히트 셰이더로부터 새로운 광선을 생성하여(광선 원점 오프셋을 갖는) 다음의 최근접 교차를 발견하면(따라서, 같은 교차가 다시 발생하지 않으면), 이는 광선 탐색이 종료하는 것을 의미한다. 이 구현예는 단일 광선에 대해 k 광선 생성이 필요하다는 것을 쉽게 알 수 있다. 다른 구현예는 모든 교차에 대해 호출되고 삽입 정렬 동작을 사용하여 최근접 교차의 전체 목록을 유지하는 임의의 히트 셰이더(4504)에서 동작한다. 이 접근법의 주요 문제점은 임의의 히트 셰이더 호출의 상한이 없다는 것이다.
전술한 것과 같이, 비삼각형(커스텀) 프리미티브에 대해 교차 셰이더(4505)가 호출될 수 있다. 교차 테스트 결과와 탐색 상태(보류 중인 노드 및 프리미티브 교차)에 따라 교차 셰이더(4505)의 실행 후 동일한 광선의 탐색을 계속할 수 있다. 따라서 최근접 히트를 발견하기 위해서는 실행 유닛에 몇 번의 왕복이 필요할 수 있다.
탐색 하드웨어 및 셰이더 스케줄링 모델의 변경을 통해 교차 셰이더(4505) 및 히트 셰이더(4504, 4507)에 대한 SIMD-MIMD 컨텍스트 전환의 감소에 또한 초점을 둘 수 있다. 먼저, 광선 탐색 회로(4005)는 복수의 잠재적 호출을 축적하고 이들을 더 큰 배치(batch)로 디스패치함으로써 셰이더 호출을 지연시킨다. 또한, 이 단계에서 불필요하다고 판단된 일부 호출이 제거될 수 있다. 또한, 셰이더 스케줄러(4007)는 동일한 탐색 컨텍스트로부터의 복수의 셰이더 호출을 단일 SIMD 배치에 수집하여 단일 광선 생성 메시지를 생성할 수 있다. 일 예시적 구현에서, 탐색 하드웨어(4005)는 탐색 스레드를 중단하고 복수의 셰이더 호출의 결과를 기다린다. 이 동작 모드는 여기에서 "추론적" 셰이더 실행으로 지칭되는데, 이는 복수의 셰이더의 디스패치를 허용하여, 일부는 순차적 호출을 사용할 때 호출되지 않을 수 있기 때문이다.
도 46a는 탐색 동작이 서브트리에서 복수의 커스텀 프리미티브(4650)를 만나는 예를 도시하고, 도 46b는 이것이 3개의 교차 디스패치 주기(C1-C3)에서 어떻게 해결될 수 있는지를 도시한다. 특히, 스케줄러(4007)는 SIMD 프로세서(4001)에 작업을 제출하기 위해 3개의 주기를 필요로 할 수 있고, 탐색 회로(4005)는 결과를 정렬 유닛(4008)에 제공하기 위해 3개의 주기를 필요로 한다. 탐색 회로(4005)에 의해 요구되는 탐색 상태(4601)는 로컬 캐시(예를 들어, L1 캐시 및/또는 L2 캐시)와 같은 메모리에 저장될 수 있다.
A. 지연된 광선 추적 셰이더 호출
리스트에서 복수의 잠재적인 교차 또는 히트 호출의 축적을 허용하도록 하드웨어 탐색 상태(4601)가 관리되는 방식이 또한 수정될 수 있다. 탐색 동안 지정된 시간에 리스트의 각각의 엔트리를 사용하여 셰이더 호출을 생성할 수 있다. 예를 들어, k-최근접 교차 포인트는 탐색 하드웨어(4005) 및/또는 메모리의 탐색 상태(4601)에 축적될 수 있고, 탐색이 완료되면 각각의 요소에 대해 히트 셰이더가 호출될 수 있다. 히트 셰이더의 경우 BVH의 서브트리에 대해 복수의 잠재적인 교차가 축적될 수 있다.
최근접-k 사용 사례에 있어서, 이 접근법의 이점은 SIMD 코어/EU(4001)로의 k-1회 왕복 및 k-1개의 새로운 광선 생성 메시지 대신에, 모든 히트 셰이더가 동일한 탐색 스레드로부터 탐색 회로(4005) 상에서 단일 탐색 동작 동안 호출된다는 것이다. 잠재적인 구현예에 있어서 문제점은 히트 셰이더의 실행 순서를 보장하는 것이 사소한 것이 아니라는 점이다(표준 "왕복" 접근법은 최근접 교차의 히트 셰이더가 먼저 실행되는 것을 보장한다). 이것은 히트 셰이더의 동기화 또는 순서의 완화에 의해 해결될 수 있다.
교차 셰이더 사용 사례에서, 탐색 회로(4005)는 주어진 셰이더가 긍정적인 교차 테스트를 반환할 것인지를 미리 알지 못한다. 그러나 복수 교차 셰이더를 추론적으로 실행할 수 있으며 적어도 하나의 교차 셰이더가 긍정적인 히트 결과를 반환하면 전역 최근접 히트에 병합된다. 특정 구현예는 디스패치 호출 횟수를 줄이되 중복 교차 셰이더를 너무 많이 호출하지 않기 위해 지연된 교차 테스트의 최적의 횟수를 발견하는 것을 필요로 한다.
B. 탐색 회로로부터 셰이더 호출 수집
탐색 회로(4005) 상에서 생성된 동일한 광선으로부터 복수의 셰이더를 디스패치할 때, 광선 탐색 알고리즘의 흐름에 분기가 생성될 수 있다. 이것은 BVH 탐색의 나머지가 모든 디스패치된 교차 테스트의 결과에 의존하기 때문에 교차 셰이더에 문제가 될 수 있다. 이것은 셰이더 호출의 결과를 기다리는 동기화 동작이 필요하다는 것을 의미하며, 이는 비동기 하드웨어에서 문제가 될 수 있다.
셰이더 호출의 결과를 병합하는 2개의 지점은 SIMD 프로세서(4001) 및 탐색 회로(4005)일 수 있다. SIMD 프로세서(4001)와 관련하여, 복수의 셰이더는 표준 프로그래밍 모델을 사용하여 그 결과를 동기화하고 종합할 수 있다. 이를 수행하는 비교적 간단한 방법 중 하나는 전역 원자(global atomics)를 사용하여 메모리의 공유 데이터 구조로 결과를 수집하는 것으로, 여기에는 복수의 셰이더의 교차 결과가 저장될 수 있다. 이후, 마지막 셰이더는 데이터 구조를 분석하고 탐색 회로(4005)를 다시 호출하여 탐색을 계속할 수 있다.
복수 셰이더 호출의 실행을 SIMD 프로세서(4001) 상의 동일한 SIMD 스레드의 레인으로 한정하는 보다 효율적인 접근법이 또한 구현될 수 있다. 이후, 교차 테스트는(전역 원자에 의존하지 않고) SIMD/SIMT 감소 동작을 사용하여 국부적으로 감소된다. 이 구현예는 셰이더 호출의 소량의 배치(batch)가 동일한 SIMD 배치에 유지되도록 하는 정렬 유닛(4008) 내의 새로운 회로에 의존할 수 있다.
또한, 탐색 스레드의 실행은 탐색 회로(4005) 상에서 중단될 수 있다. 종래의 실행 모델을 사용하면, 탐색 동안 셰이더가 디스패치될 때, 탐색 스레드는 종료되고 광선 탐색 상태는 메모리에 저장되어 실행 유닛(4001)이 셰이더를 프로세싱하는 동안 다른 광선 생성 커맨드의 실행을 허용한다. 탐색 스레드가 단순히 중단되면, 탐색 상태를 저장할 필요가 없으며 각 셰이더 결과를 개별적으로 기다릴 수 있다. 이 구현예는 교착 상태를 회피하고 충분한 하드웨어 이용을 제공하는 회로를 포함할 수 있다.
도 47 및 도 48은 3개의 셰이더(4701)를 갖는 SIMD 코어/실행 유닛(4001) 상에서 단일 셰이더 호출을 호출하는 지연된 모델의 실시예를 도시한다. 보존되면, 모든 교차 테스트는 동일한 SIMD/SIMT 그룹 내에서 평가된다. 결과적으로, 최근접 교차는 또한 프로그램 가능한 코어/실행 유닛(4001)에서 계산될 수 있다.
전술한 것과 같이, 셰이더 수집 및/또는 지연의 전부 또는 일부는 탐색/교차 회로(4005) 및/또는 코어/EU 스케줄러(4007)에 의해 수행될 수 있다. 도 47은 스케줄러(4007) 내의 셰이더 지연/종합 회로(4706)가 특정 트리거링 이벤트가 발생할 때까지 특정 SIMD/SIMT 스레드/레인과 관련된 셰이더의 스케줄링을 어떻게 지연시킬 수 있지를 도시한다. 트리거링 이벤트를 검출하면, 스케줄러(4007)는 단일 SIMD/SIMT 배치의 복수의 수집된 셰이더를 코어/EU(4001)에 디스패치한다.
도 48은 탐색/교차 회로(4005) 내의 셰이더 지연/종합 회로(4805)가 특정 트리거링 이벤트가 발생할 때까지 특정 SIMD 스레드/레인과 관련된 셰이더의 스케줄링을 어떻게 지연시킬 수 있는지를 도시한다. 트리거링 이벤트를 검출하면, 탐색/교차 회로(4005)는 수집된 셰이더를 정렬 유닛(4008)에 단일 SIMD/SIMT 배치로 제출한다.
그러나, 셰이더 지연 및 수집 기술은 정렬 유닛(4008)과 같은 다양한 다른 컴포넌트 내에서 구현될 수 있거나 또는 복수의 컴포넌트에 걸쳐 분산될 수 있다는 점에 유의한다. 예를 들어, SIMD 스레드에 대한 셰이더가 코어/EU(4001)상에서 효율적으로 스케줄링되는 것을 보장하기 위해, 탐색/교차 회로(4005)는 셰이더 수집 동작의 제 1 세트를 수행할 수 있고, 스케줄러(4007)는 셰이더 수집 동작의 제 2 세트를 수행할 수 있다.
수집된 셰이더가 코어/EU로 디스패치되도록 하는 "트리거링 이벤트"는 특정 개수의 축적된 셰이더 또는 특정 스레드와 관련된 최소 대기 시간과 같은 프로세싱 이벤트일 수 있다. 이와 달리 또는 추가적으로, 트리거링 이벤트는 제 1 셰이더의 지연으로부터의 특정 지속 시간 또는 특정 수의 프로세서 주기와 같은 시간적 이벤트일 수 있다. 코어/EU(4001) 및 탐색/교차 유닛(4005) 상의 현재 워크로드와 같은 다른 변수는 또한 셰이더의 SIMD/SIMT 배치를 언제 디스패치할 것인지를 결정하기 위해 스케줄러(4007)에 의해 평가될 수 있다.
본 발명의 상이한 실시예는 사용되는 특정 시스템 아키텍처 및 애플리케이션의 요구 사항에 따라 상기 접근법의 상이한 조합을 사용하여 구현될 수 있다.
광선 추적 명령어
후술되는 광선 추적 명령어는 CPU(3199) 및/또는 GPU(3105)에 의해 지원되는 명령어 세트 아키텍처(ISA)에 포함된다. CPU에 의해 실행되는 경우, 단일 명령어 복수 데이터(SIMD) 명령어는 벡터/패킹된 소스 및 목적지 레지스터를 이용하여 전술한 동작을 수행하고, CPU 코어에 의해 디코딩 및 실행될 수 있다. GPU(3105)에 의해 실행되는 경우, 명령어는 그래픽 코어(3130)에 의해 실행될 수 있다. 예를 들어, 전술한 임의의 실행 유닛(EU)(4001)은 명령어를 실행할 수 있다. 이와 달리 또는 추가적으로, 명령어는 광선 추적 코어(3150) 및/또는 텐서 코어(3140) 상의 실행 회로에 의해 실행될 수 있다.
도 49는 후술되는 광선 추적 명령어를 실행하기 위한 아키텍처의 일 실시예를 도시한다. 도시된 아키텍처는 전술한 하나 이상의 코어(3130, 3140, 3150) 내에 통합될 수 있고(예를 들어, 도 31 및 관련 텍스트 참조) 또는 다른 프로세서 아키텍처에 포함될 수 있다.
동작 중에, 명령어 페치 유닛(4903)은 메모리(3198)로부터 광선 추적 명령어(4900)를 페치하고 디코더(4904)는 명령어를 디코딩한다. 일 구현예에서, 디코더(4904)는 명령어를 디코딩하여 실행 가능한 동작(예를 들어, 마이크로 코딩된 코어에서의 마이크로 동작 또는 uops)을 생성한다. 이와 달리, 광선 추적 명령어(4900)의 일부 또는 전부는 디코딩없이 실행될 수 있으며, 이 경우 디코더(4904)는 필요하지 않다.
구현예에서, 스케줄러/디스패처(4905)는 기능 유닛(FU) 세트(4910-4912)에 걸쳐 명령어(또는 동작)를 스케줄링하고 디스패치한다. 도시된 구현예는, 벡터 레지스터(4915)에 저장된 복수의 패킹된 데이터 요소에 대해 동시에 동작하는 단일 명령어 복수 데이터(SIMD) 명령어를 실행하기 위한 벡터 FU(4910), 및 하나 이상의 스칼라 레지스터(4916)에 저장된 스칼라 값에 대해 동작하기 위한 스칼라 FU(4911)를 포함한다. 선택적인 광선 추적 FU(4912)는 벡터 레지스터(4915)에 저장된 패킹된 데이터 값 및/또는 스칼라 레지스터(4916)에 저장된 스칼라 값에 대해 동작할 수 있다. 전용 FU(4912)가 없는 구현예에서, 벡터 FU(4910) 및 가능하면 스칼라 FU(4911)는 아래 설명되는 광선 추적 명령어를 수행한다.
다양한 FU(4910-4912)는 벡터 레지스터(4915), 스칼라 레지스터(4916) 및/또는 로컬 캐시 서브시스템(4908)(예를 들어, L1 캐시)으로부터의 광선 추적 명령어(4900)를 실행하는 데 필요한 광선 추적 데이터(4902)(예를 들어, 탐색/교차 데이터)에 액세스한다. FU(4910-4912)는 또한 로딩 및 저장 동작을 통해 메모리(3198)에 대한 액세스를 수행할 수 있고, 캐시 서브시스템(4908)은 독립적으로 데이터를 국부적으로 캐싱하도록 동작할 수 있다.
광선 추적 명령어는 광선 탐색/교차 및 BVH 구성에 대한 성능을 향상시키는데 사용될 수 있지만, 고성능 컴퓨팅(HPC) 및 범용 GPU(GPGPU) 구현과 같은 다른 영역에도 적용될 수 있다.
이하의 설명에서, 더블 워드라는 용어는 때때로 dw로 약칭되고 부호없는 바이트는 ub로 약칭된다. 또한, 아래에 언급된 소스 및 목적지 레지스터(예를 들어, src0, src1, dest 등)는 벡터 레지스터(4915) 또는 일부 경우에 벡터 레지스터(4915)와 스칼라 레지스터(4916)의 조합을 지칭할 수 있다. 일반적으로, 명령어에 의해 사용된 소스 또는 목적지 값이 패킹된 데이터 요소(예를 들어, 소스 또는 목적지가 N개의 데이터 요소를 저장하는 경우)를 포함하면, 벡터 레지스터(4915)가 사용된다. 다른 값은 스칼라 레지스터(4916) 또는 벡터 레지스터(4915)를 사용할 수 있다.
역양자화
역양자화 명령어의 일 예는 이전에 양자화된 값을 "역양자화"한다. 예를 들어, 광선 추적 구현예에서, 특정 BVH 서브트리는 양자화되어 스토리지 및 대역폭 요구 사항을 감소시킬 수 있다. 역양자화 명령어는 dest, src0, src1 및 src2를 역양자화하는 형태를 취할 수 있는데, 여기서 소스 레지스터(src0)는 N개의 부호없는 바이트를 저장하고, 소스 레지스터(src1)는 1개의 부호없는 바이트를 저장하고, 소스 레지스터(src2)는 1개의 부동 소수점 값을 저장하고, 목적지 레지스터(dest)는 N개의 부동 소수점 값을 저장한다. 이들 레지스터 모두는 벡터 레지스터(4915)일 수 있다. 이와 달리, src0 및 dest는 벡터 레지스터(4915)일 수 있고, src1 및 src2는 스칼라 레지스터(4916)일 수 있다.
다음 코드 시퀀스는 역양자화 명령어의 하나의 특정 구현예를 정의한다:
for(int i = 0; i < SIMD_WIDTH) {
if(execMask[i]) {
dst[i] = src2[i] + ldexp(convert_to_float(src0[i]),src1);
}
}
이 예에서 ldexp는 배정밀도 부동 소수점 값에 지정된 2의 정수 거듭제곱을 곱한다(즉, ldexp(x, exp) = x * 2exp). 위 코드에서 현재 SIMD 데이터 요소(execMask[i])와 관련된 실행 마스크 값이 1로 설정되면, src0의 위치 i에 있는 SIMD 데이터 요소는 부동 소수점 값으로 변환되어 src1의 값의 정수 거듭제곱이 곱해지고(2src1의 값), 이 값은 src2에 있는 대응하는 SIMD 데이터 요소에 더해진다.
선택적 최소 또는 최대
선택적 최소 또는 최대 명령어는 비트마스크(bitmask)에서 비트로 표시된 것과 같이 레인 당 최소 또는 최대 동작을 수행할 수 있다(즉, 값 세트의 최소 또는 최대를 반환함). 비트마스크는 벡터 레지스터(4915), 스칼라 레지스터(4916), 또는 별도의 마스크 레지스터 세트(도시하지 않음)를 이용할 수 있다. 다음 코드 시퀀스는 min/max 명령어의 특정 구현예를 정의한다:
sel_min_max dest src0 src1 src2,
여기서 src0은 N개의 더블워드를 저장하고, src1은 N개의 더블워드를 저장하고, src2는 1개의 더블워드를 저장하고, 목적지 레지스터는 N개의 더블워드를 저장한다.
다음의 코드 시퀀스는 선택적 최소/최대 명령어의 하나의 특정 구현예를 정의한다:
for(int i = 0; i < SIMD_WIDTH) {
if(execMask[i]) {
dst[i] =(1 << i) & src2 ? min(src0[i],src1[i]) : max(src0[i],src1[i]);
}
}
이 예에서,(1 << i) & src2(1이 i 만큼 왼쪽으로 이동되고 src2와 AND 연산됨)의 값은 src0 및 src1에서 i 번째 데이터 요소의 최소값 또는 src0 및 src1에서 i 번째 데이터 요소의 최대 값을 선택하는데 사용된다. 현재 SIMD 데이터 요소(execMask[i])와 관련된 실행 마스크 값이 1로 설정된 경우에만 i 번째 데이터 요소에 대해 동작이 수행된다.
셔플 인덱스 명령어
셔플 인덱스 명령어는 임의의 입력 레인 세트를 출력 레인에 복사할 수 있다. SIMD 너비가 32인 경우, 이 명령어는 처리량이 더 적은 상태에서 실행될 수 있다. 이 명령어는 shuffle_index dest src0 src1 <optional flag>의 형태를 취하는데, 여기서 src0은 N개의 더블워드를 저장하고, src1은 N개의 부호없는 바이트(즉, 인덱스 값)를 저장하고, dest는 N개의 더블워드를 저장한다.
다음 코드 시퀀스는 셔플 인덱스 명령어의 하나의 특정 구현예를 정의한다:
for(int i = 0; i < SIMD_WIDTH) {
uint8_t srcLane = src1.index[i];
if(execMask[i]) {
bool invalidLane = srcLane < 0 || srcLane >= SIMD_WIDTH || !execMask[srcLaneMod];
if(FLAG) {
invalidLane |= flag[srcLaneMod];
}
if(invalidLane) {
dst[i] = src0[i];
}
else {
dst[i] = src0[srcLane];
}
}
}
상기 코드에서, src1의 인덱스는 현재 레인을 식별한다. 실행 마스크의 i 번째 값이 1로 설정되면, 소스 레인이 0 내지 SIMD 너비 사이의 범위 내에 있는지 확인하기 위해 검사가 수행된다. 범위 내에 있지 않으면, 플래그가 설정되고(srcLaneMod) 목적지의 데이터 요소 i가 src0의 데이터 요소 i와 동일하게 설정된다. 레인이 범위 내에 있으면(즉, 유효하면), src1(srcLane0)의 인덱스 값이 src0에 대한 인덱스로 사용된다(dst [i] = src0[srcLane]).
이미디어트 셔플 업/다운/XOR 명령어
이미디어트 셔플 명령어(immediate shuffle instruction)는 명령어의 이미디어트에 기초하여 입력 데이터 요소/레인을 셔플할 수 있다. 일 구현예에서, 이미디어트는 이미디어트 값에 기초하여 입력 레인을 1, 2, 4, 8 또는 16 위치만큼 시프트하도록 지정할 수 있다. 선택적으로, 추가 스칼라 소스 레지스터를 채우기 값(fill value)으로 지정할 수 있다. 소스 레인 인덱스가 유효하지 않은 경우 채우기 값(제공되는 경우에 한하여)은 목적지의 데이터 요소 위치에 저장된다. 채우기 값이 제공되지 않으면 데이터 요소 위치가 모두 0으로 설정된다.
플래그 레지스터는 소스 마스크로서 사용될 수 있다. 소스 레인의 플래그 비트가 1로 설정되면, 소스 레인이 유효하지 않은 것으로 표시될 수 있고 명령어가 진행될 수 있다.
다음은 이미디어트 셔플 명령어의 상이한 구현예이다:
shuffle_<up/dn/xor>_<1/2/4/8/16> dest src0 <optional src1> <optional flag>
shuffle_<up/dn/xor>_<1/2/4/8/16> dest src0 <optional src1> <optional flag>
이 구현예에서, src0은 N개의 더블워드를 저장하고, src1은 채우기 값(존재하는 경우에 한하여)에 대한 1개의 더블워드를 저장하고, dest는 결과를 포함하는 N개의 더블워드를 저장한다.
다음 코드 시퀀스는 이미디어트 셔플 명령어의 특정 구현예를 정의한다.
for(int i = 0; i < SIMD_WIDTH) {
int8_t srcLane;
switch(SHUFFLE_TYPE) {
case UP:
srcLane = i - SHIFT;
case DN:
srcLane = i + SHIFT;
case XOR:
srcLane = i ^ SHIFT;
}
if(execMask[i]) {
bool invalidLane = srcLane < 0 || srcLane >= SIMD_WIDTH || !execMask[srcLane];
if(FLAG) {
invalidLane |= flag[srcLane];
}
if(invalidLane) {
if(SRC1)
dst[i] = src1;
else
dst[i] = 0;
}
else {
dst[i] = src0[srcLane];
}
}
}
여기서, 입력 데이터 요소/레인은 이미디어트 값에 따라 1, 2, 4, 8 또는 16 위치만큼 시프트된다. 레지스터 src1은 소스 레인 인덱스가 유효하지 않을 때 목적지의 데이터 요소 위치에 저장되는 채우기 값으로 사용되는 추가 스칼라 소스 레지스터이다. 채우기 값이 제공되지 않고 소스 레인 인덱스가 유효하지 않은 경우, 목적지의 데이터 요소 위치가 0으로 설정된다. 플래그 레지스터(FLAG)는 소스 마스크로 사용된다. 소스 레인의 플래그 비트가 1로 설정되면, 소스 레인은 유효하지 않은 것으로 표시되고 명령어는 전술한 것과 같이 진행된다.
간접 셔플 업/다운/XOR 명령어
간접 셔플 명령어는 소스 레인로부터 목적지 레인으로의 매핑을 제어하는 소스 피연산자(src1)를 갖는다. 간접 셔플 명령어는 다음과 같은 형태를 취할 수 있다:
shuffle_<up/dn/xor> dest src0 src1 <optional flag>
여기서 src0은 N개의 더블워드를 저장하고 src1은 1개의 더블워드를 저장하고 dest는 N개의 더블워드를 저장한다.
다음의 코드 시퀀스는 간접 셔플 명령어의 하나의 특정 구현예를 정의한다:
for(int i = 0; i < SIMD_WIDTH) {
int8_t srcLane;
switch(SHUFFLE_TYPE) {
case UP:
srcLane = i - src1;
case DN:
srcLane = i + src1;
case XOR:
srcLane = i ^ src1;
}
if(execMask[i]) {
bool invalidLane = srcLane < 0 || srcLane >= SIMD_WIDTH || !execMask[srcLane];
if(FLAG) {
invalidLane |= flag[srcLane];
}
if(invalidLane) {
dst[i] = 0;
}
else {
dst[i] = src0[srcLane];
}
}
}
따라서, 간접 셔플 명령어는 전술한 이미디어트 셔플 명령어와 유사한 방식으로 동작하지만, 소스 레인의 목적지 레인으로의 매핑은 즉시적으로 이루어지기 보다는 소스 레지스터(src1)에 의해 제어된다.
크로스 레인 최소/최대 명령어
크로스 레인 최소/최대 명령어는 부동 및 정수 데이터 타입에 대해 지원될 수 있다. 크로스 레인 최소 명령어는 lane_min dest src0의 형식을 취할 수 있고, 크로스 레인 최대 명령어는 lane_max dest src0의 형식을 취할 수 있는데, 여기서 src0은 N개의 더블워드를 저장하고 dest는 1개의 더블워드를 저장한다.
예를 들어, 다음의 코드 시퀀스는 크로스 레인 최소의 하나의 특정 구현예를 정의한다:
dst = src[0];
for(int i = 1; i < SIMD_WIDTH) {
if(execMask[i]) {
dst = min(dst, src[i]);
}
}
이 예에서, 소스 레지스터의 데이터 요소 위치 i의 더블워드 값이 목적지 레지스터의 데이터 요소와 비교되고, 2개의 값 중 최소가 목적지 레지스터에 카피된다. 크로스 레인 최대 명령어는 실질적으로 동일한 방식으로 동작하며, 유일한 차이점은 위치 i에 있는 데이터 요소와 목적지 값 중 최대가 선택된다는 것이다.
크로스 레인 최소/최대 인덱스 명령어
크로스 레인 최소 인덱스 명령어는 lane_min_index dest src0의 형태를 취할 수 있고, 크로스 레인 최대 인덱스 명령어의 실시예는 lane_max_index dest src0의 형태를 취할 수 있는데, 여기서 src0은 N개의 더블워드를 저장하고 dest는 1개의 더블워드를 저장한다.
예를 들어, 다음의 코드 시퀀스는 크로스 레인 최소 인덱스 명령어의 하나의 특정 구현예를 정의한다:
dst_index = 0;
tmp = src[0]
for(int i = 1; i < SIMD_WIDTH) {
if(src[i] < tmp && execMask[i])
{
tmp = src[i];
dst_index = i;
}
}
이 예에서, 목적지 인덱스는 목적지 레지스터에 걸쳐 0 내지 SIMD 폭으로 증가된다. 실행 마스크 비트가 설정되면, 소스 레지스터의 위치 i에 있는 데이터 요소가 임시 저장 위치(tmp)에 카피되고 목적지 인덱스가 데이터 요소 위치 i에 설정된다.
크로스 레인 정렬 네트워크 명령어
크로스 레인 정렬 네트워크 명령어는 오름차순(sortnet_min) 또는 내림차순(sortnet_max)으로 N-넓은(안정한) 정렬 네트워크를 사용하여 모든 N개의 입력 요소를 정렬할 수 있다. 명령어의 최소/최대 버전은 각각 sortnet_min dest src0 및 sortnet_max dest src0의 형식을 취할 수 있다. 일 구현예에서, src0 및 dest는 N개의 더블워드를 저장한다. 최소/최대 정렬은 src0의 N개의 더블워드에 대해 수행되며 오름차순으로 배열된 요소(최소를 위해) 또는 내림차순 배열된 요소(최대를 위해)는 각각의 정렬된 순서대로 저장된다. 명령어를 정의하는 코드 시퀀스의 하나의 예시는 다음과 같다: dst = apply_N_wide_sorting_network_min/max(src0).
크로스 레인 정렬 네트워크 인덱스 명령어
크로스 레인 정렬 네트워크 인덱스 명령어는 N-넓은(안정한) 정렬 네트워크를 사용하여 모든 N개의 입력 요소를 정렬할 수 있지만, 오름차순(sortnet_min) 또는 내림차순(sortnet_max)으로 변경된 인덱스를 반환한다. 명령어의 최소/최대 버전은 sortnet_min_index dest src0 및 sortnet_max_index dest src0의 형식을 취할 수 있는데, 여기서 src0 및 dest는 각각 N개의 더블워드를 저장한다. 명령어를 정의하는 코드 시퀀스의 한 예는 dst = apply_N_wide_sorting_network_min/max_index(src0)이다.
전술한 명령어 중 임의의 것을 실행하기 위한 방법의 일 실시예가 도 50에 도시되어 있다. 이 방법은 전술한 특정 프로세서 아키텍처 상에서 구현될 수 있지만, 임의의 특정 프로세서 또는 시스템 아키텍처로 한정되는 것은 아니다.
5001에서, 1차 그래픽 스레드의 명령어가 프로세서 코어에서 실행된다. 이것은, 예를 들어 전술한 임의의 코어(예를 들어, 그래픽 코어(3130))를 포함할 수 있다. 5002에서 결정된 1차 그래픽 스레드 내에서 광선 추적 작업이 도달되면, 광선 추적 명령어는 광선 추적 실행 회로로 오프로딩되며, 광선 추적 실행 회로는 도 49와 관련하여 전술한 것과 같은 기능 유닛(FU)의 형태일 수 있거나, 또는 도 31과 관련하여 설명된 것과 같이 전용 광선 추적 코어(3150) 내에 있을 수 있다.
5003에서 디코딩될 광선 추적 명령어가 메모리로부터 페치되고,(예를 들어, 디코더가 필요한 실시예의 경우) 5005에서 명령어는 실행 가능한 동작으로 디코딩된다. 5004에서, 광선 추적 명령어는 광선 추적 회로에 의해 실행되도록 스케줄링되고 디스패치된다. 5005에서, 광선 추적 명령어는 광선 추적 회로에 의해 실행된다. 예를 들어, 명령어는 전술한 FU(예를 들어, 벡터 FU(4910), 광선 추적 FU(4912) 등) 및/또는 그래픽 코어(3130) 또는 광선 추적 코어(3150)에 디스패치 및 실행될 수 있다.
광선 추적 명령어에 대한 실행이 완료되면, 5006에서 그 결과가 저장되고(예를 들어, 메모리(3198)로 다시 저장됨), 5007에서 1차 그래픽 스레드가 통지된다. 5008에서, 광선 추적 결과는 1차 스레드의 컨텍스트 내에서 프로세싱된다(예를 들어, 메모리로부터 판독되고 그래픽 렌더링 결과에 통합됨).
실시예에서, "엔진" 또는 "모듈" 또는 "로직"이라는 용어는 주문형 집적 회로(ASIC), 전자 회로, 프로세서(공유, 전용 또는 그룹), 및/또는 하나 이상의 소프트웨어 또는 펌웨어 프로그램, 조합 논리 회로 및/또는 설명된 기능을 제공하는 다른 적합한 컴포넌트를 실행하는 메모리(공유, 전용 또는 그룹)를 지칭하거나, 그 일부이거나 또는 그를 포함할 수 있다. 실시예에서, 엔진, 모듈 또는 로직은 펌웨어, 하드웨어, 소프트웨어, 또는 펌웨어, 하드웨어 및 소프트웨어의 임의의 조합으로 구현될 수 있다.
광선 추적 파이프라인을 조절하기 위한 장치 및 방법
본 발명의 실시예는 광선 추적을 수행하기 위해 고정 기능 가속 회로 및 범용 프로세싱 회로의 조합을 포함한다. 예를 들어, 경계 볼륨 계층 구조(BVH)의 광선 탐색 및 교차 테스트와 관련된 특정 동작은 고정 기능 가속 회로에 의해 수행될 수 있고, 복수의 실행 회로는 다양한 형태의 광선 추적 셰이더(예를 들어, 임의의 히트 셰이더, 교차 셰이더, 비교차 셰이더 등)를 실행한다. 일 실시예는 광선을 저장하기 위한 복수의 엔트리 및 BVH 노드를 저장하기 위한 대응하는 이중 스택을 포함하는 이중 고대역폭 저장 뱅크를 포함한다. 이 실시예에서, 탐색 회로는 이중 광선 뱅크와 스택 사이를 번갈아가며 각 클록 주기에서 광선을 프로세싱한다. 또한, 일 실시예는, 내부 노드, 비-내부 노드, 및 프리미티브를 구별하고 이 정보를 사용하여 BVH 노드 및 BVH 노드에 의해 경계가 지정된 프리미티브의 프로세싱을 지능적으로 우선 순위화하는 우선 순위 선택 회로/로직을 포함한다.
하나의 특정 실시예는 탐색 동작 동안 한정된 수의 BVH 노드를 저장하는 짧은 스택을 사용하여 탐색에 필요한 고속 메모리를 감소시킨다. 이 실시예는 필요한 BVH 노드가 이용 가능함을 보장하기 위해 짧은 스택으로 및 짧은 스택으로부터 엔트리를 효율적으로 푸시 및 팝하는 스택 관리 회로/로직을 포함한다. 또한, 트래킹 데이터 구조에 대한 업데이트를 수행함으로써 탐색 동작이 트래킹된다. 탐색 회로/로직은 일시 중지될 때, 트래킹 데이터 구조를 참고하여 중단된 BVH 내의 동일한 위치에서 탐색 작업을 시작할 수 있고, 데이터 구조 트래킹에서 유지된 트래킹 데이터는 탐색 회로/로직이 재시작할 수 있도록 수행된다.
도 51은, 셰이더 프로그램 코드를 실행하고 관련된 광선 추적 데이터(4902)(예를 들어, BVH 노드 데이터 및 광선 데이터)를 프로세싱하기 위한 셰이더 실행 회로(4000), 탐색 및 교차 동작을 수행하기 위한 광선 추적 가속 회로(5110), 및 RT 가속 회로(5110) 및 셰이더 실행 회로(4000)에 의해 프로세싱된 프로그램 코드 및 관련 데이터를 저장하기 위한 메모리(3198)를 포함하는 일 실시예를 도시한다.
일 실시예에서, 셰이더 실행 회로(4000)는, 셰이더 프로그램 코드를 실행하여 다양한 형태의 데이터 병렬 동작을 수행하는 복수의 코어/실행 유닛(4001)을 포함한다. 예를 들어, 일 실시예에서, 코어/실행 유닛(4001)은 다수의 레인에 걸쳐 단일 명령어를 실행할 수 있는데, 여기서 명령어의 각 인스턴스는 상이한 레인에 저장된 데이터에 대해 작동한다. 예를 들어 SIMT 구현에서, 명령어의 각 인스턴스는 상이한 스레드와 연관된다. 실행 중에, L1 캐시는 효율적인 액세스를 위해 특정 광선 추적 데이터(예를 들어, 최근에 또는 자주 액세스된 데이터)를 저장한다.
코어/EU(4001)에 의해 실행되는 셰이더에 대한 작업을 스케줄링하는 스케줄러(4007)로 1차 광선 세트가 발송될 수 있다. 코어/EU(4001)는 광선 추적 코어(3150), 그래픽 코어(3130), CPU 코어(3199), 또는 셰이더 프로그램 코드를 실행할 수 있는 다른 타입의 회로일 수 있다. 하나 이상의 1차 광선 셰이더(5101)는 1차 광선을 프로세싱하고, 광선 추적 가속 회로(5110) 및/또는 코어/EU(4001)에 의해 수행될 추가 작업을 생성한다(예를 들어, 하나 이상의 자식 셰이더에 의해 실행 됨). 1차 광선 셰이더(5101) 또는 코어/EU(4001)에 의해 실행된 다른 셰이더에 의해 생성된 새로운 작업은 본 명세서에 설명된 바와 같이 광선을 그룹 또는 빈으로 정렬하는(예를 들어, 유사한 특성을 가진 광선을 그룹화함) 정렬 회로(4008)에 분배될 수 있다. 이후 스케줄러(4007)는 코어/EU(4001)에 대한 새로운 작업을 스케줄링한다.
실행될 수 있는 다른 셰이더는 전술한 바와 같이 히트 결과를 프로세싱하는(예를 들어, 주어진 광선에 대한 임의의 히트 또는 최근접 히트를 각각 식별함) 임의의 히트 셰이더(4514) 및 최근접 히트 셰이더(4507)를 포함한다. 비교차 셰이더(4506)는 광선 비교차(예를 들어, 광선이 노드/프리미티브와 교차하지 않는 경우)를 프로세싱한다. 언급한 바와 같이, 다양한 셰이더는 하나 이상의 포인터, 벤더-지정 메타데이터 및 전역 인수를 포함할 수 있는 셰이더 레코드를 사용하여 참조될 수 있다. 일 실시예에서, 셰이더 레코드는 셰이더 레코드 식별자(SRI)에 의해 식별된다. 일 실시예에서, 셰이더의 각 실행 인스턴스는 부모 셰이더와 자식 셰이더 사이에 전달된 인수를 저장하는 호출 스택(5203)과 연관된다. 호출 스택(5121)은 또한 호출이 반환될 때 실행되는 연속 함수에 대한 참조를 저장할 수 있다.
광선 탐색 회로(5102)는 BVH의 계층 구조 아래로 작동하면서 BVH의 노드들을 통해(예를 들어, 부모 노드, 자식 노드 및 리프 노드를 통해) 각 광선을 탐색하여 광선에 의해 탐색되는 노드/프리미티브를 식별한다. 광선-BVH 교차 회로(5103)는 광선의 교차 테스트를 수행하고, 프리미티브 상의 히트 포인트를 결정하고, 히트에 응답하여 결과를 생성한다. 탐색 회로(5102) 및 교차 회로(5103)는 하나 이상의 호출 스택(5121)으로부터 작업을 검색할 수 있다. 광선 추적 가속 회로(5110) 내에서, 호출 스택(5121) 및 관련 광선 추적 데이터(4902)는 탐색 회로(5102) 및 교차 회로(5103)에 의한 효율적인 액세스를 위해 로컬 광선 추적 캐시(ray tracing cache: RTC)(5107) 또는 다른 로컬 저장 장치 내에 저장될 수 있다. 아래에서 설명되는 하나의 특정 실시예는 고-대역폭 광선 뱅크를 포함한다(예를 들어, 도 52 참조).
광선 추적 가속 회로(5110)는, 광선-BVH 탐색/교차 회로(4005), 탐색 회로(4502) 및 교차 회로(4503), 및 광선 추적 코어(3150)를 포함하는 본 명세서에 설명된 다양한 탐색/교차 회로의 변형일 수 있다. 광선 추적 가속 회로(5110)는 광선-BVH 탐색/교차 회로(4005), 탐색 회로(4502) 및 교차 회로(4503), 및 광선 추적 코어(3150) 또는 BVH 스택을 프로세싱하고/하거나 탐색/교차를 수행하기 위한 임의의 다른 회로/로직 대신에 사용될 수 있다. 따라서, 본 명세서에 설명된 광선-BVH 탐색/교차 회로(4005), 탐색 회로(4502) 및 교차 회로(4503), 및 광선 추적 코어(3150)와 결합된 임의의 특징의 개시는 또한 광선 추적 가속 회로(5110)와의 대응하는 결합을 개시하지만, 이에 한정되지는 않는다.
도 52를 참조하면, 광선 탐색 회로(5102)의 일 실시예는 제 1 및 제 2 광선 저장 뱅크(5201 및 5202)를 각각 포함하는데, 각 뱅크는 메모리로부터 로딩된 대응하는 복수의 입사 광선(5206)을 저장하기 위한 복수의 엔트리를 포함한다. 대응하는 제 1 및 제 2 스택(5203 및 5204)은 각각, 메모리로부터 판독되고 프로세싱을 위해 국부적으로 저장된 선택된 BVH 노드 데이터(5290-5291)를 포함한다. 본 명세서에 설명된 바와 같이, 일 실시예에서, 스택(5203-5204)은 BVH 노드 데이터를 저장하기 위해 한정된 수의 엔트리(예를 들어, 일 실시예에서 6 개의 엔트리)를 포함하는 "짧은" 스택이다. 광선 뱅크(5201-5202)로부터 분리되어 도시되지만, 스택(5203-5204)은 또한 대응하는 광선 뱅크(5201-5202) 내에 유지될 수 있다. 이와 달리, 스택(5203-5204)은 별도의 로컬 메모리 또는 캐시에 저장될 수 있다.
탐색 프로세싱 회로(5210)의 일 실시예는(예를 들어, 핑퐁 방식으로) 프로세싱할 다음 광선 및 노드를 선택할 때 2개의 뱅크(5201-5202)와 스택(5203-5204) 사이를 번갈아 오간다. 예를 들어, 탐색 프로세싱 회로(5210)는 각 클록 주기에서 교번하는 광선 뱅크/스택으로부터 새로운 광선/BVH 노드를 선택할 수 있으며, 이에 의해 매우 효율적인 동작을 보장할 수 있다. 그러나, 본 발명의 기본 원리를 준수하기 위해서는 이 특정 배열이 필요하지 않다는 점에 유의해야 한다.
일 실시예에서, 광선 할당기(5205)는 뱅크 할당 카운터 세트(5220)의 현재 상대 값에 기초하여 각각 제 1 및 제 2 메모리 뱅크(5201-5202)로 들어오는 광선(5206)의 엔트리를 밸런싱한다. 뱅크 할당 카운터(5220)는 제 1 및 제 2 메모리 뱅크(5201-5202)의 각각에서 탐색되지 않은 광선의 수의 카운트를 유지한다. 예를 들어, 제 1 뱅크 할당 카운터는 광선 할당기(5205)가 제 1 뱅크(5201)에 새로운 광선츨 추가할 때 증가될 수 있고, 광선이 제 1 뱅크(5201)로부터 프로세싱될 때 감소될 수 있다. 유사하게, 제 2 뱅크 할당 카운터는 광선 할당기(5205)가 새로운 광선을 제 2 뱅크(5201)에 추가할 때 증가될 수 있고, 광선이 제 2 뱅크(5201)로부터 프로세싱될 때 감소될 수 있다.
일 실시예에서, 광선 할당기(5205)는 더 작은 카운터 값과 관련된 뱅크에 현재 광선을 할당한다. 두 카운터가 동일하면, 광선 할당기(5205)는 어느 한 뱅크를 선택하거나 카운터가 마지막으로 동일했을 때 선택된 것과 다른 뱅크를 선택할 수 있다. 일 실시예에서, 각 광선은 뱅크(5201-5202) 중 하나의 하나의 엔트리에 저장되고, 각 뱅크는 최대 32개의 광선을 저장하기 위한 32개의 엔트리를 포함한다. 그러나, 본 발명의 기본 원리는 이러한 세부 사항에 한정되지 않는다.
셰이더 실행 속도가 탐색 하드웨어의 광선 처리량보다 빠르면, 많은 수의 미처리 광선 메시지 및 관련 광선이 큐잉될 수 있고, 그에 따라 작업 세트의 크기가 증가하고 캐시 히트 레이트(cache hit rates)는 감소한다. 예를 들어, 일부 상황에서, 코어/EU(4001)는 1차 광선 셰이더(5101)를 실행하여 탐색/교차 회로(5102-5103)가 광선을 탐색하고 그 광선을 노드/프리미티브와 교차시킬 수 있는 것보다 더 빠르게 광선(5206)을 생성할 수 있다. 일 실시 예에서, 코어/EU(4001)는 L1 캐시(4003)에 광선을 저장하고 탐색 회로(5102)에 의해 처리될 대응하는 광선 메시지(본원에서 "RayTrace"메시지라고도 함)를 전송한다. 광선 메시지는 광선, 및 탐색 회로가 광선을 판독하고 처리하는 데 사용하는 다른 관련 데이터에 대한 주소 포인터를 포함한다. 광선이 생성되는 시간과 탐색 회로(5102)에 의해 광선 메시지가 처리되는 시간 사이에 큰 지연이 있다면, 그 광선은 L1 캐시(4003)로부터 제거되어, 시스템 메모리(3198) 또는 더 느린 캐시 레벨에 대한 액세스를 필요로 한다.
본 발명의 실시예는 이러한 문제를 해결하기 위해 이하의 기술들 중 하나 이상을 구현한다. 예를 들어, 일 실시예에서, 광선 메시지 큐 또는 스택 내의 광선 메시지의 축적이 모니터링된다. 높은 임계 값에 도달하면(예컨대, 엔트리의 80% -90%가 채워짐), 광선 생성 빈도를 줄이도록 EU(4001)를 조절하기 위한 피드백 메시지/신호가 생성되어한다. 대안으로 또는 추가로, 광선 큐/스택은 후입 선출(LIFO) 큐/스택으로 관리될 수 있으며, 이는 각각의 새로운 광선이 스택의 상단에 추가되고 RT 회로(5110)에 의해 다음으로 처리됨을 의미한다. 이것은 처리될 다음 광선이 L1 캐시에서 발견될 가능성을 증가시킬 것이지만, 광선 프로세싱과 관련된 "공정성"을 감소시킬 것인데, 그 이유는 광선이 오래될수록 그것이 다음에 처리될 가능성은 적기 때문이다. 결과적으로, 특정 광선이 프로세싱을 위해 스택 상단에 도달하기까지 많은 시간이 소요될 수 있다.
도 53은 셰이더 실행 회로(4000)에 의해 생성되고 광선 추적 회로(5110)에 의해 소비되는 광선 메시지의 흐름을 관리하는 본 발명의 일 실시예에 따른 메모리 지원 스택 관리 로직(memory-backed stack management logic)(5380)을 도시한다. 일 실시예에서, 메모리 지원 스택 관리 회로(5380)는 광선 메시지를 메모리 지원 스택(5330)에 저장하거나 광선 메시지를 메모리 서브시스템(5490)으로 유출한다.
동작 중에, 디스패처(5305)는 1차 광선 셰이더(5101)와 같은 작업을 실행 유닛(4001)에 디스패치하고, 이 실행 유닛(4001)은 그에 응답하여 셰이더를 실행하고 1차 광선을 생성한다. 광선은 초기에 EU(4001)의 L1 캐시(4003)(또는 LLC(4020)와 같은 메모리 서브시스템(5490) 또는 시스템 메모리(2511)의 임의의 부분)에 저장된다. 1차 광선에 대응하는 광선 메시지는 중재 정책(예컨대, 라운드 로빈, 우선 순위 기반 등)을 구현하는 중재 로직(5312)으로 전송되며, 이 중재 로직(5312)은 광선 메시지를 광선 압축기(5420)로 전달한다. EU(4001)가 1차 광선 쉐이더를 실행함에 따라, 특정 SIMD 레인(lanes)이 유휴 상태이거나 사용되지 않아, 빈 또는 무효한 슬롯이 생길 수 있다. 광선 압축기(5320)는 파이프 라인 내의 빈/무효한 슬롯을 제거하여, 메시지 슬롯 내에서 가능한 효율적으로 광선 메시지를 압축 및 패킹하고 그 압축된 광선 메시지를 광선 메시지 FIFO(5322)(다른 버퍼 유형이 사용될 수도 있음)를 통해 전송한다. 일 실시예에서, 광선 압축기(5320)는 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 형성한다.
각 압축된 광선 메시지는 스택 제어/피드백 회로(5331) 및/또는 광선 메시지 FIFO 피드백 회로(5321)로부터의 신호에 응답하여 메모리 지원 스택(5330)의 메시지 엔트리에 광선 메시지를 큐잉하거나 또는 메모리 서브시스템(5490)에 그 광선 메시지를 저장하는 스택 중재 로직(5325)를 통해 메모리 지원 스택(5430)으로 전달된다. 언급된 바와 같이, 특정 애플리케이션에 대해, 메모리 지원 스택(5330)은 LIFO(last-in first-out) 큐로서 구현될 수 있다. 이러한 구현에서, 중재 로직(5325)은 RT 회로(5110)에 의한 즉각적인 소비를 위해 광선 메시지를 메모리 지원 스택(5330)의 상단에 배치한다. 이 실시 예에서, 메모리 지원 스택(5330)이 가득 차면, 오래된 광선 추적 메시지는 메모리 서브시스템(5390)에 저장된다.
메모리 지원 카운팅 및 어드레싱 회로(5335)는 메모리 서브시스템(5390)에 저장된 광선 메시지를 추적한다(예를 들어, 메모리 서브시스템(5390)에서 광선 메시지의 수를 계수하고 및/또는 광선 메시지와 연관된 주소를 유지함). 메모리 백엔드 페치 회로(memory backend fetch circuitry)(5340)는 제어 회로(5331)로부터의 요청에 응답하여 저장된 카운트 및 주소를 사용하여 메모리 서브시스템(5390)으로부터 광선 메시지를 페치하고 이를 스택(5330)에 푸시한다.
대안적으로 또는 추가적으로, 디스패처(5405)는 각각의 저장 요소에 저장된 엔트리의 수가 지정된 높은 임계 값에 도달하면, 메모리 지원 스택(5430)의 제어 회로(5331) 및/또는 광선 메시지 FIFO(5322)의 제어 회로(5321)로부터 피드백 신호를 수신할 수 있다. 이에 응답하여, 디스패처(5405)는 (예를 들어, 아래에 설명된 바와 같이 스택의 수를 제한함으로써) 압력을 감소시키기 위해 EU(4001)로의 새로운 작업의 디스패치를 반응적으로 조절할 수 있다. 메모리 지원 스택(5430) 내의 광선 추적 메시지의 수가 낮은 임계 값에 도달하면, 디스패처(5405)는 정상적인 처리량에서(예를 들어, 가능한한 효율적으로) 디스패칭 작업을 재개한다. 메모리 지원 스택(5430)의 일 실시예는 각각이 29개의 광선을 저장할 수 있는 64개의 64-바이트 엔트리를 갖는다.
일 실시예에서, 광선 추적 메시지는 메모리 서브시스템(5490)으로부터 광선 데이터를 읽고 처리하기 위해 RT 회로(5110)에 의해 사용되는 포인터, 스택 ID 및 보충 제어 데이터를 포함한다. EU가 SIMD 회로를 포함하는 구현에서, 광선 추적 메시지는 SIMD 레인 당 하나의 광선을 참조한다.
도 54는 메모리 지원 스택(5330) 내의 엔트리를 포함할 수 있는 로컬 칩 저장소(5404)에 대한 기록의 예를 도시한다. 표시된 바와 같이, 기록은 동기 압축 메시지(5420) 또는 비동기 압축 메시지(5421)를 포함할 수 있다. 본 명세서에서 사용되는 바와 같이, 동기 압축 메시지(5420)는 로컬 칩 저장소(5404)에 기록되고 동기식으로, 즉 이들이 수신됨에 따라 처리되는 메시지이다. 대조적으로, 비동기 압축 메시지(5421)는 순서대로 처리되지 않을 수 있는 메시지이다. 예를 들어, 로컬 칩 저장소(5404) 및/또는 다른 프로세싱 리소스와 같은 엔트리가 이용가능한 경우, 다른 메시지를 먼저 처리하기 위해 일부 광선 메시지는 건너뛰어지고, 메모리 서브시스템(5390)으로 넘겨지고, 그런 다음 메모리 지원 스택(5330)으로 다시 채워질 수 있다. 광선 메시지가 5413에서 비동기식으로 메모리로 유출되면, 그 광선 메시지는 데이터 및 실행 리소스가 이용가능할 때 메모리(2511)로부터 로컬 칩 저장소(5404)로 비동기식으로 채워질 수 있다.
현재 작업 메시지(5405)는 광선 추적 회로에 의해 현재 처리되고 있는 메시지를 포함한다. 일 실시예에서, 현재 작업 메시지를 실행하는 데 필요한 특정 리소스 및 데이터를 사용할 수 없는 경우, 부분적으로 처리된 메시지(5406)가 로컬 칩 저장소(5404)에 다시 기록되고 및/또는 메모리(5313)에 다시 유출될 수 있다. 예를 들어, 초기 메시지 디코딩 및 평가 후에 현재 작업 메시지(5405)에 의해 참조되는 광선은 시스템 메모리(2511)로부터 요청된 것임이 틀림없다고 결정되면, 그 광선 요청은 메모리 서브시스템(5390)으로 전송될 수 있고 (부분적으로 처리된) 광선 메시지(5406)는 다시 로컬 칩 저장소(5404)에 기록될 수 있다. 이어서, 광선이 시스템 메모리(2511)로부터 검색되고 로컬 메모리(예를 들어, 로컬 캐시, 광선 뱅크(5201-5202 등) 내에 저장될 때, 부분적으로 처리된 메시지(5406)는 로컬 칩 저장소(5404)로부터 판독될 수 있고, 처리는 완료될 수 있다.
일 구현은 비동기 처리와 동기 처리의 조합을 사용할 수 있다. 예를 들어, RT 회로(5110)에 의해 광선 메시지가 소비되는 속도와 동일하거나 낮은 속도로 이 광선 메시지가 생성되는 경우, 파이프라인은 동기 방식으로 작동할 수 있다. 그러나, 광선 메시지가 RT 회로(5110)에 의해 처리될 수있는 것보다 더 빠르게 생성되면, 메모리 지원 스택(5330)이 채워지고 메시지가 메모리 서브시스템(5390)으로 유출되어 비동기 동작이 발생한다.
일 실시예에서, 메모리 지원 스택(5330)이 높은 임계 값(예를 들어, 큐잉된 광선 메시지의 지정된 수)에 도달할 때, 제어/피드백 회로(5331)는 디스패처(5305)에 제어/피드백 신호를 전송할 수 있다. 이 구현에서, 디스패치 제어 회로(5333)는 그 신호를 해석하고 디스패처(5305)로 하여금 실행 유닛(4001)에 대한 부하를 줄이게(예를 들어, 새로운 1차 광선 셰이더가 디스패치되는 빈도를 줄이게) 하여, 간접적으로 메모리 지원 스택에 대한 부하를 줄인다. 디스패치 제어 회로(5333)의 일 실시예는 메모리 지원 스택(5330) 또는 EU를 RT 회로(5110)에 결합하는 다른 버퍼/큐의 크기를 샘플링함으로써 높은 임계 값 상황을 검출한다.
하나의 특정 구현에서, 광선 메시지는 도 55의 동작에 따라 조절된다. 예시 된 방법은 본 명세서에 설명된 아키텍처에서 구현될 수 있지만 임의의 특정 프로세서 또는 시스템 아키텍처로 제한되지 않는다.
5501에서, 라이브 스택 임계 값은 특정 구성가능 값인 Nstack(예를 들어, 2K)으로 초기화된다. Nstack 1차 셰이더 스택이 스케줄링된 것으로 5502에서 결정된 경우, 5503에서 (셰이더를 실행하는) EU와 광선 추적 회로 사이에서 광선 메시지를 저장하기 위한 FIFO 버퍼/큐가 샘플링된다(예컨대, 현재 사용된 엔트리의 수를 결정하기 위해). 일 실시예에서, FIFO 버퍼/큐는 광선 메시지 FIFO(5322)를 포함하지만, 본 발명의 기본 원리는 이러한 특정 구현으로 제한되지 않는다.
5504에서, FIFO 버퍼/큐의 현재 상태(예를 들어, 소비된 엔트리의 수)에 기초하여, 스택의 수는 다음에 따라 조정된다:
Nstack = Nstack-α*(FIFO.size - 크기 임계 값)
5504에서, Nstack에 대해 최소 값과 최대 값(각각 MinStacks 및 MaxStacks, 또는 아래 설명되는 이중 서브 슬라이스(dual sub-slice: DSS) 구현의 경우 MinDSSStacks 및 MaxDSSStacks)이 설정된다. 그런 다음 프로세스는 연속 루프에서 5502로 돌아가는데, 즉 FIFO를 샘플링하고 이에 대응하여 라이브 스택의 수를 조정한다. 그 결과, 광선 추적 하드웨어 시간을 따라 잡을 수 있도록 FIFO에서 엔트리의 최대 값이 검출되면 EU의 출력이 조절된다. 낮은 임계 값에 도달함에 따라 광선 추적 하드웨어가 따라 잡힌 것으로 판정되면, 스택의 수는 다시 최대 값으로 설정될 수 있다.
위 동작에서, α의 값은 EU의 부분들을 활성화/비활성화하도록 제어 비트를 설정함으로써 0.25 단위로 0에서 1까지의 값 범위로 구성될 수 있다. 0의 값은 자동 조절을 비활성화한다. 일 실시예에서, FIFO 크기 임계 값은 로컬 레지스터에 저장된 FIFO의 크기의 절반으로 설정된다(예를 들어, 레지스터에 저장된 16개의 스택 엔트리에 대해 8). MinStacks 및 MaxStacks의 값은 제어 비트를 사용하여 구성될 수도 있다.
언급한 바와 같이, 광선 메시지를 처리할 때 순수 후입 선출(LIFO) 스케줄링 방식이 사용되는 경우 전술한 스택 조절은 필요하지 않다. 이 실시예는 EU 메시지 FIFO(5322) 대신에 동작하는 EU 메시지 LIFO 스택을 사용한다. 그러나, 이 방식은 복수의 디스패치 명령이 스택에 있는 경우에는 순방향 진행(forward progress)을 보장하지 않는다. 결과적으로, 그것은 특정 애플리케이션에는 가장 적합한 구성이 아닐 수 있다.
본 발명의 일 실시예는 애플리케이션 요구사항에 기초하여 구성가능하다. 애플리케이션이 광선 처리 스케줄링에서 공정성을 요구하는 경우, FIFO 내의 광선의 수가 지정된 낮은 임계 값에 도달할 때까지 광선 디스패치 빈도를 줄이도록 스택 조절이 선택될 수 있다. 이와 달리, 공정성이 필요하지 않은 경우, LIFO 메시지 처리가 사용될 수 있다.
동적 스택 조절에 더하여, 본 발명의 일 실시예는 정적 스택 조절을 위한 기술을 구현한다. 도 56은 실행 유닛(4001)의 실행 리소스가 이중 "서브 슬라이스"(5501-5502)에 걸쳐 분산된 광선을 생성하는 일 실시예에 대한 추가 세부사항을 예시한다. 일 실시예에서, 서브 슬라이스는 EU 실행 리소스의 특정 부분을 포함한다. 중재자(5612)는 자신의 중재 정책을 적용하여 제1 서브 슬라이스(5501) 또는 제2 서브 슬라이스(5502)에서 다음 광선을 선택한다. 슬롯 프로세서는 지정된 슬롯에서 광선 압축기에 광선을 제출하여, 서브 슬라이스(5501-5502)에 의해 제공되는 광선 데이터로부터 유효하지 않은 광선 참조를 제거함으로써 캐시 라인에 맞는 고정된 크기의 광선 데이터 청크를 형성한다. 일 실시예에서, 각 서브 슬라이스(5501-5502)는 최대 2K 스택으로 제한되지만, 본 발명의 기본 원리는 이 구현으로 제한되지 않는다.
본 발명의 일 실시예에서, 컴파일러(5690)는 EU(4001)에서 실행될 단일 명령 다중 스레드(SIMT) 프로그램 코드 또는 단일 명령 다중 데이터(SIMD) 프로그램 코드와 같은 데이터 병렬 프로그램 코드(5691)를 생성한다. 예를 들어, 일 실시예에서, 각 EU(4001)는 기능 유닛(FU)의 그룹에서 병렬로 동일한 명령어의 상이한 인스턴스를 실행하되, 명령어의 각 인스턴스는 입력 광선 데이터의 서로 다른 부분(벡터 레지스터 내로 패키징될 수 있음)에 대해 동작한다.
일 실시예에서, 컴파일러(5690)는 스레드를, 하나의 EU, EU의 일부 또는 EU 세트에 의해 실행될 스레드 그룹으로 구성한다. 예를 들어, 각 서브 슬라이스(5501-5502)는 EU, 다중 EU 또는 개별 EU의 지정된 부분을 나타낼 수 있다. 스레드 그룹은 EU의 병렬 처리 능력(예를 들어, 명령어를 병렬로 실행할 수 있는 기능 유닛의 수) 및 EU 실행 리소스가 서브 슬라이스로 세분화되는 방식을 기반으로 컴파일러(5690)에 의해 선택될 수 있다. 컴파일러(5690)는 광선을 생성하는 것, 가장 근접한 광선 히트를 처리하는 것, 광선 빗나감을 처리하는 것 등과 같은 지정된 기능을 수행하기 위한 스레드 그룹 세트를 포함하는 커널을 생성할 수 있다. 예를 들어, 본 명세서에 설명된 셰이더는 각각 특정 커널의 인스턴스일 수 있다.
일 구현에서, 각각의 개별 EU에는 그의 기능 유닛(FU)에만 액세스가능한 로컬 데이터 저장소가 할당된다. EU가 데이터를 교환할 수 있도록 EU 전체 또는 일부(예컨대, 서브 슬라이스)에 액세스가능한 전역 데이터 저장소도 제공될 수 있다. 전역 데이터 저장소 및/또는 로컬 데이터 저장소는 전용 온칩 메모리에서 및/또는 시스템 메모리의 지정된 메모리 영역을 통해 구현될 수 있다. 일 구현에서, BVH 노드 스택 및 광선 스택을 포함하는 본 명세서에 설명된 다양한 스택이 전역 메모리 저장소 및/또는 로컬 메모리 저장소에 저장된다.
언급된 바와 같이, 각 서브 슬라이스(5501-5502)에는 최대 N개의 스택(예를 들어, 2K)이 동적으로 할당될 수 있다. 일 실시예에서, 컴파일러(5690)는 실행을 위해 커널을 제출하기 전에 메모리 매핑된 IO(MMIO) 레지스터에 지정된 값을 프로그래밍함으로써 스택 저장을 이 최대 값 미만으로 제한할 수 있다. 컴파일러(5690)는 (하드웨어 중단을 방지하기 위해) 스레드 그룹의 모든 스레드에 대한 스택 크기를 기반으로 프로그래밍된 최대 값이 선택되도록 보장하기 위해 코드를 평가한다. 예를 들어, SIMD16 스레드와 16개의 스레드로 구성된 스레드 그룹(예컨대, NUM_THREADS_IN_THREADGROUP = 16)을 가정하면, 컴파일러(5690)는 스택 값을 최소 16 x 16 = 256 스택으로 설정할 수 있다.
그것은 정적으로 프로그래밍된 값이기 때문에, 일 실시예에서, 전체 이중 서브 슬라이스(DSS) 파이프라인은 값을 변경하기 전에 유휴 상태가 되는데, 즉, 실행중인 스레드가 없고 DSS 내의 모든 데이터는 전역 메모리로 푸시된다. 일 실시예에서, 컴파일러(5690)는 값을 변경하기 전에 파이프 제어 플러시를 수행함으로써 이를 달성한다.
예들
다음은 본 발명의 상이한 실시예들의 예시적 구현들이다:
예 1. 장치로서, 복수의 광선 셰이더를 실행하고 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 복수의 기능 유닛을 포함하는 실행 회로와, 이 실행 회로에 의해 생성된 광선 메시지를 큐잉하는 선입 선출(First In First Out: FIFO) 버퍼와, 복수의 1차 광선 중 하나 이상을 저장하는 캐시와, 대응하는 복수의 엔트리에 복수의 광선 메시지의 제1 서브세트를 저장하는 메모리 지원 스택과, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 복수의 광선 메시지의 제2 서브세트를 메모리 지원 스택에 저장하거나, 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 메모리 지원 스택 관리 회로와, 메모리 지원 스택으로부터 다음 광선 메시지를 판독하고, 캐시 또는 메모리 서브시스템으로부터 그 광선 메시지에 의해 식별된 다음 1차 광선을 검색하고, 이 다음 1차 광선에 대한 탐색 동작을 수행하는 광선 탐색 회로를 포함한다.
예 2. 예 1의 장치는, 메모리 지원 스택 및/또는 메모리 서브시스템에 저장하기 전에 복수의 광선 메시지 각각을 일시적으로 큐잉하기 위한 광선 메시지 선입 선출(FIFO) 버퍼를 더 포함한다.
예 3. 예 2의 장치는, 복수의 광선 셰이더를 실행 회로로 디스패칭하는 디스패처를 더 포함하고, 이 디스패처는 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 복수의 광선 셰이더의 디스패칭을 조절하는 조절 회로를 포함한다.
예 4. 예 2의 장치에서, 조절 회로는 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 하나 이상의 스택 임계 값을 조정한다.
예 5. 예 4의 장치에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함한다.
예 6. 예 5의 장치에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함한다.
예 7. 예 6의 장치에서, 디스패처는 최소 스택 값 및/또는 최대 스택 값에 기초하여 실행 회로에 복수의 광선 셰이더를 디스패칭한다.
예 8. 예 7의 장치에서, 실행 회로는 2개 이상의 서브 슬라이스로 세분화되고, 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 제1 최소 스택 값 및/또는 최대 스택 값과 연관되고, 기능 유닛의 제2 서브세트를 포함하는 제2 서브-슬라이스는 제2 최소 스택 값 및/또는 최대 스택 값과 연관된다.
예 9. 예 1의 장치는 실행 회로와 메모리 지원 스택 사이에 결합된 압축기를 더 포함하고, 이 압축기는 단일 명령 다중 데이터(SIMD) 레인과 연관된 비어있는 및/또는 무효한 슬롯을 제거한다.
예 10. 예 9의 장치에서, 압축기는 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성한다.
예 11. 예 1의 장치에서, 메모리 지원 스택 관리 회로는 메모리 지원 스택으로 푸시될 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템으로부터 페칭하기 위한 메모리 백엔드 페치 회로를 더 포함한다.
예 12. 방법으로서, 복수의 광선 셰이더에 의해 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 단계와, 선입 선출(FIFO) 버퍼에 광선 메시지를 큐잉하는 단계와, 복수의 1차 광선 중 하나 이상을 캐시에 저장하는 단계와, 복수의 광선 메시지의 제1 서브세트를 메모리 지원 스택의 대응하는 복수의 엔트리에 저장하는 단계와, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 복수의 광선 메시지의 제2 서브세트를 메모리 지원 스택에 저장하거나, 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 단계와, 메모리 지원 스택으로부터 다음 광선 메시지를 판독하는 단계와, 캐시 또는 메모리 서브시스템으로부터 그 광선 메시지에 의해 식별된 다음 1차 광선을 검색하는 단계와, 이 다음 1차 광선에 대한 탐색 동작을 수행하는 단계를 포함한다.
예 13. 예 12의 방법은, 메모리 지원 스택 및/또는 메모리 서브시스템에 저장하기 전에 복수의 광선 메시지 각각을 광선 메시지 선입 선출(FIFO) 버퍼에 일시적으로 큐잉하는 단계를 더 포함한다.
예 14. 예 13의 방법은, 복수의 광선 셰이더를 실행 회로로 디스패칭하는 단계와, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 복수의 광선 셰이더의 디스패칭을 조절하는 단계를 더 포함한다.
예 15. 예 13의 방법에서, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 하나 이상의 스택 임계 값이 조정된다.
예 16. 예 15의 방법에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함한다.
예 17. 예 16의 방법에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함한다.
예 18. 예 17의 방법은 최소 스택 값 및/또는 최대 스택 값에 기초하여 실행 회로에 복수의 광선 셰이더를 디스패칭하는 단계를 더 포함한다.
예 19. 예 18의 방법은 실행 회로를 2개 이상의 서브 슬라이스로 세분화하는 단계를 더 포함하고, 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 제1 최소 스택 값 및/또는 최대 스택 값과 연관되고, 기능 유닛의 제2 서브세트를 포함하는 제2 서브 슬라이스는 제2 최소 스택 값 및/또는 최대 스택 값과 연관된다.
예 20. 예 12의 방법은 단일 명령 다중 데이터(SIMD) 레인과 연관된 비어있는 및/또는 무효한 슬롯을 제거하는 단계를 더 포함한다.
예 21. 예 20의 방법은 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성하는 단계를 더 포함한다.
예 22. 예 12의 방법은 메모리 지원 스택으로 푸시될 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템으로부터 페칭하는 단계를 더 포함한다.
예 23. 프로그램 코드를 저장한 머신 판독가능 매체로서, 프로그램 코드는 머신에 의해 실행되는 경우 머신으로 하여금을 동작들을 수행하게 하되, 이 동작들은 복수의 광선 셰이더에 의해 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 동작과, 선입 선출(FIFO) 버퍼에 광선 메시지를 큐잉하는 동작과, 복수의 1차 광선 중 하나 이상을 캐시에 저장하는 동작과, 복수의 광선 메시지의 제1 서브세트를 메모리 지원 스택의 대응하는 복수의 엔트리에 저장하는 동작과, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 복수의 광선 메시지의 제2 서브세트를 메모리 지원 스택에 저장하거나, 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 동작과, 메모리 지원 스택으로부터 다음 광선 메시지를 판독하는 동작과, 캐시 또는 메모리 서브시스템으로부터 그 광선 메시지에 의해 식별된 다음 1차 광선을 검색하는 동작과, 이 다음 1차 광선에 대한 탐색 동작을 수행하는 동작을 포함한다.
예 24. 예 23의 머신 판독가능 매체는, 메모리 지원 스택 및/또는 메모리 서브시스템에 저장하기 전에 복수의 광선 메시지 각각을 광선 메시지 선입 선출(FIFO) 버퍼에 일시적으로 큐잉하는 동작을 더 포함한다.
예 25. 예 24의 머신 판독가능 매체는, 복수의 광선 셰이더를 실행 회로로 디스패칭하는 동작과, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 복수의 광선 셰이더의 디스패칭을 조절하는 동작을 더 포함한다.
예 26. 예 24의 머신 판독가능 매체에서, 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여 하나 이상의 스택 임계 값이 조정된다.
예 27. 예 26의 머신 판독가능 매체에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함한다.
예 28. 예 27의 머신 판독가능 매체에서, 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함한다.
예 29. 예 28의 머신 판독가능 매체는 최소 스택 값 및/또는 최대 스택 값에 기초하여 실행 회로에 복수의 광선 셰이더를 디스패칭하는 동작을 더 포함한다.
예 30. 예 29의 머신 판독가능 매체는 실행 회로를 2개 이상의 서브 슬라이스로 세분화하는 동작을 더 포함하고, 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 제1 최소 스택 값 및/또는 최대 스택 값과 연관되고, 기능 유닛의 제2 서브세트를 포함하는 제2 서브 슬라이스는 제2 최소 스택 값 및/또는 최대 스택 값과 연관된다.
예 31. 예 23의 머신 판독가능 매체는 단일 명령 다중 데이터(SIMD) 레인과 연관된 비어있는 및/또는 무효한 슬롯을 제거하는 동작을 더 포함한다.
예 32. 예 31의 머신 판독가능 매체는 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성하는 동작을 더 포함한다.
예 33. 예 23의 머신 판독가능 매체는 메모리 지원 스택으로 푸시될 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템으로부터 페칭하는 동작을 더 포함한다.
본 발명의 실시예는 전술한 다양한 단계를 포함할 수 있다. 이 단계는 범용 또는 특수 목적 프로세서로 하여금 이 단계를 수행하도록 하는데 사용될 수 있는 머신 실행 가능 명령어로 구현될 수 있다. 이와 달리, 이 단계는 이 단계를 수행하기 위한 하드와이어 로직을 포함하는 특정 하드웨어 컴포넌트에 의해, 또는 프로그램된 컴퓨터 컴포넌트 및 커스텀 하드웨어 컴포넌트의 임의의 조합에 의해 수행될 수 있다.
여기에 전술한 것과 같이, 명령어는 특정 동작을 수행하도록 구성되거나 또는 비일시적 컴퓨터 판독 가능 매체에 구현된 메모리에 저장된 미리 결정된 기능 또는 소프트웨어 명령어를 갖도록 구성된 ASIC와 같은 하드웨어의 특정 구성을 지칭할 수 있다. 따라서, 도면에 도시된 기술은 하나 이상의 전자 장치(예를 들어, 엔드 스테이션, 네트워크 요소 등)에 저장되고 실행되는 코드 및 데이터를 사용하여 구현될 수 있다. 이러한 전자 장치는 비일시적 컴퓨터 머신 판독 가능 저장 매체(예를 들어, 자기 디스크; 광 디스크; 랜덤 액세스 메모리; 판독 전용 메모리; 플래시 메모리 장치; 위상 변화 메모리) 및 일시적 컴퓨터 머신 판독 가능 통신 매체(예를 들어, 전기, 광학, 음향 또는 예를 들어, 반송파, 적외선 신호, 디지털 신호 등과 같은 다른 형태의 전파 신호)와 같은 컴퓨터 머신 판독 가능 매체를 사용하여 코드 및 데이터를 저장 및(네트워크를 통해 내부적으로 및/또는 다른 전자 장치와) 통신한다.
또한, 이러한 전자 장치는 전형적으로 하나 이상의 저장 장치(비일시적 머신 판독 가능 저장 매체)와 같은 하나 이상의 다른 컴포넌트에 연결된 하나 이상의 프로세서 세트, 사용자 입력/출력 장치(예를 들어, 키보드, 터치 스크린 및/또는 디스플레이) 및 네트워크 접속부를 포함한다. 프로세서 세트와 다른 컴포넌트의 연결은 일반적으로 하나 이상의 버스와 브리지(버스 제어기라고도 함)를 통해 이루어진다. 네트워크 트래픽을 운반하는 저장 장치 및 신호는 각각 하나 이상의 머신 판독 가능 저장 매체 및 머신 판독 가능 통신 매체를 나타낸다. 따라서, 주어진 전자 장치의 저장 장치는 전형적으로 그 전자 장치의 하나 이상의 프로세서 세트에서 실행하기 위한 코드 및/또는 데이터를 저장한다. 물론, 본 발명의 실시예의 하나 이상의 부분은 소프트웨어, 펌웨어 및/또는 하드웨어의 상이한 조합을 사용하여 구현될 수 있다. 이 상세한 설명을 통해, 설명의 목적으로, 본 발명의 완전한 이해를 제공하기 위해 많은 특정 세부 사항이 설명되었다. 그러나, 이들 특정 세부 사항 없이도 본 발명이 실시될 수 있음은 통상의 기술자에게 명백할 것이다. 특정 경우에는, 본 발명의 요지를 흐리지 않기 위해 공지의 구조 및 기능은 상세하게 설명되지 않았다. 따라서, 본 발명의 범위 및 사상은 다음의 청구 범위에 의해 판단되어야 한다.

Claims (33)

  1. 장치로서,
    복수의 광선 셰이더(a plurality of ray shaders)를 실행하고 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 복수의 기능 유닛을 포함하는 실행 회로와,
    상기 실행 회로에 의해 생성된 상기 광선 메시지를 큐잉하는 선입 선출(First In First Out: FIFO) 버퍼와,
    상기 복수의 1차 광선 중 하나 이상을 저장하는 캐시와,
    상기 복수의 광선 메시지의 제1 서브세트를 대응하는 복수의 엔트리에 저장하는 메모리 지원 스택(memory-backed stack)과,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 상기 복수의 광선 메시지의 제2 서브세트를 상기 메모리 지원 스택에 저장하거나, 상기 복수의 광선 메시지의 상기 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 메모리 지원 스택 관리 회로와,
    상기 메모리 지원 스택으로부터 다음 광선 메시지를 판독하고, 상기 캐시 또는 메모리 서브시스템으로부터 상기 광선 메시지에 의해 식별된 다음 1차 광선을 검색하고, 상기 다음 1차 광선에 대한 탐색 동작을 수행하는 광선 탐색 회로를 포함하는
    장치.
  2. 제1항에 있어서,
    상기 메모리 지원 스택 및/또는 상기 메모리 서브시스템에 저장하기 전에 상기 복수의 광선 메시지 각각을 일시적으로 큐잉하기 위한 광선 메시지 선입 선출(FIFO) 버퍼를 더 포함하는
    장치.
  3. 제2항에 있어서,
    상기 복수의 광선 셰이더를 상기 실행 회로로 디스패칭하는 디스패처를 더 포함하되, 상기 디스패처는 상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 상기 복수의 광선 셰이더의 디스패칭을 조절하는 조절 회로(throttling circuitry)를 포함하는
    장치.
  4. 제2항에 있어서,
    상기 조절 회로는 상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 하나 이상의 스택 임계 값을 조정하는
    장치.
  5. 제4항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 상기 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함하는
    장치.
  6. 제5항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 상기 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함하는
    장치.
  7. 제6항에 있어서,
    상기 디스패처는 상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값에 기초하여 상기 실행 회로에 상기 복수의 광선 셰이더를 디스패칭하는
    장치.
  8. 제7항에 있어서,
    상기 실행 회로는 2개 이상의 서브 슬라이스로 세분화되고, 상기 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되고, 상기 기능 유닛의 제2 서브세트를 포함하는 제2 서브-슬라이스는 제2 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되는
    장치.
  9. 제1항에 있어서,
    상기 실행 회로와 상기 메모리 지원 스택 사이에 결합된 압축기를 더 포함하되, 상기 압축기는 단일 명령 다중 데이터(SIMD) 레인과 연관된 비어 있는 및/또는 무효한 슬롯을 제거하는
    장치.
  10. 제9항에 있어서,
    상기 압축기는 상기 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성하는
    장치.
  11. 제1항에 있어서,
    상기 메모리 지원 스택 관리 회로는 상기 메모리 지원 스택으로 푸시될, 상기 복수의 광선 메시지의 상기 제2 서브세트 중 하나 이상을 상기 메모리 서브시스템으로부터 페칭하기 위한 메모리 백엔드 페치 회로를 더 포함하는
    장치.
  12. 복수의 광선 셰이더에 의해 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 단계와,
    선입 선출(FIFO) 버퍼에 상기 광선 메시지를 큐잉하는 단계와,
    상기 복수의 1차 광선 중 하나 이상을 캐시에 저장하는 단계와,
    상기 복수의 광선 메시지의 제1 서브세트를 메모리 지원 스택의 대응하는 복수의 엔트리에 저장하는 단계와,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 상기 복수의 광선 메시지의 제2 서브세트를 상기 메모리 지원 스택에 저장하거나, 상기 복수의 광선 메시지의 상기 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 단계와,
    상기 메모리 지원 스택으로부터 다음 광선 메시지를 판독하는 단계와,
    상기 캐시 또는 메모리 서브시스템으로부터 상기 광선 메시지에 의해 식별된 다음 1차 광선을 검색하는 단계와,
    상기 다음 1차 광선에 대한 탐색 동작을 수행하는 단계를 포함하는
    방법.
  13. 제12항에 있어서,
    상기 메모리 지원 스택 및/또는 상기 메모리 서브시스템에 저장하기 전에 상기 복수의 광선 메시지 각각을 광선 메시지 선입 선출(FIFO) 버퍼에 일시적으로 큐잉하는 단계를 더 포함하는
    방법.
  14. 제13항에 있어서,
    상기 복수의 광선 셰이더를 실행 회로로 디스패칭하는 단계와,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 상기 복수의 광선 셰이더의 디스패칭을 조절하는 단계를 더 포함하는
    방법.
  15. 제13항에 있어서,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 하나 이상의 스택 임계 값이 조정되는
    방법.
  16. 제15항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함하는
    방법.
  17. 제16항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 상기 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함하는
    방법.
  18. 제17항에 있어서,
    상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값에 기초하여 실행 회로에 상기 복수의 광선 셰이더를 디스패칭하는 단계를 더 포함하는
    방법.
  19. 제18항에 있어서,
    상기 실행 회로를 2개 이상의 서브 슬라이스로 세분화하는 단계를 더 포함하되, 상기 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되고, 상기 기능 유닛의 제2 서브세트를 포함하는 제2 서브 슬라이스는 제2 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되는
    방법.
  20. 제12항에 있어서,
    단일 명령 다중 데이터(SIMD) 레인과 연관된 비어 있는 및/또는 무효한 슬롯을 제거하는 단계를 더 포함하는
    방법.
  21. 제20항에 있어서,
    상기 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성하는 단계를 더 포함하는
    방법.
  22. 제12항에 있어서,
    상기 메모리 지원 스택으로 푸시될, 상기 복수의 광선 메시지의 상기 제2 서브세트 중 하나 이상을 상기 메모리 서브시스템으로부터 페칭하는 단계를 더 포함하는
    방법.
  23. 프로그램 코드를 저장한 머신 판독가능 매체로서,
    상기 프로그램 코드는 머신에 의해 실행되는 경우 상기 머신으로 하여금을 동작들을 수행하게 하되, 상기 동작들은
    복수의 광선 셰이더에 의해 복수의 1차 광선 및 대응하는 복수의 광선 메시지를 생성하는 동작과,
    선입 선출(FIFO) 버퍼에 상기 광선 메시지를 큐잉하는 동작과,
    상기 복수의 1차 광선 중 하나 이상을 캐시에 저장하는 동작과,
    상기 복수의 광선 메시지의 제1 서브세트를 메모리 지원 스택의 대응하는 복수의 엔트리에 저장하는 동작과,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수에 적어도 부분적으로 기초하여, 상기 복수의 광선 메시지의 제2 서브세트를 상기 메모리 지원 스택에 저장하거나, 상기 복수의 광선 메시지의 상기 제2 서브세트 중 하나 이상을 메모리 서브시스템에 임시로 저장하는 동작과,
    상기 메모리 지원 스택으로부터 다음 광선 메시지를 판독하는 동작과,
    상기 캐시 또는 메모리 서브시스템으로부터 상기 광선 메시지에 의해 식별된 다음 1차 광선을 검색하는 동작과,
    상기 다음 1차 광선에 대한 탐색 동작을 수행하는 동작을 포함하는
    머신 판독가능 매체.
  24. 제23항에 있어서,
    상기 메모리 지원 스택 및/또는 상기 메모리 서브시스템에 저장하기 전에 상기 복수의 광선 메시지 각각을 광선 메시지 선입 선출(FIFO) 버퍼에 일시적으로 큐잉하는 동작을 더 포함하는
    머신 판독가능 매체.
  25. 제24항에 있어서,
    상기 복수의 광선 셰이더를 실행 회로로 디스패칭하는 동작과,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 상기 복수의 광선 셰이더의 디스패칭을 조절하는 동작을 더 포함하는
    머신 판독가능 매체.
  26. 제24항에 있어서,
    상기 메모리 지원 스택에서 광선 메시지에 의해 현재 점유되어 있는 엔트리의 수 및/또는 상기 광선 메시지 FIFO 버퍼에서의 광선 메시지 점유에 적어도 부분적으로 기초하여, 하나 이상의 스택 임계 값이 조정되는
    머신 판독가능 매체.
  27. 제26항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 기능 유닛에 액세스가능한 라이브 스택의 최대 수를 나타내는 제1 최대 스택 값을 포함하는
    머신 판독가능 매체.
  28. 제27항에 있어서,
    상기 스택 임계 값은 복수의 광선 셰이더를 실행하기 위해 상기 기능 유닛에 액세스가능한 라이브 스택의 최소 수를 나타내는 제1 최소 스택 값을 더 포함하는
    머신 판독가능 매체.
  29. 제28항에 있어서,
    상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값에 기초하여 실행 회로에 상기 복수의 광선 셰이더를 디스패칭하는 동작을 더 포함하는
    머신 판독가능 매체.
  30. 제29항에 있어서,
    상기 실행 회로를 2개 이상의 서브 슬라이스로 세분화하는 동작을 더 포함하되, 상기 기능 유닛의 제1 서브세트를 포함하는 제1 서브 슬라이스는 상기 제1 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되고, 상기 기능 유닛의 제2 서브세트를 포함하는 제2 서브 슬라이스는 제2 최소 스택 값 및/또는 상기 제1 최대 스택 값과 연관되는
    머신 판독가능 매체.
  31. 제23항에 있어서,
    단일 명령 다중 데이터(SIMD) 레인과 연관된 비어 있는 및/또는 무효한 슬롯을 제거하는 동작을 더 포함하는
    머신 판독가능 매체.
  32. 제31항에 있어서,
    상기 캐시의 캐시 라인 내에 맞는 고정된 크기의 광선 데이터 청크를 생성하는 동작을 더 포함하는
    머신 판독가능 매체.
  33. 제23항에 있어서,
    상기 메모리 지원 스택으로 푸시될, 상기 복수의 광선 메시지의 제2 서브세트 중 하나 이상을 메모리 서브시스템으로부터 페칭하는 동작을 더 포함하는
    머신 판독가능 매체.
KR1020200183953A 2020-03-16 2020-12-24 광선 추적 파이프라인을 조절하기 위한 장치 및 방법 KR20210116201A (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US16/820,483 2020-03-16
US16/820,483 US11915357B2 (en) 2020-03-16 2020-03-16 Apparatus and method for throttling a ray tracing pipeline

Publications (1)

Publication Number Publication Date
KR20210116201A true KR20210116201A (ko) 2021-09-27

Family

ID=77457301

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020200183953A KR20210116201A (ko) 2020-03-16 2020-12-24 광선 추적 파이프라인을 조절하기 위한 장치 및 방법

Country Status (6)

Country Link
US (2) US11915357B2 (ko)
JP (1) JP2021149944A (ko)
KR (1) KR20210116201A (ko)
CN (1) CN113409434A (ko)
DE (1) DE102020132377A1 (ko)
TW (1) TW202207167A (ko)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9378560B2 (en) * 2011-06-17 2016-06-28 Advanced Micro Devices, Inc. Real time on-chip texture decompression using shader processors
CN111709870B (zh) * 2020-05-28 2023-10-03 钟杰东 一种zjd应用处理器架构
US11367242B2 (en) * 2020-07-30 2022-06-21 Apple Inc. Ray intersect circuitry with parallel ray testing
US11875448B2 (en) 2020-07-30 2024-01-16 Apple Inc. SIMD group formation techniques during ray intersection traversal
US12074897B1 (en) * 2020-11-04 2024-08-27 Rapid7, Inc. Machine learned alert triage classification system
US11778211B2 (en) * 2021-09-16 2023-10-03 Apple Inc. Parallel video parsing for video decoder processing
CN114090185B (zh) * 2021-11-26 2024-08-30 杭州杉石科技有限公司 一种可视化显示仿真执行的方法及系统
GB2611599B (en) * 2022-03-31 2024-03-20 Imagination Tech Ltd Methods and hardware logic for loading ray tracing data into a shader processing unit of a graphics processing unit
US12079510B2 (en) 2022-09-08 2024-09-03 Samsung Electronics Co., Ltd. Systems and methods for executing data processing functions
TWI834546B (zh) * 2023-04-26 2024-03-01 吳先晃 管線瑕疵取像與辨識系統

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7830379B2 (en) * 2006-09-19 2010-11-09 Caustic Graphics, Inc. Architectures for parallelized intersection testing and shading for ray-tracing rendering
US8826299B2 (en) * 2007-08-13 2014-09-02 International Business Machines Corporation Spawned message state determination
US9424686B2 (en) * 2014-08-08 2016-08-23 Mediatek Inc. Graphics processing circuit having second vertex shader configured to reuse output of first vertex shader and/or process repacked vertex thread group and related graphics processing method thereof
CN110326021A (zh) * 2017-04-01 2019-10-11 英特尔公司 用于图形处理器上的加速计算的执行单元共享混合技术
US10521875B2 (en) * 2017-04-01 2019-12-31 Intel Corporation Thread scheduling over compute blocks for power optimization
US10255105B2 (en) * 2017-04-11 2019-04-09 Imagination Technologies Limited Parallel computing architecture for use with a non-greedy scheduling algorithm
CN109327403B (zh) * 2018-12-04 2022-08-16 锐捷网络股份有限公司 一种流控方法、装置、网络设备及存储介质
KR102169799B1 (ko) * 2019-04-11 2020-10-26 주식회사 실리콘아츠 포터블 레이 트레이싱 장치
US11250538B2 (en) * 2020-03-09 2022-02-15 Apple Inc. Completion signaling techniques in distributed processor

Also Published As

Publication number Publication date
TW202207167A (zh) 2022-02-16
US11915357B2 (en) 2024-02-27
CN113409434A (zh) 2021-09-17
US20240282042A1 (en) 2024-08-22
JP2021149944A (ja) 2021-09-27
DE102020132377A1 (de) 2021-09-16
US20210295583A1 (en) 2021-09-23

Similar Documents

Publication Publication Date Title
US11593909B2 (en) Apparatus and method for real time graphics processing using local and cloud-based graphics processing resources
KR20210116199A (ko) 변위된 메쉬 압축 장치 및 방법
US11915357B2 (en) Apparatus and method for throttling a ray tracing pipeline
CN116391207A (zh) 用于包括光线追踪的高效图形处理的设备和方法
JP7525091B2 (ja) 非同期レイトレーシング用の装置及び方法
US11670035B2 (en) Apparatus and method for performing non-local means filtering using motion estimation circuitry of a graphics processor
US11900498B2 (en) Apparatus and method for performing a stable and short latency sorting operation
JP7494258B2 (ja) ツリー構造データ削減のための装置および方法
KR20210116196A (ko) 광선 탐색 하드웨어에서 박스 쿼리를 수행하기 위한 장치 및 방법
KR20210084222A (ko) 양자화된 수렴 방향 기반의 광선 분류 장치 및 방법
CN115775197A (zh) 用于利用重要性采样的随机拼贴照明的装置和方法
US11989817B2 (en) Apparatus and method for high quality ray-traced level of detail transitions