KR20180059892A - 픽셀 타일 레벨 입도로의 그래픽스 프로세싱 유닛 선점 - Google Patents

픽셀 타일 레벨 입도로의 그래픽스 프로세싱 유닛 선점 Download PDF

Info

Publication number
KR20180059892A
KR20180059892A KR1020187012000A KR20187012000A KR20180059892A KR 20180059892 A KR20180059892 A KR 20180059892A KR 1020187012000 A KR1020187012000 A KR 1020187012000A KR 20187012000 A KR20187012000 A KR 20187012000A KR 20180059892 A KR20180059892 A KR 20180059892A
Authority
KR
South Korea
Prior art keywords
gpu
commands
primitives
execution
stage
Prior art date
Application number
KR1020187012000A
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 KR20180059892A publication Critical patent/KR20180059892A/ko

Links

Images

Classifications

    • 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
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/461Saving or restoring of program or task context
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T2200/00Indexing scheme for image data processing or generation, in general
    • G06T2200/28Indexing scheme for image data processing or generation, in general involving image processing hardware

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)
  • Image Processing (AREA)
  • Controls And Circuits For Display Device (AREA)
  • User Interface Of Digital Computer (AREA)

Abstract

기법들은 그래픽스 프로세싱 유닛 (GPU) 이 드로우 콜을 수신하는 것에 응답하여 커맨드들의 제 1 세트를 실행하는 것으로서, 드로우 콜은 커맨드들의 제 1 세트에 의해 렌더링되어야 하는 복수의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하고, 커맨드들의 제 1 세트의 실행 동안 선점 통지를 수신하고, 그리고 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 복수의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점할 수도 있는 선점에 대하여 설명된다.

Description

픽셀 타일 레벨 입도로의 그래픽스 프로세싱 유닛 선점
본 출원은 "GRAPHICS PROCESSING UNIT PREEMPTION" 을 발명의 명칭으로 하여 2015년 9월 29일자로 출원된 미국 가출원 제62/234,355호의 이익을 주장하고, 그 전체 내용은 본 명세서에 참조로 통합된다.
본 개시는 그래픽스 프로세싱 시스템들에 관한 것으로, 특히, 선점을 활용하는 그래픽스 프로세싱 시스템들에 관한 것이다.
컴퓨팅 디바이스들은 종종 디스플레이를 위한 그래픽스 데이터의 렌더링을 가속화하기 위해 그래픽스 프로세싱 유닛 (GPU) 을 활용한다. 이러한 컴퓨팅 디바이스들은, 예를 들어, 컴퓨터 워크스테이션들, 모바일 폰들, 이를 테면 소위 스마트폰들, 임베디드 시스템들, 개인 컴퓨터들, 태블릿 컴퓨터들, 및 비디오 게임 콘솔들을 포함할 수도 있다. GPU들은 통상적으로 그래픽스 프로세싱 커맨드들을 실행하기 위해 함께 동작하는 복수의 프로세싱 스테이지들을 포함하는 그래픽스 프로세싱 파이프라인을 실행한다. 호스트 중앙 프로세싱 유닛 (CPU) 은 GPU 에 하나 이상의 그래픽스 프로세싱 커맨드들을 이슈함으로써 GPU 의 동작을 제어할 수도 있다. 현대의 CPU들은 통상적으로 다중 애플리케이션들을 동시에 실행하는 것이 가능하며, 그 다중 애플리케이션들의 각각은 실행 동안 GPU 를 활용할 필요가 있을 수도 있다. 호스트 CPU 상에서 현재 실행중인 상이한 애플리케이션들 간의 GPU 리소스들의 중재는, 특히 소정의 애플리케이션들이 GPU 에 높은 우선순위 액세스를 요구할 수도 있는 경우들에서, 호스트 CPU 에 중대한 도전과제를 제기할 수 있다.
본 개시는 그래픽스 프로세싱 유닛 (GPU) 픽셀 타일 선점에 관련된다. 일부 예들에서, GPU 는 픽셀들의 "그룹" 을 렌더링한 후에 커맨드들의 제 1 세트로부터 커맨드들의 제 2 세트로 콘텍스트 스위칭 (예를 들어, 커맨드들의 제 1 세트를 선점) 할 수도 있다. 예를 들어, GPU 는 픽셀 그룹을 래스터화 및 셰이딩한 후에 선점할 수도 있다. 또한, 일부 예들에서, GPU 는 정상 프로세싱을 이용하여 상이한 셰이더들로부터의 데이터를 전달할 수도 있지만, 선점에 기초하여 버텍스 데이터가 스트림 출력 (stream out) 되는 방법을 동적으로 선택할 수도 있다. 예를 들어, GPU 그래픽스 파이프라인은 렌더링 데이터의 일부로서 중간 데이터를 생성하고 이 중간 데이터를 GPU 의 로컬 데이터에 저장하도록 구성된다. 그러나, 커맨드에 응답하여, GPU 는 GPU 외부의 메모리로 중간 데이터를 출력하도록 그래픽스 파이프라인을 동적으로 재구성한다.
하나의 예에서, 본 개시는 데이터를 프로세싱하는 방법을 설명하며, 그 방법은, 그래픽스 프로세싱 유닛 (GPU) 으로, 드로우 콜 (draw call) 을 수신하는 것에 응답하여 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하는 단계로서, 드로우 콜은 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하는 단계; GPU 로, 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지 (preemption notification) 를 수신하는 단계, 선점 통지를 수신하는 것에 응답하여, 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션 (interconnection) 을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지로부터 GPU 의 로컬 메모리의 출력부를 접속해제하고 GPU 의 로컬 메모리의 출력부를 GPU 의 하드웨어 스트림 출력 유닛에 접속하는 단계, 하드웨어 스트림 출력 유닛으로부터, 커맨드들의 제 1 세트의 실행 동안, GPU 의 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU 외부에 있는 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하는 단계, GPU 로, 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점하는 단계, 및 커맨드들의 제 2 세트를 실행하는 단계를 포함한다.
하나의 예에서, 본 개시는 데이터를 프로세싱하기 위한 디바이스를 설명하며, 그 디바이스는 시스템 메모리, 및 그래픽스 프로세싱 유닛 (GPU) 을 포함한다. GPU 는 하드웨어 스트림 출력 유닛 및 로컬 메모리를 포함하고, 여기서 GPU 는 드로우 콜을 수신하는 것에 응답하여 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하는 것으로서, 드로우 콜은 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하고, 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하고, 선점 통지를 수신하는 것에 응답하여, 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지로부터 GPU 의 로컬 메모리의 출력부를 접속해제하고 GPU 의 로컬 메모리의 출력부를 GPU 의 하드웨어 스트림 출력 유닛에 접속하고, 하드웨어 스트림 출력 유닛으로부터, 커맨드들의 제 1 세트의 실행 동안, GPU 의 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU 외부에 있는 시스템 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하고, 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점하고, 그리고 커맨드들의 제 2 세트를 실행하도록 구성된다.
하나의 예에서, 본 개시는 명령들을 저장하고 있는 컴퓨터 판독가능 저장 매체를 설명하며, 그 명령들은, 실행될 때, 데이터를 프로세싱하기 위한 디바이스의 그래픽스 프로세싱 유닛 (GPU) 으로 하여금, 드로우 콜을 수신하는 것에 응답하여 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하게 하는 것으로서, 드로우 콜은 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하게 하고, 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하게 하고, 선점 통지를 수신하는 것에 응답하여, 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지로부터 GPU 의 로컬 메모리의 출력부를 접속해제하고 GPU 의 로컬 메모리의 출력부를 GPU 의 하드웨어 스트림 출력 유닛에 접속하게 하고, 하드웨어 스트림 출력 유닛으로부터, 커맨드들의 제 1 세트의 실행 동안, GPU 의 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU 외부에 있는 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하게 하고, 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점하게 하고, 그리고 커맨드들의 제 2 세트를 실행하게 한다.
하나의 예에서, 본 개시는 데이터를 프로세싱하기 위한 디바이스를 설명하며, 그 디바이스는 드로우 콜을 수신하는 것에 응답하여 그래픽스 프로세싱 유닛 (GPU) 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하기 위한 수단으로서, 드로우 콜은 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하기 위한 수단, 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하기 위한 수단, 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지로부터 GPU 의 로컬 메모리의 출력부를 접속해제하고 GPU 의 로컬 메모리의 출력부를 GPU 의 하드웨어 스트림 출력 유닛에 접속하기 위한 수단, 하드웨어 스트림 출력 유닛으로부터, 커맨드들의 제 1 세트의 실행 동안, GPU 의 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU 외부에 있는 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하기 위한 수단, 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점하기 위한 수단, 및 커맨드들의 제 2 세트를 실행하기 위한 수단을 포함한다.
본 개시의 하나 이상의 예들의 상세들은 첨부하는 도면들 및 이하의 설명에서 기재된다. 본 개시의 다른 피처들, 목적들, 및 이점들은 설명 및 도면들로부터, 그리고 청구항들로부터 명백할 것이다.
도 1 은 본 개시의 기법들을 구현하는데 이용될 수도 있는 일 예의 컴퓨팅 디바이스를 예시하는 블록 다이어그램이다.
도 2 는 도 1 의 컴퓨팅 디바이스의 CPU, GPU 및 메모리를 더 상세히 예시하는 블록 다이어그램이다.
도 3a 는 디스플레이의 픽셀들을 예시하는 개념적 다이어그램이다.
도 3b 는 픽셀 타일을 예시하는 개념적 다이어그램이다.
도 4 는 본 개시에서 설명된 하나 이상의 예들에 따른 그래픽스 프로세싱 파이프라인의 일 예를 구현할 수도 있는 그래픽스 프로세싱 유닛 (GPU) 의 일 예를 예시하는 블록 다이어그램이다.
도 5 는 그래픽스 파이프라인의 다른 예를 예시하는 블록 다이어그램이다.
도 6 은 그래픽스 파이프라인의 다른 예를 예시하는 블록 다이어그램이다.
도 7 은 데이터를 프로세싱하는 일 예의 방법을 예시하는 플로우차트이다.
본 개시는 그래픽스 프로세싱 유닛 (GPU) 프로세스들을 스케줄링하기 위한 선점 기법들에 관련된다. 선점은 프로세서 (예를 들어, GPU) 가 커맨드들의 제 2 세트를 위해 커맨드들의 제 1 세트의 실행을 중단하게 하고, 그 후 커맨드들의 제 2 세트의 실행을 완료한 후에 커맨드들의 제 1 세트의 실행을 완료하게 하는 것을 지칭한다. 예를 들어, GPU 는 더 높은 우선순위의 커맨드들의 세트에 대해 낮은 우선순위의 커맨드들의 세트를 실행하는 것을 선점할 수도 있다.
상대적으로 높은 우선순위의 커맨드들의 세트의 일 예는 그래픽스 사용자 인터페이스 (GUI) 를 렌더링하기 위한 커맨드들이다. GPU들은 사용자 인터페이스 (UI) 렌더링을 위해 점점 더 많이 이용되고 있다. UI 커맨드 스트림들은 통상적으로, 사용자들이 UI 에서 기대하는 적절한 시각적 효과들 및 응답성을 달성하기 위하여 시기적절하게 서비스되는 것으로부터 이익을 얻는다. 높은 우선순위의 UI 커맨드 스트림이 GPU 상에서 실행되도록 호스트 CPU 에 의해 큐잉될 때, GPU 는 더 낮은 우선순위를 갖는 상이한 콘텍스트, 이를 테면, 예를 들어, 비-UI 그래픽스 콘텍스트 또는 범용 컴퓨팅 태스크 (즉, GPGPU (general-purpose computing on graphics processing unit) 태스크) 를 수행하기 위해 GPU 를 이용하는 콘텍스트와 연관된 다른 큐잉된 커맨드 스트림을 실행중일 수도 있다. 더 높은 우선순위의 UI 커맨드 스트림을 실행하기 이전에 더 낮은 우선순위의 콘텍스트가 실행을 완료하기를 대기하는 것은, 일부 경우들에서는, UI 에 대하여 용인할 수 있는 사용자 경험을 생성하지 않을 수도 있다.
더 낮은 또는 낮은 우선순위의 커맨드들 및 더 높은 또는 높은 우선순위의 커맨드들은 커맨드들의 시기적절한 실행의 중요성을 표시하는데 사용되는 상대적 용어들이다. 일 예로서, 사용자 경험을 방해하지 않도록 가능한 빨리 실행되어야 하는 커맨드들은, 실행이 약간 지연되어도, 사용자 경험을 크게 떨어뜨리지 않을 커맨드들과 비교하여 더 높은 우선순위일 것이다. 일 예로서, UI 커맨드들의 실행이 지연되면, 사용자 상호작용에 대한 응답이 지연될 것이기 때문에 사용자 경험에 부정적인 영향을 미칠 것이다. 백그라운드에서 발생하는 일부 행렬 연산들에 대한 커맨드들의 실행이 지연되면, 사용자 경험에 거의 영향을 미치지 않을 수도 있다.
커맨드들을 사용자 경험에 단지 기초하는 것이 아닌 더 높은 우선순위 또는 더 낮은 우선순위로서 한정 (qualify) 하는 다른 방식들이 존재할 수도 있다. 본 개시는 커맨드들의 하나의 세트로부터 커맨드들의 다른 세트로 스위칭하는 예들을 설명하기 위한 상대적 용어들로서 용어들 더 높은 우선순위 및 더 낮은 우선순위를 사용한다. 그러나, 본 개시에서 설명된 기법들은 커맨드들의 스위칭이 단지 낮은 우선순위의 커맨드들로부터 높은 우선순위의 커맨드들로 트랜지션하기 위해 발생하는 예들에 반드시 제한될 필요는 없다.
커맨드들의 제 1 세트를 실행하는 것으로부터, 커맨드들의 제 1 세트의 실행의 완료 전에 커맨드들의 제 2 세트로 스위칭하는 것은 GPU 콘텍스트 스위칭 또는 선점으로 지칭된다. 콘텍스트 스위칭 또는 선점은 다양한 커맨드들의 시기적절한 순방향 진행 (forward progress) 은 물론, 가상화, UI, 그래픽스/컴퓨터 app들 등 같은 다양한 GPU 워크로드들을 위한 하드웨어 가속화에 유용하다. 예를 들어, 새로운 사용 케이스들, 이를 테면 가상 현실 (프레임 당 시간 왜곡 (time warp) 요건들) 및 렌더링 지연들이 바람직하지 않거나 또는 용인할 수 없을 수도 있는 자동차 사용으로 인해 더 빈번한 선점의 필요성이 발생하고 있다.
이 문제에 대한 하나의 솔루션은, 호스트 CPU 가 임의적인 포인트들에서 더 낮은 우선순위의 커맨드 스트림의 실행을 선점하고 더 높은 우선순위 커맨드 스트림을 먼저 실행하는 것이 유리하거나 또는 바람직하다고 호스트 CPU 가 결정할 때마다 더 높은 우선순위의 커맨드 스트림을 서비스하는 것을 허용하는 것이다. 그러나, 이러한 솔루션은 GPU 커맨드 스트림에서의 이러한 임의적인 포인트들에서 GPU 에서 콘텍스트 스위칭을 수행하는데 필요한 오버헤드 (예를 들어, 추가적인 프로세싱 시간, 추가적인 메모리 대역폭 사용량, 및/또는 추가적인 메모리 사용량) 면에서 고가일 수 있다.
일부 GPU들은 드로우 콜 레벨 선점 (예를 들어, 이슈된 드로우콜이 완료된 후의 선점) 을 제공한다. 드로우 콜은 렌더링되어야 하는 복수의 프리미티브들을 정의할 수도 있다. 그러나, 드로우 콜 레벨 선점은 (예를 들어, 하나의 빈 또는 스크린을 커버하기 위한) 큰 사이즈의 삼각형들과 같은 소정의 경우들에 불충분할 수도 있다. 이러한 이슈들을 다루기 위해, 보다 미세한 입도의 (finer grained) 선점이 유용할 수도 있다. 블라인드 프리즈 (blind freeze) 및 세이브-리스토어 (save-restore) (예를 들어, 모든 기능들을 중단하고 GPU 의 스테이지들의 전부의 모든 상태 정보를 저장함) 가 고가이기 때문에 효율적인 솔루션은 아닐 수도 있다.
일반적으로, GPU 에서의 버텍스 셰이더 스테이지는 통상적으로 빠르고, 지오메트리의 사이즈에 상관없이 버텍스들의 수가 동일 (예를 들어, 삼각형의 사이즈에 상관없이 삼각형에 대해 3 개의 버텍스들) 하기 때문에 주어진 지오메트릭에 대해 일정하다. GPU 에서의 픽셀 셰이더 스테이지는 시간 소모가 클 수도 있다 (예를 들어, 워크로드는 지오메트릭와는 관계없이 레졸루션에 의해 가변한다). 예를 들어, 버텍스 셰이더 스테이지의 워크로드는 상이한 사이즈의 삼각형들에 대해 동일할 수도 있지만, 픽셀 셰이더 스테이지의 워크로드는 상이한 사이즈의 삼각형들에 대해 상이할 수도 있다. 예를 들어, 길고 얇은 삼각형들은 길고 두꺼운 삼각형들보다 더 적은 픽셀들을 갖고, 따라서 길고 두꺼운 삼각형들에 대한 워크로드는 길고 얇은 삼각형들에 대한 워크로드보다 더 많다. 예시로서, 제 1 삼각형의 버텍스들에 대한 좌표들이 (0,0), (1,15), 및 (2,0) 인 것을 가정한다. 이 예에서, 제 1 삼각형은 길지만 (예를 들어, 길이가 15 유닛들) 얇다 (예를 들어, 폭이 단지 2 유닛들). 제 2 삼각형의 버텍스들에 대한 좌표들이 (0,0), (10,15), 및 (20,0) 인 것을 가정한다. 이 예에서, 제 2 삼각형은 제 1 삼각형만큼 길지만 (예를 들어, 길이가 15 유닛들) 두껍다 (예를 들어, 폭이 20 유닛들). 제 1 삼각형보다 제 2 삼각형에는 더 많은 픽셀들이 있고, 따라서 제 2 삼각형에 대한 워크로드는 제 1 삼각형보다 더 많다. 또한, 레졸루션이 픽셀 셰이더 스테이지에 대한 워크로드에 영향을 미칠 수도 있다. 320x320 레졸루션의 길고 얇은 삼각형에 대한 워크로드는 1080p fullHD 레졸루션의 경우만큼 상당하지는 않을 수도 있다.
본 개시는 픽셀 타일 레벨 (입도) 선점의 예들을 설명한다. 예를 들어, 정상 동작에서, 버텍스 셰이더 스테이지는 픽셀 셰이더 스테이지 (또한 프래그먼트 셰이더 스테이지로 지칭됨) 로 데이터를 전달한다. 그러나, GPU 가 선점을 위한 명령들을 수신할 때, GPU 는 모든 버텍스 셰이더 스테이지들을 플러시 (예를 들어, 완료) 할 수도 있지만, 그 대신 데이터를 외부 메모리로 동적으로 디렉션할 수도 있다. 이렇게 하여, 일부 예들에서, 선점은 버텍스 셰이더 스테이지의 실행 후에, 그러나 드로우 콜의 픽셀 셰이더의 실행 전에 발생한다. 또한, GPU 는 버텍스 셰이더 스테이지로부터의 데이터가 온-칩 프로세스를 통해 프래그먼트 셰이더 스테이지로 전달되는지 여부 또는 버텍스 셰이더 스테이지 데이터가 오프-칩에서 외부 메모리로 디버팅되는지 여부를 동적으로 결정할 수도 있다. 선점된 콘텍스트를 재개할 때, 데이터는 외부 메모리로부터 판독되고 그래픽스 파이프라인으로 다시 피드된다.
본 개시에서 설명된 기법들에서, GPU 는 (예를 들어, CPU 로부터) 드로우 콜을 수신하는 것에 응답하여 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행한다. 드로우 콜은 커맨드들의 제 1 세트에 의해 렌더링되어야 하는 복수의 프리미티브들을 정의하고, 그래픽스 파이프라인은 GPU 의 로컬 메모리에 커맨드들의 제 1 세트의 실행 동안 생성된 데이터를 저장하도록 구성된다. GPU 가 더 높은 우선순위의 커맨드들의 세트 (예를 들어, 커맨드들의 제 2 세트) 를 실행할 필요성에 기초하여, GPU 는 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 (예를 들어, CPU 로부터) 선점 통지를 수신할 수도 있고, 선점 통지를 수신하는 것에 응답하여, GPU 는 GPU 외부에 있는 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하도록 GPU 의 그래픽스 파이프라인들의 스테이지들의 인터커넥션을 동적으로 구성한다. GPU 는 그 후, 커맨드들의 제 2 세트 (예를 들어, 커맨드들의 제 1 세트에 비해 더 높은 우선순위의 커맨드들) 을 실행하기 위해, 드로우 콜의 복수의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점할 수도 있다.
도 1 은 본 개시의 기법들을 구현하는데 이용될 수도 있는 일 예의 컴퓨팅 디바이스 (2) 를 예시하는 블록 다이어그램이다. 컴퓨팅 디바이스 (2) 는 개인 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔, 무선 통신 디바이스 (이를 테면, 예를 들어, 모바일 전화기, 셀룰러 전화기, 위성 전화기, 및/또는 모바일 전화기 핸드셋), 랜드라인 전화기, 인터넷 전화기, 핸드헬드 디바이스, 이를 테면 휴대용 비디오 게임 디바이스 또는 개인 휴대 정보 단말기 (PDA), 개인 뮤직 플레이어, 비디오 플레이어, 디스플레이 디바이스, 텔레비전, 텔레비전 셋-톱 박스, 서버, 중간 네트워크 디바이스, 메인프레임 컴퓨터 또는 그래픽 데이터를 프로세싱 및/또는 디스플레이하는 임의의 다른 타입의 디바이스를 포함할 수도 있다.
도 1 의 예에 예시한 바와 같이, 컴퓨팅 디바이스 (2) 는 사용자 입력 인터페이스 (4), CPU (6), 메모리 제어기 (8), 시스템 메모리 (10), 그래픽스 프로세싱 유닛 (GPU) (12), GPU (12) 의 로컬 메모리 (14), 디스플레이 인터페이스 (16), 디스플레이 (18) 및 버스 (20) 를 포함한다. 사용자 입력 인터페이스 (4), CPU (6), 메모리 제어기 (8), GPU (12) 및 디스플레이 인터페이스 (16) 는 버스 (20) 를 이용하여 서로 통신할 수도 있다. 버스 (20) 는 제 3 세대 버스 (예를 들어, HyperTransport 버스 또는 InfiniBand 버스), 제 2 세대 버스 (예를 들어, 어드밴스드 그래픽스 포트 (Advanced Graphics Port) 버스, PCI (Peripheral Component Interconnect) Express 버스, 또는 AXI (Advanced eXentisible Interface) 버스) 또는 다른 타입의 버스 또는 디바이스 인터커넥트와 같은 다양한 버스 구조들 중 임의의 것일 수도 있다. 도 1 에 도시된 상이한 컴포넌트들 간의 특정 구성의 버스들 및 통신 인터페이스들은 단지 예시적일 뿐이며, 동일하거나 또는 상이한 컴포넌트들을 가진 다른 구성들의 컴퓨팅 디바이스들 및/또는 다른 그래픽스 프로세싱 시스템들이 본 개시의 기법들을 구현하는데 이용될 수도 있다는 것에 유의해야 한다.
CPU (6) 는 컴퓨팅 디바이스 (2) 의 동작을 제어하는 범용 또는 특수 목적 프로세서를 포함할 수도 있다. 사용자는 CPU (6) 로 하여금 하나 이상의 소프트웨어 애플리케이션들을 실행하게 하기 위해 입력을 컴퓨팅 디바이스 (2) 에 제공할 수도 있다. CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은, 예를 들어, 오퍼레이팅 시스템, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 스프레드 시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션 또는 다른 프로그램을 포함할 수도 있다. 사용자는 사용자 입력 인터페이스 (4) 를 통해 컴퓨팅 디바이스 (2) 에 커플링되는 키보드, 마우스, 마이크로폰, 터치 패드 또는 다른 입력 디바이스와 같은 하나 이상의 입력 디바이스들 (미도시) 을 통해 컴퓨팅 디바이스 (2) 에 입력을 제공할 수도 있다.
CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은 디스플레이 (18) 에의 그래픽스 데이터의 렌더링을 야기할 것을 CPU (6) 에 명령하는 하나 이상의 그래픽스 렌더링 명령들을 포함할 수도 있다. 일부 예들에서, 소프트웨어 애플리케이션들은 예를 들어, 오픈 그래픽스 라이브러리 (OpenGL®) API, 오픈 그래픽스 라이브러리 임베디드 시스템들 (OpenGL ES) API, Direct3D API, X3D API, RenderMan API, WebGL API, 또는 임의의 다른 공공 또는 독점 표준 그래픽스 API 와 같은 그래픽스 애플리케이션 프로그래밍 인터페이스 (API) 에 따를 수도 있다. 그래픽스 렌더링 명령들을 프로세싱하기 위하여, CPU (6) 는 GPU (12) 로 하여금 그래픽스 데이터의 렌더링의 일부 또는 전부를 수행하게 하기 위해 하나 이상의 그래픽스 렌더링 커맨드들을 GPU (12) 에 이슈할 수도 있다. 일부 예들에서, 렌더링될 그래픽스 데이터는 일 리스트의 그래픽스 프리미티브들, 예를 들어, 점들, 선들, 삼각형들, 쿼드라래터럴 (quadralateral) 들, 삼각형 스트립들 등을 포함할 수도 있다.
메모리 제어기 (8) 는 시스템 메모리 (10) 로 들어가고 시스템 메모리 (10) 에서 나가는 데이터의 전송을 용이하게 한다. 예를 들어, 메모리 제어기 (8) 는 메모리 판독 및 기록 커맨드들을 수신하고, 이러한 커맨드들을 메모리 (10) 에 대하여 서비스하여 컴퓨팅 디바이스 (2) 에서의 컴포넌트들에 대해 메모리 서비스들을 제공할 수도 있다. 메모리 제어기 (8) 는 시스템 메모리 (10) 에 통신가능하게 커플링된다. 메모리 제어기 (8) 는 도 1 의 예의 컴퓨팅 디바이스 (2) 에서 CPU (6) 와 시스템 메모리 (10) 양자 모두와는 별개인 프로세싱 모듈인 것으로서 예시되지만, 다른 예들에서, 메모리 제어기 (8) 의 기능성의 일부 또는 전부는 CPU (6) 및 시스템 메모리 (10) 중 하나 또는 양자 모두 상에서 구현될 수도 있다.
시스템 메모리 (10) 는 CPU (6) 에 의한 실행을 위해 액세스가능한 프로그램 모듈들 및/또는 명령들 및/또는 CPU (6) 상에서 실행하는 프로그램들에 의한 이용을 위한 데이터를 저장할 수도 있다. 예를 들어, 시스템 메모리 (10) 는 사용자 애플리케이션들 및 그 애플리케이션들과 연관된 그래픽스 데이터를 저장할 수도 있다. 시스템 메모리 (10) 는 컴퓨팅 디바이스 (2) 의 다른 컴포넌트들에 의한 이용을 위한 및/또는 그 다른 컴포넌트들에 의해 생성된 정보를 추가적으로 저장할 수도 있다. 예를 들어, 시스템 메모리 (10) 는 GPU (12) 에 대한 디바이스 메모리로서의 역할을 할 수도 있고 GPU (12) 에 의해 수행된 동작들로부터 발생하는 데이터는 물론 GPU (12) 상에서 동작될 데이터를 저장할 수도 있다. 예를 들어, 시스템 메모리 (10) 는 텍스처 버퍼들, 심도 버퍼들, 스텐실 버퍼들, 버텍스 버퍼들, 프레임 버퍼들 등의 임의의 조합을 저장할 수도 있다. 추가로, 시스템 메모리 (10) 는 GPU (12) 에 의한 프로세싱을 위한 커맨드 스트림들을 저장할 수도 있다. 시스템 메모리 (10) 는 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들, 이를 테면, 예를 들어, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 판독 전용 메모리 (ROM), 소거가능한 프로그래밍가능 ROM (EPROM), 전기적으로 소거가능한 프로그래밍가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들을 포함할 수도 있다.
GPU (12) 는 디스플레이 (18) 에 하나 이상의 그래픽스 프리미티브들을 렌더링하기 위해 그래픽스 동작들을 수행하도록 구성될 수도 있다. 따라서, CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들 중 하나가 그래픽스 프로세싱을 요구할 때, CPU (6) 는 디스플레이 (18) 에 렌더링하기 위해 GPU (12) 에 그래픽스 커맨드들 및 그래픽스 데이터를 제공할 수도 있다. 그래픽스 커맨드들은, 예를 들어, 드로우 콜과 같은 드로잉 커맨드들, GPU 상태 프로그래밍 커맨드들, 메모리 전송 커맨드들, 범용 컴퓨팅 커맨드들, 커널 실행 커맨드들 등을 포함할 수도 있다. 일부 예들에서, CPU (6) 는 GPU (12) 에 의해 액세스될 수도 있는 메모리 (10) 에 커맨드들 및 그래픽스 데이터를 기록함으로써 GPU (12) 에 커맨드들 및 그래픽스 데이터를 제공할 수도 있다. 일부 예들에서, GPU (12) 는 CPU (6) 상에서 실행하는 애플리케이션들에 대해 범용 컴퓨팅을 수행하도록 추가로 구성될 수도 있다.
GPU (12) 는 일부 인스턴스들에서, CPU (6) 보다 더 효율적인 벡터 연산들의 프로세싱을 제공하는 고도-병렬 구조 (highly-parallel structure) 로 구축될 수도 있다. 예를 들어, GPU (12) 는 병렬 방식으로 다수의 버텍스들 또는 픽셀들 상에서 동작하도록 구성되는 복수의 프로세싱 엘리먼트들을 포함할 수도 있다. GPU (12) 의 고도 병렬 본성은, 일부 인스턴스들에서, GPU (12) 가, CPU (6) 를 이용하여 디스플레이 (18) 에 직접 장면들을 드로잉하는 것보다 더 빨리 디스플레이 (18) 위로 그래픽스 이미지들 (예를 들어, GUI들 및 2 차원 (2D) 및/또는 3 차원 (3D) 그래픽스 장면들) 을 드로잉하는 것을 허용할 수도 있다. 추가로, GPU (12) 의 고도 병렬 본성은 GPU (12) 가 CPU (6) 보다 더 빨리 범용 컴퓨팅 애플리케이션들에 대한 소정의 타입들의 벡터 및 행렬 연산들을 프로세싱하는 것을 허용할 수도 있다.
GPU (12) 는 일부 인스턴스들에서, 컴퓨팅 디바이스 (2) 의 마더보드에 통합될 수도 있다. 다른 인스턴스들에서, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보드에서의 포트에 설치되는 그래픽스 카드 상에 존재할 수도 있거나 또는 다른 경우에는 컴퓨팅 디바이스 (2) 와 상호동작하도록 구성된 주변 디바이스 내에 통합될 수도 있다. 추가 인스턴스들에서, GPU (12) 는 SoC (system on a chip) 를 형성하는 CPU (6) 와 동일한 마이크로칩 상에 로케이트될 수도 있다. GPU (12) 는 하나 이상의 마이크로프로세서들, 주문형 집적 회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 디지털 신호 프로세서들 (DSP들), 또는 다른 등가의 집적 또는 이산 로직 회로부와 같은 하나 이상의 프로세서들을 포함할 수도 있다.
GPU (12) 는 GPU 로컬 메모리 (14) 에 직접 커플링될 수도 있다. 따라서, GPU (12) 는 반드시 버스 (20) 를 이용하지 않고도 GPU 로컬 메모리 (14) 로부터 데이터를 판독하고 GPU 로컬 메모리 (14) 에 데이터를 기록할 수도 있다. 다시 말해서, GPU (12) 는 오프-칩 메모리 대신에, 로컬 스토리지를 이용하여 로컬로 데이터를 프로세싱할 수도 있다. 이것은, 과중한 버스 트래픽을 경험할 수도 있는, GPU (12) 가 버스 (20) 를 통해 데이터를 판독 및 기록할 필요성을 제거함으로써 GPU (12) 가 보다 효율적인 방식으로 동작하는 것을 허용한다. 그러나, 일부 인스턴스들에서, GPU (12) 는 별도의 캐시를 포함하지 않고, 그 대신 버스 (20) 를 통해 시스템 메모리 (10) 를 활용할 수도 있다. GPU 로컬 메모리 (14) 는 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들, 이를 테면, 예를 들어, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능한 프로그래밍가능 ROM (EPROM), 전기적으로 소거가능한 프로그래밍가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들을 포함할 수도 있다.
CPU (6) 및/또는 GPU (12) 는 시스템 메모리 (10) 내에 할당되는 프레임 버퍼에 렌더링된 이미지 데이터를 저장할 수도 있다. 디스플레이 인터페이스 (16) 는 프레임 버퍼로부터 데이터를 취출하고 렌더링된 이미지 데이터에 의해 표현된 이미지를 디스플레이하도록 디스플레이 (18) 를 구성할 수도 있다. 일부 예들에서, 디스플레이 인터페이스 (16) 는 프레임 버퍼로부터 취출된 디지털 값들을 디스플레이 (18) 에 의해 소비가능한 아날로그 신호로 컨버팅하도록 구성되는 디지털-대-아날로그 컨버터 (DAC) 를 포함할 수도 있다. 다른 예들에서, 디스플레이 인터페이스 (16) 는 프로세싱을 위해 디스플레이 (18) 에 직접 디지털 값들을 전달할 수도 있다. 디스플레이 (18) 는 모니터, 텔레비전, 프로젝션 디바이스, 액정 디스플레이 (LCD), 플라즈마 디스플레이 패널, 발광 다이오드 (LED) 어레이, 음극선관 (CRT) 디스플레이, 전자 페이퍼, 표면 전도 전자 방출 디스플레이 (SED), 레이저 텔레비전 디스플레이, 나노결정 디스플레이 또는 다른 타입의 디스플레이 유닛을 포함할 수도 있다. 디스플레이 (18) 는 컴퓨팅 디바이스 (2) 내에 통합될 수도 있다. 예를 들어, 디스플레이 (18) 는 모바일 전화기 핸드셋 또는 태블릿 컴퓨터의 스크린일 수도 있다. 대안적으로, 디스플레이 (18) 는 유선 또는 무선 통신 링크를 통해 컴퓨팅 디바이스 (2) 에 커플링된 스탠드-얼론 디바이스일 수도 있다. 예를 들어, 디스플레이 (18) 는 케이블 또는 무선 링크를 통해 개인 컴퓨터에 접속된 컴퓨터 모니터 또는 플랫 패널 디스플레이일 수도 있다.
본 개시에서 설명된 기법들은 선점에 관한 것이다. 선점에서, GPU (12) 는 커맨드들의 하나의 세트의 실행을 멈추고, 완료할 커맨드들의 다른 세트를 실행하고, 그 후 커맨드들의 원래의 세트의 실행을 완료할 수도 있다. 예를 들어, 더 높은 우선순위의 커맨드들의 다른 세트가 실행되어야 한다고 CPU (6) 가 결정할 때 GPU (12) 는 커맨드들의 세트를 실행중일 수도 있다. 일 예시로서, 터치스크린일 수도 있는 디스플레이 (18) 와 사용자가 상호작용하는 것에 응답하여 사용자 인터페이스에 대한 커맨드들이 먼저 실행되어야 한다고 CPU (6) 가 결정할 때 GPU (12) 는 비디오 게임의 콘텐츠를 생성하기 위한 커맨드들을 실행중이다. 이 예에서, GPU (12) 는 비디오 게임에 대한 커맨드들의 실행을 완료하는 것이 지연된다 하더라도 사용자-인터페이스를 생성하기 위한 커맨드들을 실행하는 것을 완료할 수도 있다.
일부 경우들에서, GPU (12) 는 드로우 콜 레벨 선점을 제공하도록 구성될 수도 있다. 예를 들어, 선점은 드로우 콜 경계 (boundary) 들에서 단지 허용될 수도 있다. 이 예에서, GPU (12) 가 드로우 콜을 실행하는 것을 시작하고, 그 후 선점하라는 명령들을 수신하면, GPU (12) 는 드로우 콜의 실행의 완료 (예를 들어, 픽셀 타일의 렌더링을 위한 픽셀 셰이더의 완전한 실행) 까지 선점할 수 없다.
그러나, 드로우 콜 경계들에서 단지 선점하는 것은 소정의 경우들에 대해 바람직하지 않을 수도 있다. 예를 들어, "프리미티브들의 그룹" 에 대한 드로우 콜을 완료하는 것은 (예를 들어, 드로우 콜에 응답한 버텍스 셰이더들, 픽셀 셰이더들, 다른 셰이더들, 및 고정 기능 유닛들의 기능들의 전부의 실행으로 인해) 오래 걸려 더 높은 우선순위의 커맨드들의 실행을 지연시킬 수도 있다. 더 많은 예들로서, 단일 프리미티브 레벨 선점은 또한 불충분할 수도 있고, 드로우 콜 레벨 선점은 (예를 들어, 하나의 빈 또는 스크린을 커버하기 위한) 큰 사이즈의 삼각형들에 대해서도 물론 기능하지 않을 수도 있다. 드로우 콜은 렌더링되어야 하는 복수의 프리미티브들을 정의할 수도 있다.
본 개시는 보다 미세한 입도의 선점 (예를 들어, 드로우 콜 경계들에서 발생할 필요가 없는 선점) 을 위한 예의 기법들을 설명한다. 예의 기법들은 상기 이슈들을 다룰 수도 있다. 일부 경우들에서, VR 같은 워크로드들은 (프레임 당) 시간 왜곡을 지원하기 위해 드로우 콜 경계들보다 보다 미세한 입도의 선점으로부터 이익을 얻을 수도 있다. 본 개시에서 설명된 기법들은 이러한 보다 미세한 입도의 선점을 제공할 수도 있다.
일부 기법들에서, GPU (12) 의 블라인드 프리즈 및 세이브-리스토어는 보다 미세한 입도의 선점을 위해 (예를 들어, 드로우 콜 경계들 사이에서) 활용될 수도 있다. 블라인드 프리즈 및 세이브-리스토어는, GPU (12) 의 모든 상태들이 그들 개별의 상태들에서 즉시 프리즈되고, 그 후 그들 상태를 표시하는 정보가 추후 취출 및 GPU (12) 의 리스토어링 (restoring) 을 위해 저장된다는 것을 의미한다. 그러나, GPU (12) 의 블라인드 프리즈 및 세이브-리스토어는 GPU (12) 의 너무 많은 리소스들을 독점할 뿐만 아니라, 프로세싱 및 전력 면에서 너무 고가일 수도 있다.
일반적으로, CPU (6) 는 GPU (12) 가 그래픽스 데이터를 프로세싱하게 하기 위해 드로우 콜을 출력하고, 응답으로 GPU (12) 는 드로우 콜과 연관된 그래픽스 데이터를 프로세싱한다. 드로우 콜과 연관된 그래픽스 데이터의 양은 가변적일 수도 있다 (예를 들어, 수 백개의 프리미티브들, 수 천개의 프리미티브들). 그래픽스 데이터를 프로세싱하기 위해, GPU (12) 는 고정-기능 프로세싱 스테이지들 및 프로그래밍가능 프로세싱 스테이지들을 포함하는 그래픽스 파이프라인 (도 4 에 더 상세히 예시됨) 을 포함하고, 이들 스테이지들의 각각은 GPU (12) 가 최종 프로세싱된 그래픽스 데이터를 출력할 때까지 수신된 데이터를 프로세싱하고 결과의 중간 데이터를 차후를 위해 다음 스테이지로 출력하여, 이로써 파이프라인을 형성한다.
프로그래밍가능 스테이지들의 예들은 버텍스 셰이더들 및 픽셀 셰이더들 (또한 프래그먼트 셰이더들로 지칭됨) 을 포함한다. 버텍스 셰이더 스테이지는 통상적으로 그래픽스 파이프라인에 대해 스루풋 제한적이지 않고 지오메트리에 대해 일정하다. 픽셀 셰이더 스테이지는 워크로드가 통상적으로 지오메트리와는 관계없이 레졸루션에 의해 가변하기 때문에, 스루풋 제한적일 수도 있다.
예를 들어, 버텍스 셰이더 스테이지는 프리미티브들의 버텍스들에 대해 동작들을 수행한다. 프리미티브의 사이즈에 상관없이, 버텍스 셰이더 스테이지의 버텍스 셰이더가 동작하는 설정된 수의 버텍스들이 존재한다. 프리미티브의 하나의 예는 삼각형이며, 삼각형이 얼마나 큰지에 상관없이, 각각 삼각형의 하나의 버텍스를 프로세싱하기 위해, 버텍스 셰이더들의 3 개의 인스턴스화 (instantiation) 들이 실행해야 한다. 그러나, 픽셀 셰이더 스테이지에서의 픽셀 셰이더의 인스턴스화들의 수는 프리미티브에 의해 캡슐화된 픽셀들의 수의 함수일 수도 있다. 예를 들어, 픽셀 셰이더의 하나의 인스턴스화가 프리미티브의 각각의 픽실에 대해 실행된다. 따라서, 프로세싱의 관점에서, 버텍스 셰이더 스테이지의 스루풋이 결정가능하고 상대적으로 일정할 수도 있지만, 픽셀 셰이더 스테이지의 스루풋은 가변적일 수도 있고 프로세싱 이전에 반드시 결정가능한 것은 아닐 수도 있다.
하나의 예에서, GPU (12) 는 선점을 위한 픽셀 타일 레벨 (입도) 을 위해 구성될 수도 있다. 예를 들어, GPU (12) 는 픽셀들의 "그룹" (그러나 반드시 드로우 콜과 연관된 픽셀들의 전부일 필요는 없다) 을 렌더링한 후에 선점할 수도 있다. 픽셀 그룹의 가장 작은 입도는 보통 GPU (12) 의 래스터라이저에 의해 처리되는 "픽셀 타일" 이다. 도 4 에 예시된, 래스터라이저는, GPU (12) 의 그래픽스 파이프라인의 고정-기능 스테이지일 수도 있다. 이 예에서, GPU (12) 는 픽셀 타일 (예를 들어, 드로우 콜과 연관된 픽셀들의 일부, 그러나 반드시 드로우 콜과 연관된 모든 픽셀들일 필요는 없다) 을 래스터화 및 셰이딩한 후에 선점 (예를 들어, 커맨드들의 제 1 세트를 실행하는 것으로부터, 커맨드들의 제 1 세트의 커맨드들의 전부의 실행이 완료하지 않았더라도 커맨드들의 제 2 세트로 스위칭) 할 수도 있다. 픽셀 타일 사이즈는 GPU (12) 의 벤더/패밀리/아키텍처에 기초하여 가변적일 수도 있다.
본 개시에서, 예들은 그래픽스 프로세싱에 대하여 설명된다. 그러나, 본 개시에서 설명된 기법들은 그렇게 제한되지 않고, 비-그래픽스 애플리케이션 (예를 들어, 컴퓨트 셰이더) 이 GPU (12) 상에서 실행하는 예들로 확장된다. 용어들 드로우 콜 및 픽셀 타일은 그래픽스 애플리케이션들에 배타적으로 제한되는 것으로 간주되어서는 안되고, GPU (12) 가 컴퓨트 셰이더들 (예를 들어, 행렬 또는 벡터 연산과 같은 애플리케이션들에 관련된 비-그래픽스) 을 실행중일 때 유사한 커맨드들 및 데이터의 그룹들을 커버하는 것으로 간주되어야 한다.
상기 설명한 바와 같이, 본 개시에서 설명된 기법들은 드로우 콜의 완료 없이 GPU (12) 가 선점하는 것을 허용한다. 그래픽스 데이터를 프로세싱하기 위해, GPU (12) 는 버텍스 셰이더, 래스터라이저, 및 픽셀 셰이더를 포함하는 그래픽스 파이프라인을 구현한다. 그래픽스 파이프라인은 추가적인 스테이지들 (예를 들어, 도메인, 테셀레이션, 및 헐 스테이지들) 을 포함하고, 버텍스 셰이더, 래스터라이저, 및 픽셀 셰이더 스테이지들은 단지 예시의 목적들을 위해서만 설명된다. 그래픽스 파이프라인은 2 개의 예들로서 DX11 파이프라인 또는 OpenGL 파이프라인에 따를 수도 있지만, 반드시 임의의 특정한 파이프라인 표준에 따라야 하는 것은 아니다.
드로우 콜을 완료하기 위해, GPU (12) 는 전체 그래픽스 파이프라인을 통하여 그래픽스 데이터를 프로세싱한다. 하나의 예에서, 그래픽스 파이프라인의 하나의 유닛 (예를 들어, 버텍스 셰이더) 은 중간 데이터를 생성하고, 중간 데이터를 GPU (12) 의 로컬 메모리 (14) 에 저장하고, 파이프라인에서의 다음 유닛 (예를 들어, 래스터라이저 또는 픽셀 셰이더) 은 프로세싱을 위해 이 중간 데이터를 취출한다. 다른 예에서, 버텍스 셰이더는 항상 중간 데이터를 외부 메모리 (예를 들어, 시스템 메모리 (10)) 로 출력한다.
본 개시에서 설명된 기법들에서, GPU (12) 가 선점하라는 명령을 수신하면, GPU (12) 는 중간 데이터를 시스템 메모리 (10) 로 동적으로 출력하여 GPU (12) 가 드로우 콜을 완료할 필요 없이 선점할 수 있다. 시스템 메모리 (10) 로의 이 동적 출력은 호스트 프로세서 (예를 들어, CPU (6)) 로부터의 명령 또는 이의 지식 없이 행해진다. 그러나, GPU (12) 가 선점하라는 명령을 수신하지 않는다면, GPU (12) 의 그래픽스 파이프라인의 스테이지들은 로컬 메모리 (14) 에 그래픽스 데이터를 저장한다.
상기 설명한 바와 같이, 그래픽스 프로세싱을 수행하기 위해, GPU (12) 는 픽셀 타일로 지칭된 픽셀들의 그룹에 대해 기능한다. 드로우 콜은 하나 이상의 프리미티브들의 프로세싱을 포함하고, 각각의 프리미티브는 하나 이상의 픽셀 타일들을 포함할 수도 있다. 일부 기법들에서, GPU (12) 는 드로우 콜과 연관된 모든 프리미티브들의 모든 픽셀 타일들이 렌더링될 때까지 선점하지 않을 것이다. 본 개시에서 설명된 기법들에서, GPU (12) 는 렌더링될 필요가 있는 프리미티브에 더 많은 픽셀 타일들이 존재하거나, 또는 렌더링될 필요가 있는 드로우 콜에 더 많은 프리미티브들이 존재한다 하더라도 프리미티브의 픽셀 타일을 렌더링한 후에 선점할 수도 있다.
이에 따라, 본 개시에서 설명된 기법들은, 드로우 콜이 하나 이상의 프리미티브들을 포함하고 각각의 프리미티브가 하나 이상의 픽셀 타일들을 포함하기 때문에, 드로우 콜 선점 (예를 들어, 드로우 콜의 프로세싱 후의 선점) 보다 더 세밀한 입도인 픽셀 타일 레벨 선점 (예를 들어, 픽셀 타일의 프로세싱 후의 선점) 을 제공한다. GPU (12) 가 선점 전에 드로우 콜과 연관된 모든 프리미티브들의 모든 픽셀 타일들을 프로세싱하는 것을 완료하기를 대기하는 것은, 픽셀 타일의 실행의 완료 직후에 선점하는 것보다 훨씬 더 많은 시간일 수도 있다.
본 개시에서 설명된 기법들에서, 드로우 콜의 하나 이상의 프리미티브들은 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함하고, GPU (12) 는 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일을 프로세싱한 후에 선점할 수도 있다. 드로우 콜 레벨 선점을 단지 제공하는 기법들에서, GPU (12) 는 선점 전에 프리미티브들의 제 1 세트와 프리미티브들의 제 2 세트 양자 모두의 모든 픽셀 타일들을 프로세싱할 필요가 있을 것이다.
선점을 수행하고 픽셀 타일 레벨 입도를 제공하기 위해, GPU (12) 는 시스템 메모리 (10) 로 중간 데이터를 동적으로 출력할 수도 있다. 중간 데이터의 이러한 동적 출력을 수행하기 위해, GPU (12) 는 선점 통지에 응답하여, GPU (12) 가 시스템 메모리 (10) 로 버텍스 셰이더 스테이지에 의해 생성된 중간 데이터를 출력하도록 GPU (12) 의 그래픽스 파이프라인을 동적으로 구성하도록 구성될 수도 있다.
버텍스 셰이더 스테이지에 후속하는 스테이지들의 각각은 그래픽스 파이프라인에서 현재 그래픽스 데이터의 프로세싱을 완료할 수도 있다. 예를 들어, 그래픽스 파이프라인의 래스터라이저 스테이지가 픽셀 타일 입도에 대해 기능하기 때문에, 픽셀 셰이더는 프로세싱되는 특정한 픽셀 타일의 픽셀들에 대한 최종 그래픽스 데이터를 출력할 수도 있다. 그 후, 그래픽스 파이프라인은 프로세싱될 더 많은 픽셀 타일들 및 프리미티브들이 존재한다 하더라도 드로우 콜과 연관된 프리미티브들의 픽셀 타일들을 프로세싱하기 위한 커맨드들의 실행을 중단할 수도 있다.
GPU (12) 는 그 후 실행을 위해 이용되는 것이 현재 자유로운 그래픽스 파이프라인을 통해 명령들의 다른 세트 (예를 들어, 더 높은 우선순위의 명령들) 를 실행할 수도 있다. 그 후, GPU (12) 가 명령들의 원래의 세트의 실행을 완료해야 할 때, GPU (12) 는 시스템 메모리 (10) 로부터 중간 데이터를 판독하고 중간 데이터를 생성한 스테이지에 후속하는 그래픽스 파이프라인 스테이지에서 중간 데이터를 피드한다.
정상 동작 동안, 각각의 스테이지는 GPU (12) 의 로컬 메모리 (14) 로 중간 데이터를 출력한다. 본 개시에서 설명된 기법들에서, 선점 통지에 응답하여, GPU (12) 는 그래픽스 파이프라인의 스테이지 (예를 들어, 레이터라이저 스테이지) 에 접속하는 로컬 메모리의 출력부를 접속해제하고, 시스템 메모리 (10) 로 중간 데이터를 출력하는 하드웨어 스트림 출력 유닛에 로컬 메모리의 출력부를 접속할 수도 있다.
본 개시에서 사용한 바와 같이, 용어들 "접속해제하다 (disconnect)" 및 "접속하다 (connect)" 는 중간 데이터가 상이한 방식들로 라우팅되는 것을 허용하는 하드웨어 컴포넌트들 (예를 들어, 스위치) 이 존재한다는 것을 전달하는데 사용된다. 본 개시에서 설명된 기법들로, 그래픽스 파이프라인의 스트림 출력 하드웨어는 선점을 또한 허용하기 위해 리퍼포징될 수 있다. 이러한 방식으로 컴퓨트 셰이더들 등 같은 소프트웨어는 스위치들 같은 하드웨어와는 상이한 방식들로 중간 데이터를 라우팅하기 위해 실행될 필요가 없고 스트림 출력 유닛은 스트림 출력 하드웨어의 정상적인 목적에 더하여 선점을 위해 추가적으로 이용될 수 있다.
GPU (12) 는 커맨드들의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성한다. 예를 들어, GPU (12) 의 그래픽스 파이프라인의 래스터라이저 스테이지는 보통 그래픽스 파이프라인의 픽셀 셰이더 스테이지에 커플링된다. 일부 예들에서, 그래픽스 파이프라인의 스테이지들이 커맨드들의 실행 이전에 인터커넥트되는 방법을 구성하는 것보다는, GPU (12) 는 커맨드들의 실행이 시작된 후 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성할 수도 있다 (예를 들어, 커맨드들 중 적어도 하나의 커맨드가 실행한 후, GPU (12) 는 스테이지들의 인터커넥션을 동적으로 구성한다).
GPU (12) 는 커맨드들의 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 시스템 메모리 (10) 로 커맨드들 중 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력할 수도 있다. 일부 기법들에서, GPU (12) 는 절대 시스템 메모리 (10) 로 중간 데이터를 출력하지 않도록 (예를 들어, 절대 중간 데이터를 스트림 출력하지 않도록) 구성될 수도 있다. 일부 기법들에서, GPU (12) 는 시스템 메모리 (10) 로 중간 데이터를 항상 출력 (예를 들어, 중간 데이터를 항상 스트림 출력) 하도록 구성될 수도 있다. 일부 예들은 중간 데이터의 옵션적 스트림 출력을 (예를 들어, 시스템 메모리 (10) 로 중간 데이터를 옵션적 출력하기) 위해 허용된다. 그러나, 옵션적 스트림 출력의 이러한 예들에서, GPU (12) 의 그래픽스 파이프라인이 중간 데이터를 출력할지 또는 중간 데이터를 출력하지 않을지는 GPU (12) 에 의한 커맨드들의 실행 이전에 결정되고 CPU (6) 에 의해 (예를 들어, 이를 테면 OpenGL 및 DIrect X API들에 따라) 설정되었다.
본 개시에서 설명된 기법들에서, GPU (12) 가 중간 데이터를 출력하는지 여부는 동적 결정이고 선점 명령들의 수신에 응답하여 행해진다. CPU (6) 는 GPU (12) 가 실행을 시작하기 전에 GPU (12) 의 그래픽스 프로세싱 파이프라인이 시스템 메모리 (10) 로 중간 데이터를 출력할지 또는 시스템 메모리 (10) 로 중간 데이터를 출력하지 않을지를 사전-정의할 필요가 없을 수도 있다. 오히려, GPU (12) 는 시스템 메모리 (10) 로 중간 데이터를 출력하지 않고, 선점 통지에 응답하여, 시스템 메모리 (10) 로 중간 데이터를 출력하도록 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성 (예를 들어, 래스터라이저 스테이지로부터 로컬 메모리 (14) 의 출력부를 접속해제하고 로컬 메모리 (14) 의 그 출력부를 하드웨어 스트림 출력 유닛에 접속) 하도록 구성될 수도 있다. CPU (6) 의 관점에서, GPU (12) 의 그래픽스 파이프라인에는 어떤 변화도 없다 (즉, GPU (12) 는 CPU (6) 로부터의 어떤 명령들도 없이 시스템 메모리 (10) 로 중간 데이터를 출력하도록 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성 (예를 들어, 하나의 스테이지가 접속된 것을 변화시키고 그 스테이지를 상이한 유닛에 접속) 한다.
도 2 는 도 1 의 컴퓨팅 디바이스 (2) 의 CPU (6), GPU (12) 및 메모리 (10) 를 더 상세히 예시하는 블록 다이어그램이다. 도 2 에 도시한 바와 같이, CPU (6) 는 GPU (12) 및 메모리 (10) 에 통신가능하게 커플링되고, GPU (12) 는 CPU (6) 및 메모리 (10) 에 통신가능하게 커플링된다. GPU (12) 는 일부 예들에서, CPU (6) 와 마더보드에 통합될 수도 있다. 추가적인 예들에서, GPU (12) 는 CPU (6) 를 포함하는 마더보드의 포트에 설치되는 그래픽스 카드 상에 구현될 수도 있다. 추가의 예들에서, GPU (12) 는 CPU (6) 와 상호동작하도록 구성되는 주변 디바이스 내에 통합될 수도 있다. 추가적인 예들에서, GPU (12) 는 SoC (system on a chip) 를 형성하는 CPU (6) 와 동일한 마이크로칩 상에 로케이트될 수도 있다. CPU (6) 는 소프트웨어 애플리케이션들 (24A, 24B), 그래픽스 API (26), GPU 드라이버 (28) 및 오퍼레이팅 시스템 (30) 을 실행시키도록 구성된다. GPU (12) 는 제어기 (32) 및 하나 이상의 프로세싱 유닛들 (34) 을 포함한다.
소프트웨어 애플리케이션들 (24A, 24B) 은 그래픽스 콘텐츠가 디스플레이되게 하는 하나 이상의 명령들 또는 비-그래픽스 태스크 (예를 들어, 범용 컴퓨팅 태스크) 가 GPU (12) 상에서 수행되게 하는 하나 이상의 명령들 중 적어도 하나를 각각 포함할 수도 있다. 소프트웨어 애플리케이션들 (24A, 24B) 은 그래픽스 API (26) 에 명령들을 이슈할 수도 있다. 그래픽스 API (26) 는 소프트웨어 애플리케이션들 (24A, 24B) 로부터 수신된 명령들을 GPU 드라이버 (28) 에 의해 소비가능한 포맷으로 트랜슬레이트하는 런타임 서비스일 수도 있다.
GPU 드라이버 (28) 는 그래픽스 API (26) 를 통해 소프트웨어 애플리케이션들 (24A, 24B) 로부터 명령들을 수신하고, 명령들을 서비스하기 위해 GPU (12) 의 동작을 제어한다. 예를 들어, GPU 드라이버 (28) 는 하나 이상의 커맨드 스트림들을 포뮬레이팅하고 커맨드 스트림들을 메모리 (10) 에 배치하고, 커맨드 스트림들을 실행할 것을 GPU (12) 에 명령할 수도 있다. GPU 드라이버 (28) 는 커맨드 스트림들을 메모리 (10) 에 배치하고 오퍼레이팅 시스템 (30) 을 통해, 예를 들어, 하나 이상의 시스템 콜들을 통해 GPU (12) 와 통신할 수도 있다.
GPU 드라이버 (28) 는 다른 커맨드 스트림 (예를 들어, 높은 우선순위의 커맨드 스트림) 이 실행 준비가 되었다는 것을 표시하기 위해 GPU 제어기 (32) 로 선점 통지를 전송할 수도 있다. 일부 예들에서, 선점 통지는 또한, 현재 실행되고 있는 커맨드 스트림의 선점 시 어느 커맨드 스트림을 실행할지를 GPU (12) 에 표시할 수도 있다. GPU 드라이버 (28) 는 예를 들어, 하나 이상의 값들을 (예를 들어, 오퍼레이팅 시스템 (30) 을 통해) GPU 제어기 (32) 에 의해 폴링되는 하나 이상의 GPU 레지스터들에 기록함으로써, GPU 제어기 (32) 로 선점 통지를 전송할 수도 있다. 하나 이상의 GPU 레지스터들은 GPU (12) 에 로케이트되는 하나 이상의 하드웨어 GPU 레지스터들, 메모리 (예를 들어, 메모리 (10)) 에 로케이트되는 하나 이상의 메모리-맵핑된 GPU 레지스터들 또는 그 임의의 조합을 포함할 수도 있다. 메모리-맵핑된 GPU 레지스터에 값들을 기록할 때, CPU (6) 는 GPU 제어기 (32) 에 의해 폴링되는 메모리 (10) 에 하나 이상의 특정한 메모리 어드레스들에 대한 값들을 기록할 수도 있다. 일부 예들에서, GPU 드라이버 (28) 는 선점 통지 (GPU (12) 에서의 "인터럽트들" 을 포함함) 를 활성화하기 위해 하나 이상의 GPU 레지스터들에 제 1 값을 기록하고, 현재 실행되고 있는 커맨드 스트림의 선점 시에 실행할 커맨드 스트림의 로케이션을 식별하는 제 2 값을 하나 이상의 GPU 레지스터들에 기록할 수도 있다.
제어기 (32) 는 커맨드 스트림들에 저장된 커맨드들을 취출하고, 그 커맨드들을 프로세싱 유닛들 (34) 중 하나 이상의 프로세싱 유닛들 상에서의 실행을 위해 디스패치하도록 구성된다. 제어기 (32) 는 프로세싱 유닛들 (34) 의 전부 또는 서브세트 상에서의 실행을 위해 커맨드 스트림으로부터 커맨드들을 디스패치할 수도 있다. 일부 예들에서, 제어기 (32) 는 CPU (6) 가 GPU (12) 로 선점 통지를 전송했는지 여부를 표시하는 하나 이상의 GPU 레지스터들을 폴링하도록 구성될 수도 있다. GPU 레지스터들이 메모리-맵핑된 레지스터들인 경우들에서, 제어기 (32) 는 CPU (6) 가 GPU (12) 로 선점 통지를 전송했는지 여부를 표시하는 메모리 (10) 에서의 하나 이상의 특정한 메모리 어드레스들을 폴링하도록 구성될 수도 있다. CPU (6) 가 GPU (12) 로 선점 통지를 전송했다는 것을 하나 이상의 GPU 레지스터들이 표시하는 것에 응답하여, 제어기 (32) 는 현재 실행하고 있는 GPU 커맨드 스트림의 실행을 선점하고 다른 커맨드 스트림을 실행하기 시작할 수도 있다. 예를 들어, 본 개시에서 설명된 기법들에서, 제어기 (32) 는, 선점 통지에 응답하여, GPU (12) 가 하나 이상의 프로세싱 유닛들 (34) 의 프로세싱 유닛들에 의해 생성된 중간 데이터를 시스템 메모리 (10) 로 출력하도록 프로세싱 유닛들 (34) 에 의해 형성된 그래픽스 파이프라인을 구성할 수도 있다. 일부 경우들에서, 제어기 (32) 는 선점 시에 실행할 커맨드 스트림을 식별하는 GPU (12) 의 하나 이상의 레지스터들에 저장된 정보를 판독함으로써 현재 실행하는 커맨드 스트림의 선점 시에 실행할 커맨드 스트림을 결정하도록 구성될 수도 있다. 예를 들어, CPU (6) 는 더 높은 우선순위의 커맨드 스트림의 메모리 로케이션을 식별하는 포인터를 하나 이상의 GPU 레지스터들에 저장할 수도 있다.
제어기 (32) 는 GPU (12) 의 하드웨어일 수도 있고, GPU (12) 상에서 실행하는 소프트웨어 또는 펌웨어일 수도 있고, 또는 양자의 조합일 수도 있다. 또한, 제어기 (32) 가 선점하라는 명령이 수신되는지 여부를 결정하는 방법에 대한 상기 설명이 단지 예시의 목적들을 위해서만 제공된다. CPU (6) 가 GPU (12) 에 선점할 것을 명령하는 다른 방식들이 존재할 수도 있고, 본 개시에서 설명된 기법들은 임의의 특정 예에 제한되지 않는다.
프로세싱 유닛들 (34) 은 하나 이상의 프로세싱 유닛들을 포함할 수도 있고, 그 하나 이상의 프로세싱 유닛들의 각각은 프로그래밍가능 프로세싱 유닛 또는 고정 기능 프로세싱 유닛일 수도 있다. 스테이지들로 또한 지칭되는, 프로세싱 유닛들 (34) 의 프로세싱 유닛들은, 함께 그래픽스 프로세싱을 수행하도록 구성된 그래픽스 파이프라인을 형성한다. 프로그래밍가능 프로세싱 유닛은, 예를 들어, CPU (6) 로부터 GPU (12) 로 다운로드되는 하나 이상의 셰이더 프로그램들을 실행하도록 구성되는 프로그래밍가능 셰이더 유닛을 포함할 수도 있다. 셰이더 프로그램은, 일부 예들에서, 예를 들어, OpenGL 셰이딩 언어 (GLSL), 하이 레벨 셰이딩 언어 (HLSL), Cg (C for Graphics) 셰이딩 언어 등과 같은 하이-레벨 셰이딩 언어로 기록된 프로그램의 컴파일링된 버전일 수도 있다. 일부 예들에서, 프로그래밍가능 셰이더 유닛은 병렬로 동작하도록 구성되는 복수의 프로세싱 유닛들, 예를 들어, SIMD 파이프라인을 포함할 수도 있다. 프로그래밍가능 셰이더 유닛은 셰이더 프로그램 명령들 및 실행 상태 레지스터, 예를 들어, 실행되고 있는 프로그램 메모리에서의 현재 명령 또는 페치될 다음 명령을 표시하는 프로그램 카운터 레지스터를 저장하는 프로그램 메모리를 가질 수도 있다. 프로세싱 유닛들 (34) 에서의 프로그래밍가능 셰이더 유닛들은 예를 들어, 버텍스 셰이더 스테이지들, 픽셀 셰이더 스테이지들, 지오메트리 셰이더 스테이지들, 헐 셰이더 스테이지들, 도메인 셰이더 스테이지들, 컴퓨트 셰이더 스테이지들, 및/또는 통합 셰이더 스테이지들을 포함할 수도 있다.
고정 기능 프로세싱 유닛은 소정의 기능들을 수행하도록 하드-와이어링되는 하드웨어를 포함할 수도 있다. 고정 기능 하드웨어는 예를 들어 하나 이상의 제어 신호들을 통해, 상이한 기능들을 수행하도록 구성가능할 수도 있지만, 고정 기능 하드웨어는 통상적으로 사용자-컴파일링된 프로그램들을 수신하는 것이 가능한 프로그램 메모리를 포함하지 않는다. 일부 예들에서, 프로세싱 유닛들 (34) 에서의 고정 기능 프로세싱 유닛들은 예를 들어, 래스터 동작들, 이를 테면, 예를 들어, 심도 테스팅, 시저스 테스팅 (scissors testing), 알파 블렌딩 등을 수행하는 프로세싱 유닛들을 포함할 수도 있다.
도 2 의 예의 그래픽스 프로세싱 시스템에서, 메모리 (10) 는 2 개의 커맨드 스트림들을 포함하고, 각각의 커맨드 스트림은 상이한 그래픽스 애플리케이션 콘텍스트 (즉, 소프트웨어 애플리케이션들 (24A, 24B) 중 상이한 하나의 소프트웨어 애플리케이션) 와 연관된다. 예를 들어, 제 1 커맨드 스트림은 소프트웨어 애플리케이션 (24A) 에 대한 그래픽스 애플리케이션 콘텍스트와 연관되고, 제 2 커맨드 스트림은 소프트웨어 애플리케이션 (24B) 에 대한 그래픽스 애플리케이션 콘텍스트와 연관된다. 예시의 용이함을 위해, 2 개의 GPU 커맨드 스트림들은 도 2 의 예의 그래픽스 프로세싱 시스템의 메모리 (10) 에 저장되는 것으로서 설명된다. 그러나, 다른 예들에서는, 그래픽스 프로세싱 시스템의 동일하거나 또는 상이한 컴포넌트들에 저장되는 동일하거나 또는 상이한 수의 GPU 커맨드 스트림들이 이용될 수도 있다.
상기 예에서, GPU (12) 가 스위칭하는 2 개의 스트림들은 2 개의 상이한 애플리케이션들 (24A, 24B) 로부터의 커맨드 스트림들이다. 그러나, 본 개시에서 설명된 예들은 그렇게 제한되지 않는다. 일부 예들에서, GPU (12) 는 필요하다면 동일한 애플리케이션의 커맨드 스트림들 사이에 스위칭할 수도 있다 (예를 들어, 애플리케이션 (24A) 의 높은 우선순위의 스트림이 애플리케이션 (24A) 의 낮은 우선순위의 스트림을 선점한다). 본 개시에서 설명된 커맨드 스트림들은 상이한 애플리케이션들에 대한 것으로 제한되는 것으로 간주되어서는 안되고, 동일한 애플리케이션에 대한 것일 수도 있다.
CPU (6) 의 GPU 드라이버 (28) 는 커맨드 스트림들을 메모리 (10) 에 기록하도록 구성될 수도 있고, GPU (12) 의 제어기 (32) 는 메모리 (10) 로부터 커맨드 스트림들의 하나 이상의 커맨드들을 판독하도록 구성될 수도 있다. 일부 예들에서, 커맨드 스트림들 중 하나 또는 양자 모두는 메모리 (10) 에 링 버퍼로서 저장될 수도 있다. 링 버퍼는 CPU (6) 및 GPU (12) 가 링 버퍼에의 데이터의 기록 및 링 버퍼로부터의 데이터의 판독과 연관된 동기화된 상태 변수들을 유지하는 순환적 어드레싱 스킴을 가진 버퍼일 수도 있다. 예를 들어, 제 1 커맨드 스트림이 링 버퍼이면, CPU (6) 및 GPU (12) 의 각각은 링 버퍼에 기록될 다음 어드레스를 표시하는 기록 포인터, 및 링 버퍼에서부터 판독될 다음 어드레스를 표시하는 판독 포인터를 저장할 수도 있다. CPU (6) 가 링 버퍼에 새로운 커맨드를 기록할 때, CPU (6) 는 CPU (6) 에서의 기록 포인터를 업데이트하고 GPU (12) 에서의 기록 포인터를 업데이트할 것을 GPU (12) 에 명령할 수도 있다. 유사하게, GPU (12) 가 링 버퍼로부터 새로운 커맨드를 판독할 때, GPU (12) 는 GPU (12) 에서의 판독 포인터를 업데이트하고 CPU (6) 에서의 판독 포인터를 업데이트할 것을 CPU (6) 에 명령할 수도 있다. 다른 동기화 메커니즘들이 가능하다. 판독 및/또는 기록 포인터들이 링 버퍼에 대해 할당된 어드레스들의 범위에서 가장 높은 어드레스에 도달할 때, 판독 및/또는 기록 포인터들은 순환적 어드레싱 스킴을 구현하기 위해 가장 낮은 어드레스에 랩 어라운드할 수도 있다.
본 개시에 따라 설계된 일 예의 GPU 드라이버 (28) 및 일 예의 GPU 제어기 (32) 의 예의 동작이 이제 도 2 에 대하여 설명될 것이다. 이 예에서, 소프트웨어 애플리케이션 (24B) 은 소프트웨어 애플리케이션 (24A) 의 스케줄링 우선순위보다 더 높은 스케줄링 우선순위를 갖는다. 특히, 이 예에서, 소프트웨어 애플리케이션 (24B) 은, 그래픽 콘텐츠가 디스플레이되게 하는 하나 이상의 명령들을 포함하고 UI 의 시기적절한 업데이트들을 보장하기 위해 GPU (12) 에 높은 우선순위 액세스를 요구하는 사용자 인터페이스 (UI) 소프트웨어 애플리케이션이다. 한편, 이 예에서, 소프트웨어 애플리케이션 (24A) 은, 그래픽 콘텐츠가 디스플레이되게 하는 하나 이상의 명령들 및/또는 비-그래픽스 태스크 (예를 들어, GPGPU 컴퓨팅 태스크) 가 GPU (12) 상에서 수행되게 하는 하나 이상의 명령들을 포함하는 더 낮은 우선순위의 애플리케이션이다.
GPU 드라이버 (28) 는 GPU (12) 에 의해 수행될 그래픽스 동작들 및/또는 범용 컴퓨팅 동작들을 특정하는 하나 이상의 명령들을 소프트웨어 애플리케이션 (24A) 으로부터 수신한다. GPU 드라이버 (28) 는 GPU 제어기 (32) 에 의해 액세스가능한 메모리 (10) 에 출력 커맨드 스트림을 배치한다. GPU 드라이버 (28) 는 소프트웨어 애플리케이션 (24A) 에 대응하는 커맨드 스트림이 프로세싱에 이용가능하다는 것을 GPU 제어기 (32) 에 통지한다. 예를 들어, GPU 드라이버 (28) 는 GPU 레지스터 (예를 들어, GPU (12) 에 의해 폴링되는 GPU 하드웨어 레지스터 및/또는 GPU (12) 에 의해 폴링된 GPU 메모리-멥핑된 레지스터) 에 커맨드 스트림이 실행 준비가 되었다는 것을 표시하는 하나 이상의 값들을 기록할 수도 있다.
커맨드 스트림이 실행 준비가 되었다고 통지 시, GPU (12) 의 제어기 (32) 는 커맨드 스트림을 실행하는 것을 시작하기 위해 리소스들이 GPU (12) 상에서 현재 이용가능한지를 결정할 수도 있다. 리소스들이 이용가능하다면, 제어기 (32) 는 커맨드 스트림에서의 커맨드들을 디스패치하기 시작한다. 한편, GPU 드라이버 (28) 는 GPU (12) 에 의해 수행될 높은 우선순위의 그래픽스 동작들을 특정하는 하나 이상의 명령들을 UI 소프트웨어 애플리케이션 (24B) 으로부터 수신한다. GPU 드라이버 (28) 는 수신된 명령들에 의해 특정된 동작들을 수행하기 위해 높은 우선순위의 커맨드 스트림을 생성하고, 결과의 커맨드 스트림을 메모리 (10) 에 배치한다.
GPU 드라이버 (28) 는 높은 우선순위의 커맨드 스트림이 프로세싱 준비가 되었고 이 커맨드 스트림이 GPU (12) 상에서 실행중인 임의의 다른 더 낮은 우선순위의 커맨드 스트림들을 선점해야 한다는 것을 표시하는 선점 통지를 제어기 (32) 에 제공한다. 일부 예들에서, GPU 드라이버 (28) 는 GPU (12) 에 의해 폴링된 GPU 하드웨어 레지스터에 기록함으로써 및/또는 GPU (12) 에 의해 폴링되는 메모리-맵핑된 레지스터 (예를 들어, 메모리 (10) 에서의 특정한 로케이션) 에 기록함으로써 선점 통지 (예를 들어, 선점 명령 또는 커맨드) 를 GPU (12) 에 제공할 수도 있다.
일부 경우들에서, GPU 드라이버 (28) 또는 CPU (6) 는 동일한 애플리케이션의 커맨드들 또는 상이한 애플리케이션들에 대한 선점 레벨들을 정의할 수도 있다. 예를 들어, 제 1 스트림은 제 2 스트림보다 더 높은 우선순위를 갖지만, 제 3 스트림보다는 더 낮은 우선순위를 갖는다. 이 예에서, 제 2 스트림이 실행중이라면, GPU 드라이버 (28) 는 GPU (12) 로 하여금, 제 1 스트림 또는 제 3 스트림 중 어느 하나로 제 2 스트림을 선점하게 할 수도 있다. 그러나, 제 1 스트림이 실행중이면, 단지 제 3 스트림만이 선점될 수도 있고, 어떤 스트림도 제 3 스트림을 선점하지 못할 수도 있다. 이 예는 "n" 스트림들로 확장될 수도 있고, 스트림들이 다른 스트림들을 선점할 수 있는 다른 팩터들이 존재할 수도 있다.
본 개시에서 설명된 기법들에서, GPU (12) 는 픽셀 타일 레벨 선점을 지원할 수도 있다. 예를 들어, GPU (12) 는 "정상" 프로세싱을 위해 온-칩 데이터 패싱을 이용하고, 그래픽스 파이프라인의 스테이지들이 인터커넥트되는 방식을 동적으로 구성하는 것에 의한 선점에 기초하여 버텍스 출력을 스트림 출력하도록 동적으로 선정할 수도 있다. 일 예로서, GPU (12) 는 "선점" 시 파이프라인에서의 프리미티브들에 대한 데이터 저장을 위해, 외부 메모리, 이를 테면 메모리 (10) (예를 들어, 통신을 위한 버스 (20) 를 요구하는 메모리) 를 이용할 수도 있고, 픽셀 (타일) 생성을 중단할 수도 있다. GPU (12) 는 모든 버텍스 스테이지들을 플러시하지만, 그 대신 그들을 외부 메모리로 동적으로 디렉션할 수도 있다. GPU (12) 의 제어기 (32), 일부 다른 하드웨어 또는 소프트웨어 컴포넌트, 또는 GPU (12) 의 제어기 (32) 및 다른 컴포넌트들은 이 동적 디렉션을 메모리 (10) 에 수행할 수도 있다. 재개 시, GPU (12) 의 제어기 (32) 또는 일부 다른 하드웨어 또는 소프트웨어 컴포넌트, 또는 GPU (12) 의 제어기 (32) 및 다른 컴포넌트들은 픽셀 파이프라인으로 포스트 변환 버텍스 속성들을 피드할 수도 있다.
일부 예들에서, 포스트 변환 버텍스 속성들은 픽셀 셰이더 스테이지로 피드된다. 그러나, 일반적으로, 재개 시에, GPU (12) 의 제어기 (32) 또는 일부 다른 하드웨어 또는 소프트웨어 컴포넌트, 또는 GPU (12) 의 제어기 (32) 및 다른 컴포넌트들은 버텍스 셰이더 스테이지, 도메인 셰이더 스테이지, 지오메트리 셰이더 스테이지, 또는 다른 셰이더 스테이지들과 같은 프리-픽셀 셰이더 스테이지 출력으로 포스트 변환 버텍스 속성들을 피드할 수도 있다. 프로세스의 재개가 발생하는 스테이지는 GPU (12) 의 스테이지들 중 하나에 있을 수도 있고 본 개시에서 설명된 기법들은 선점된 프로세스의 재개가 시작하는 GPU (12) 의 임의의 특정한 스테이지에 제한되는 것으로 간주되어서는 안된다.
일 예로서, 프로세싱 유닛들 (34) 에 의해 형성된 그래픽스 파이프라인은, 하나의 유닛 (또는 스테이지) 이 다음 스테이지가 수신하고 추가로 프로세싱하는 중간 데이터를 생성하는 파이프라인 방식으로 그래픽스 프로세싱을 수행할 수도 있다. 정상 동작 동안, 각각의 스테이지는 생성된 중간 데이터를 GPU (12) 의 로컬 메모리 (14) (예를 들어, 캐시; 그러나, 레지스터들 또는 버퍼들과 같은 다른 예들이 또한 로컬 메모리 (14) 로서 가능하다) 로 출력한다. 다음 스테이지는 그 후 추가 프로세싱을 위해 로컬 메모리로부터 중간 데이터를 판독한다.
그러나, CPU (6) 가 선점 통지를 출력하는 이벤트에서, 제어기 (32) 는 프로세싱 유닛들 (34) 에 의해 형성된 그래픽스 파이프라인의 구성을 변화시키도록 구성될 수도 있다. 일 예로서, 제어기 (32) 는 로컬 메모리로부터 중간 데이터를 수신하는 그래픽스 파이프라인의 스테이지를 접속해제하고 중간 데이터를 시스템 메모리 (10) 로 출력하는 하드웨어 스트림 출력 유닛에 로컬 메모리의 출력부를 접속할 수도 있다. 제어기 (32) 는 선점 통지에 응답하여 중간 데이터를 동적으로 스트림 출력 (예를 들어, 시스템 메모리 (10) 로 출력) 하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛들 (34) 에 의해 형성된 그래픽스 파이프라인은 커맨드들의 실행 이전에, 중간 데이터를 시스템 메모리 (10) 로 스트림 출력하거나 또는 중간 데이터를 시스템 메모리 (10) 로 스트림하지 않거나 둘 중 어느 하나를 행하도록 구성될 수도 있다. 본 개시에서 설명된 기법들에서, 커맨드들의 실행 동안 그래픽스 파이프라인을 동적으로 구성함으로써 (예를 들어, 선점 통지에 응답하여), GPU (12) 는 선점을 더 빨리 수행하는 것이 가능할 수도 있다.
예를 들어, GPU (12) 는 시스템 메모리 (10) 로 중간 데이터 (예를 들어, 하나 이상의 프리미티브들을 렌더링하는 데이터 생성된 중간-프로세스) 를 출력하도록 구성될 수도 있고, 이는 중간 데이터가 시스템 메모리 (10) 에 기록된 후에, 프로세싱 유닛들 (34) 이 더 높은 우선순위의 커맨드들을 실행할 준비가 되어 있다는 것을 의미한다. 프로세싱 유닛들 (34) 은 더 높은 우선순위의 커맨드들을 실행하기 전에 드로우 콜의 모든 프리미티브들이 프로세싱될 때까지 대기할 필요가 없다.
상기 언급한 바와 같이, 접속해제하다 및 접속하다는 중간 데이터를 라우팅하도록 특별히 설계된 하드웨어 컴포넌트들이 있다는 것을 의미하기 위해 본 개시에서 사용된다. 예를 들어, 스트림 출력 유닛은 고정 기능들 가진 (예를 들어, 프로그래밍가능하지 않음) 하드웨어 유닛일 수도 있다. 스트림 출력 유닛의 고정 기능들은 중간 데이터를 라우팅하는 것일 수도 있고 GPU (12) 는 그래픽스 파이프라인을 프로그래밍적으로 (기능적으로) 변화시키기 보다는, 물리적으로 로컬 메모리의 출력부를 접속해제하고 로컬 메모리의 출력부를 스트림 출력 유닛에 접속할 수도 있다. 일부 예들에서, 컴퓨트 셰이더들 같은 소프트웨어는 기법들이 고속 선점을 허용하는 선점 목적들을 위해 스트림 출력 기능성을 레버리징하기 때문에 중간 데이터를 라우팅하기 위해 실행될 필요가 없다.
도 3a 는 디스플레이 (18) 의 픽셀들을 예시하는 개념적 다이어그램이다. 도 3b 는 디스플레이 (18) 상의 픽셀 타일 (36) 을 예시하는 개념적 다이어그램이다. 도 3a 에는, 2 개의 프리미티브들 (예를 들어, 디스플레이 (18) 를 가로지르는 대각선에 의해 형성된 2 개의 삼각형들) 이 존재한다. 픽셀 타일 (36) 은 GPU (12) 의 래스터라이저가 처리하는 픽셀 그룹의 가장 작은 입도의 일 예이다. 예시한 바와 같이, 픽셀 타일 (36) 은 디스플레이 (18) 의 상부-우측 코너에 로케이트되지만, 다른 로케이션들이 가능하다. 또한, 픽셀 타일 (36) 은 4x3 인 것으로 예시되지만 (예를 들어, 픽셀 타일 (36) 에서 가로로 4 개의 픽셀들 및 세로로 3 개의 픽셀들이 존재한다), 다른 사이즈들이 가능하고 일반적으로 GPU (12) 의 벤더, 패밀리, 및/또는 아키텍처에 기초한다.
본 개시에서 설명된 기법들에서, 픽셀 타일 (36) 이 프로세싱되고 있다고 가정하면, GPU (12) 는 GPU (12) 가 픽셀 타일 (36) 을 프로세싱한 후에 더 높은 우선순위의 커맨드들의 세트로 더 낮은 우선순위의 커맨드들의 세트의 실행을 선점하는 것이 가능할 수도 있다. 예를 들어, GPU (12) 가 픽셀 타일 (36) 의 픽셀들의 픽셀 값들을 생성 및 저장하고 모든 다른 중간 데이터가 시스템 메모리 (10) 로 스트림 출력된 후, GPU (12) 는 더 높은 우선순위의 커맨드들을 실행하는 것으로 스위칭할 수도 있다.
일부 기법들에서, GPU (12) 는 픽셀 타일 (36) 을 포함하는 프리미티브의 모든 픽셀들에 대한 픽셀 값들이 생성될 때까지 뿐만 아니라, 다른 프리미티브 (예를 들어, 픽셀 타일 (36) 을 포함하지 않는 프리미티브) 의 모든 픽셀들에 대한 픽셀 값들이 생성될 때까지도 대기해야 할 수도 있다. GPU (12) 는 드로우 콜의 완료까지 (예를 들어, GPU (12) 가 드로우 콜 경계에 도달할 때까지) 대기해야 할 것이다. 드로우 콜 경계는 (예를 들어, 픽셀 값들이 드로우 콜의 마지막 프리미티브의 마지막 픽셀에 대해 생성 및 저장된 후의) 드로우 콜의 끝이다.
선점의 픽셀 타일 레벨 입도로, 선점에서의 지연이 감소된다. 예를 들어, 도 3b 에서, 프리미티브들의 제 1 세트가 픽셀 타일 (36) 을 포함하는 상부 프리미티브를 포함하고, 프리미티브들의 제 2 세트가 하부 프리미티브를 포함한다고 가정한다. 이 예에서, 선점하는 것은 다른 후속 타일이 아니라 (예를 들어, 선점이 발생하기 전에 픽셀 타일 (36) 이 프로세싱된 후의 타일이 아니라) 픽셀 타일 (36) 의 픽셀들의 래스터화 및 셰이딩 후 (예를 들어, GPU (12) 가 픽셀 타일 (36) 의 픽셀들에 대한 픽셀 값들을 생성한 후) 선점하는 것을 포함한다. 예를 들어, 도 3b 에서의 프리미티브들 양자 모두는 드로우 콜의 일부이었을 수도 있지만, 픽셀 타일 (36) 이 프리미티브들의 제 1 세트 (예를 들어, 상부 프리미티브) 의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 프리미티브들의 제 2 세트 (예를 들어, 하부 프리미티브) 의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일 (36) 에 대한 픽셀 값들을 생성한 후에 선점이 발생한다.
도 4 는 본 개시에서 설명된 하나 이상의 예들에 따른 그래픽스 프로세싱 파이프라인의 일 예를 구현할 수도 있는 그래픽스 프로세싱 유닛 (GPU) 의 일 예를 예시하는 블록 다이어그램이다. 그래픽스 동작들을 수행하기 위해, GPU (12) 는 그래픽스 프로세싱 파이프라인을 구현할 수도 있다. 그래픽스 프로세싱 파이프라인은 GPU (12) 상에서 실행하는 소프트웨어 또는 펌웨어에 의해 정의된 기능들을 수행하는 것 및 매우 구체적인 기능들을 수행하도록 하드와이어링되는 고정-기능 유닛들에 의해 기능들을 수행하는 것을 포함한다. GPU (12) 상에서 실행하는 소프트웨어 또는 펌웨어는 셰이더들로 지칭될 수도 있고, 셰이더들은 GPU (12) 의 하나 이상의 셰이더 코어들 상에서 실행할 수도 있다. 셰이더들은 사용자가 임의의 생각할 수 있는 방식으로 원하는 태스크들을 수행하도록 셰이더들을 설계할 수 있기 때문에 기능적 플렉서빌리티를 사용자들에게 제공한다. 그러나, 고정-기능 유닛들은, 고정-기능 유닛들이 태스크들을 수행하는 방식을 위해 하드와이어링된다. 이에 따라, 고정-기능 유닛들은 많은 기능적인 플렉서빌리트를 제공하지 않을 수도 있다.
이 예에서, GPU (12) 는 입력 어셈블러 스테이지 (38), 버텍스 셰이더 스테이지 (40), 래스터라이저 스테이지 (42), 픽셀 셰이더 스테이지 (44), 및 출력 병합 스테이지 (46) 중 하나 이상을 포함할 수도 있다. GPU (12) 는 버텍스 셰이더 스테이지 다음에 추가적인 스테이지들, 이를 테면 헐 셰이더 스테이지, 테셀레이션 스테이지, 도메인 셰이더 스테이지를 그 순서로 포함할 수도 있다. GPU (12) 는 또한, GPU 가 도메인 셰이더 스테이지를 포함하면, 도메인 셰이더 스테이지의 출력부, 또는 어떤 도메인 셰이더 스테이지도 없다면 버텍스 셰이더 스테이지 (40) 의 출력부에 커플링되는 지오메트리 셰이더 스테이지를 포함할 수도 있다. 래스터라이저 스테이지 (42) 는 예시한 바와 같이, 버텍스 셰이더 스테이지 (40) 로부터, 또는 지오메트리 셰이더 스테이지 (이용가능한 경우) 또는 도메인 셰이더 스테이지 (이용가능한 경우) 로부터 그래픽스 데이터를 수신할 수도 있다.
그래픽스 파이프라인의 다른 구성들이 가능하고, 본 개시에서 설명된 기법들은 도 4 에 예시된 특정 예에 제한되는 것으로 간주되어서는 안된다. 예를 들어, GPU (12) 는 예시한 것보다 더 많은 스테이지들을 포함할 수도 있고, 일부 예들에서, GPU (12) 는 예시된 스테이지들의 전부를 반드시 포함하는 것은 아닐 수도 있다. 또한, 스테이지들의 특정 순서화는 예시의 목적들을 위해 제공되고 제한하는 것으로 간주되어서는 안된다.
입력 어셈블러 스테이지 (38) 는 CPU (6) 에 의해 정의된 바와 같은 시스템 메모리 (10) 로부터 버텍스들의 버텍스 포인트들을 판독하고, 버텍스들을 형성하기 위해 제어 포인트들을 어셈블링할 수도 있다. 예를 들어, 입력 어셈블러 스테이지 (38) 는 좌표들, 컬러 값들, 및 다른 이러한 정보를 판독할 수도 있다. 좌표, 컬러 값들, 및 다른 이러한 정보는 버텍스들의 속성들로 통칭될 수도 있다. 버텍스들의 속성들에 기초하여, 입력 어셈블러 스테이지 (38) 는 프리미티브들의 일반적인 레이아웃을 결정할 수도 있다. 이 방식으로, 입력 어셈블러 스테이지 (38) 는 패치를 형성하기 위해 제어 포인트들을 어셈블링할 수도 있다. 입력 어셈블러 스테이지 (38) 는 고정-기능 유닛일 수도 있다.
버텍스 셰이더 스테이지 (40) 는 입력 어셈블러 스테이지 (38) 로부터의 버텍스들을 프로세싱할 수도 있다. 예를 들어, 버텍스 셰이더 스테이지 (40) 는 변환들, 스키닝, 모핑 (morphing), 및 프리-버텍스 라이팅과 같은 버텍스-당 동작들을 수행할 수도 있다. 버텍스 셰이더 스테이지 (40) 는 셰이더일 수도 있다.
래스터라이저 스테이지 (42) 는 버텍스 셰이더 스테이지 (40) 로부터 프리미티브들을 수신하고 프리미티브들을 디스플레이를 위해 픽셀들로 컨버팅한다. 예를 들어, 프리미티브들은 프리미티브들의 인터커넥션을 표시하는 벡터들로서 정의될 수도 있고, 이미지가 디스플레이되어야 하는 디스플레이에 독립적인 좌표 공간에서 정의될 수도 있다. 래스터라이저 스테이지 (42) 는 이들 벡터들을 디스플레이 좌표들로 컨버팅하고 가려지는 프리미티브들 내의 포인트들을 제거하는 것과 같은 임의의 추가적인 기능들을 수행한다.
픽셀 셰이더 스테이지 (44) 는 래스터라이저 스테이지 (42) 에 의해 출력된 픽셀들을 수신하고 디스플레이되어야 하는 픽셀들의 각각에 컬러 값들을 할당하기 위해 포스트 프로세싱을 수행한다. 예를 들어, 픽셀 셰이더 스테이지 (44) 는 시스템 메모리 (10) 에 저장된 상수값들, 시스템 메모리 (10) 에 저장된 텍스처 데이터, 및 임의의 다른 데이터를 수신하여 컬러 값들과 같은 픽셀-당 출력들을 생성할 수도 있다. 픽셀 셰이더 스테이지 (44) 는 또한, 픽셀들의 불투명성을 표시하는 불투명도 값들을 출력할 수도 있다.
출력 병합 스테이지 (46) 는 임의의 최종 픽셀 프로세싱을 수행할 수도 있다. 예를 들어, 출력 병합 스테이지 (46) 는 픽셀들 중 어떤 픽셀이 디스플레이되는 것으로부터 제거되어야 하는지를 추가로 결정하기 위해 심도 정보를 활용할 수도 있다. 출력 병합 스테이지 (46) 는 또한, 최종 픽셀 값들을 생성하기 위해 블렌딩 동작들을 수행할 수도 있다. 출력 병합 스테이지 (46) 는 일반적으로 시스템 메모리 (10) 내에 로케이트되지만, GPU (12) 내에 로케이트될 수도 있는, 프레임 버퍼로 최종 픽셀 값들을 출력할 수도 있다.
도 4 에 예시된 예에서, 스테이지들의 각각의 하나는 GPU (12) 의 로컬 메모리 (14) 로부터 데이터를 수신하고, 그 로컬 메모리 (14) 로 데이터를 출력한다. 로컬 메모리의 다른 예들이 로컬 메모리 (14) 에 더하여 또는 그 대신에 존재한다. 하나의 예로서, 스테이지들은 범용 레지스터들 (GPR들) 로 데이터를 출력하고 이로부터 데이터를 수신할 수도 있다. 로컬 메모리 (14) 와 달리, GPR들의 각각은 스테이지의 각각에 대한 메모리인 것보다는, 특정 스테이지들로부터 수신하고 특정 스테이지들로 출력하도록 구성될 수도 있다. GPR들은 GPU (12) 의 로컬 메모리의 다른 예이다.
GPU (12) 의 로컬 메모리 (14) 는 개별의 스테이지들에 의해 생성된 중간 데이터를 수신하고 그 중간 데이터를 추가 프로세싱을 위해 다음 스테이지로 출력한다. 예를 들어, 입력 어셈블러 스테이지 (38) 는 로컬 메모리 (14) 로부터 그래픽스 데이터를 수신하고, 그래픽스 데이터에 대해 그래픽스 프로세싱을 수행하고 입력 어셈블러 스테이지 (38) 가 로컬 메모리 (14) 에 저장하는 제 1 중간 데이터를 생성한다. 버텍스 셰이더 스테이지 (40) 는 로컬 메모리 (14) 로부터 이 제 1 중간 데이터를 수신하고, 이 취출된 중간 데이터에 대해 그래픽스 프로세싱을 수행하고 제 2 중간 데이터를 생성한다.
정상 동작에서 (예를 들어, 어떤 선점 통지도 없는 경우), 래스터라이저 스테이지 (42) 는 로컬 메모리 (14) 로부터 이 제 2 중간 데이터를 수신하고, 제 2 중간 데이터에 대해 그래픽스 프로세싱을 수행하고 래스터라이저 스테이지 (42) 가 로컬 메모리 (14) 에 저장하는 제 3 중간 데이터를 생성한다. 출력 병합 스테이지 (46) 는 로컬 메모리 (14) 로부터 제 3 중간 데이터를 수신하고, 제 3 중간 데이터에 대해 그래픽스 프로세싱을 수행하고 출력 병합 스테이지 (46) 가 시스템 메모리 (10) 에 또는 가능하게는 로컬 메모리 (14) (또는 양자의 조합) 내에 저장하는 최종 픽셀 값들을 생성한다.
버텍스 셰이더 스테이지 (40) 와 래스터라이저 스테이지 (42) 사이에 더 많은 스테이지들이 있는 예들에서, (예를 들어, 헐 셰이더 스테이지, 도메인 셰이더 스테이지, 및 지오메트리 셰이더 스테이지 중 하나 이상과 같은) 스테이지들 사이에 이들에 대한 로컬 메모리 (14) 에 대한 더 많은 커넥션들이 존재할 수도 있다. 버텍스 셰이더 스테이지 (40) 부터 래스터라이저 스테이지 (42) 까지, 그러나 래스터라이저 스테이지 (42) 를 포함하지 않는 다양한 스테이지들이 지오메트리 파이프라인으로 통칭될 수도 있다. 본 개시에서 설명된 기법들에서, 선점 통지에 응답하여, 제어기 (32) 는 지오메트리 파이프라인의 출력부 (예를 들어, 도 4 의 예에서는 버텍스 셰이더 스테이지 (40)) 가 시스템 메모리 (10) 로 스트림 출력 (예를 들어, 출력) 되도록 예시된 파이프라인을 구성할 수도 있다.
예시한 바와 같이, GPU (12) 는 GPU (12) 의 하드웨어 유닛인 스트림 출력 유닛 (41) 을 포함한다. 스트림 출력 유닛 (41) 은 로컬 메모리 (14) 로부터의 데이터, 특히, 지오메트리 파이프라인에 의해 생성된 데이터를 수신하고, 그 데이터를 시스템 메모리 (10) 로 출력하도록 구성될 수도 있다. 스트림 출력 유닛 (41) 은 또한, 반대로 시스템 메모리 (10) 로부터 데이터를 수신하고 데이터를 로컬 메모리 (14) 에 저장하도록 (예를 들어, 선점이 완료하고 원래의 명령들이 실행된 후에) 구성될 수도 있다. 이에 따라, 스트림 출력 유닛 (41) 은 GPU (12) 가 중간 데이터 (예를 들어, 지오메트리 파이프라인에 의해 생성된 데이터) 를 시스템 메모리 (10) 로 출력하게 하고 이 중간 데이터를 시스템 메모리 (10) 로부터 취출하게 하는 전문화된 방식을 제공한다.
일부 기법들에서, 스트림 출력 유닛 (41) 은 중간 데이터를 수신하는 특정 목적을 위해 이용된다. 그러나, 이들 기법들에서, 스트림 출력 유닛 (41) 이 중간 데이터를 시스템 메모리 (10) 로 출력했는지 여부는 임의의 실행 이전에 결정되어야 할 수도 있다. 예를 들어, 스트림 출력 유닛 (41) 이 중간 데이터를 출력한다면, GPU (12) 의 그래픽스 파이프라인은 제 1 구성에 있고, 스트림 출력 유닛 (41) 이 중간 데이터를 출력하지 않는다면, GPU (12) 의 그래픽스 파이프라인은 제 2 구성이다. 그래픽스 파이프라인이 제 1 구성에 있든 제 2 구성에 있든, GPU (12) 는 커맨드들의 실행 이전에 구성을 설정해야 할 수도 있다.
그러나, 본 개시에서 설명된 기법들에서, 제어기 (32) 는 커맨드들의 실행 동안에, 제어기 (32) 가 제 1 구성 또는 제 2 구성에서 그래픽스 파이프라인을 구성할 수 있도록 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성할 수도 있다. 예를 들어, 선점 통지에 응답하여, 제어기 (32) 는 래스터라이저 스테이지 (42) 에 접속하는 로컬 메모리 (14) 의 출력부를 접속해제하고 로컬 메모리 (14) 의 출력부를 스트림 출력 유닛 (41) 에 접속할 수도 있다. 예를 들어, GPU (12) 는 드로우 콜을 수신하는 것에 응답하여 도 4 에 예시된 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행할 수도 있다. 드로우 콜은 커맨드들의 제 1 세트에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의한다. 예시한 바와 같이, 그래픽스 파이프라인은 GPU (12) 의 로컬 메모리 (14) 에 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들에 의해 생성된 데이터를 저장하도록 구성된다.
제어기 (32) 는 그 후 커맨드들의 제 1 세트의 실행 동안 선점 통지를 수신할 수도 있다. 선점 통지를 수신하는 것에 응답하여, 제어기 (32) 는 커맨드들의 제 1 세트의 실행 동안, GPU (12) 의 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지 (예를 들어, 래스터라이저 스테이지 (42)) 로부터 GPU (12) 의 로컬 메모리 (14) 의 출력부를 접속해제하고 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터 (예를 들어, 버텍스 셰이더 스테이지 (40) 또는 더 일반적으로는 지오메트리 파이프라인에 의해 생성된 중간 데이터) 를 GPU (12) 외부에 있는 메모리 (예를 들어, 시스템 메모리 (10)) 로 출력하기 위해 하드웨어 스트림 출력 유닛 (41) 에 로컬 메모리의 출력부를 접속할 수도 있다. GPU (12) 는 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU (12) 외부에 있는 메모리 (예를 들어, 시스템 메모리 (10)) 로 중간 데이터를 출력할 수도 있다. 이에 따라, 제어기 (32) 는 픽셀 타일 레벨 입도에서 선점을 수행하기 위해, 컴퓨트 셰이더들 같은 소프트웨어에 의존하는 것보다는, 선점을 수행하기 위해 GPU (12) 의 하드웨어 능력들을 레버리징할 수도 있다.
정상 동작에서, 제어기 (32) 는 래스터라이저 스테이지 (42) 가 지오메트리 파이프라인 (예를 들어, 이 예에서는 버텍스 셰이더 스테이지 (40)) 에 의해 생성된 중간 데이터를 수신하도록 스위치 (S2) 를 닫힌 상태로 유지하고 스위치 (S1) 를 열린 상태로 유지할 수도 있다. 예를 들어, 래스터라이저 스테이지 (42) 는 선점 통지를 수신하기 이전에 래스터라이저 스테이지 (42) 에 의한 프로세싱을 위해 로컬 메모리로부터 중간 데이터를 수신할 수도 있다. 그 후, 선점 통지에 응답하여, 제어기 (32) 는 지오메트리 파이프라인이 생성하는 임의의 데이터가 스트림 출력 유닛 (41) 을 통해 시스템 메모리 (10) 로 스트림 출력하도록 스위치 (S2) 를 열고 스위치 (S1) 를 닫을 수도 있다. 이렇게 하여, 제어기 (32) 는 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성한다 (예를 들어, 지오메트리 파이프라인과 다음 스테이지 사이의 기존의 커넥션은 깨지고 지오메트리 파이프라인은 이제 상이한 스테이지로 출력한다). 도 4 에서, 제어기 (32) 는 단지 선점 통지를 수신하는 것에 응답하여, 스트림 출력 유닛 (41) 이 셰이더 (예를 들어, 도 4 의 버텍스 셰이더 스테이지 (40) 와 같은 지오메트리 파이프라인에서의 마지막 셰이더) 에 의해 생성된 중간 데이터를 GPU (12) 외부에 있는 메모리 (예를 들어, 시스템 메모리 (10)) 로 출력하도록 그래픽스 파이프라인을 구성할 수도 있다. 스트림 출력 유닛 (41) 은 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 중간 데이터를 시스템 메모리 (10) 로 출력하도록 구성된다.
제어기 (32) 는 그 후 하나 이상의 프리미티브들을 렌더링하기 위해 커맨드들의 제 1 세트의 실행을 중단하고, 그래픽스 파이프라인을 통해 커맨드들의 제 2 세트가 실행되는 것을 허용할 수도 있다. 이렇게 하여, 제어기 (32) 는 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점할 수도 있다. 커맨드들의 제 2 세트의 실행에 후속하여, 제어기 (32) 는 GPU (12) 로 하여금 커맨드들의 제 1 세트의 실행을 재개하게 할 수도 있다.
본 개시에서, GPU (12) 는 드로우 콜의 모든 프리미티브들이 렌더링될 때 드로우 콜 경계에 도달한다. GPU (12) 가 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위해 커맨드들의 제 1 세트의 실행을 완료하기 이전에 선점하는 것이 가능하기 때문에, GPU (12) 는 드로우 콜 경계들 이전에 선점한다.
일부 예들에서, 드로우 콜 경계들 이전에 선점하는데 있어서, GPU (12) 는 중간-프리미티브를 선점하도록 구성될 수도 있다. 설명한 바와 같이, GPU (12) 는 선점을 위해 픽셀 타일 레벨 입도를 제공한다. 예를 들어, 실행 동안, 래스터라이저 스테이지 (42) 는 픽셀 타일의 하나 이상의 픽셀들에 대해 로컬 메모리 (14) 로부터 중간 데이터를 취출한다. 픽셀 타일은 프리미티브의 하나 이상의 픽셀들을 포함하고, 일반적으로 프리미티브보다 더 작다.
제어기 (32) 가 스위치 (S2) 를 연 후에, 래스터라이저 스테이지 (42) 는 임의의 더 많은 중간 데이터를 취출하는 것이 불가능하다. 이에 따라, 래스터라이저 스테이지 (42) 는 현재의 픽셀 타일을 프로세싱하는 것을 완료할 수도 있고, 픽셀 셰이더 스테이지 (44) 는 현재의 픽셀 타일의 픽셀들을 프로세싱할 수도 있고, 출력 병합 스테이지 (46) 는 현재의 픽셀 타일의 픽셀들을 프로세싱할 수도 있다. 그 후, 이들 스테이지들의 각각은 플러시 (즉, 현재 어떤 데이터도 프로세싱하지 않음) 되는 것으로 간주될 수도 있고 커맨드들의 제 2 세트 (예를 들어, 커맨드들의 제 1 세트가 선점된 더 높은 우선순위의 커맨드들) 에 대해 동작하는 것이 가능하다. 이 예에서, 선점하는 것은 프로세싱되어야 하는 드로우 콜의 프리미티브에 더 많은 타일들이 있다 하더라도 다른 후속 픽셀 타일이 아니라 픽셀 타일을 래스터화 및 셰이딩한 후 (예를 들어, 래스터라이저 스테이지 (42) 및 픽셀 셰이더 스테이지 (44) 가 픽셀 타일에 대해 개별의 기능들을 수행한 후) 선점하는 것을 포함한다. 이렇게 하여, GPU (12) 는 프리미티브에 더 많은 픽셀 타일들이 있다면 현재 픽셀 타일의 프로세싱을 완료한 후에 선점하는 메커니즘을 제공한다 (예를 들어, 선점을 위한 픽셀 타일 입도에 대한 메커니즘을 제공한다).
그래픽스 파이프라인에서 래스터라이저 스테이지 (42) 앞에 있는 컴포넌트들에 대해, 이들 스테이지들이 선점 통지를 수신한 후에 생성하는 임의의 데이터는 스트림 출력 유닛 (41) 을 통해 시스템 메모리 (10) 로 스트림 출력된다. 예를 들어, 제어기 (32) 는 버텍스 셰이더 스테이지 (40) (및 지오메트리 파이프라인에서의 임의의 다른 스테이지들) 가 이들 스테이지들에서 임의의 데이터의 프로세싱을 완료하고 결과의 중간 데이터를 시스템 메모리 (10) 로 출력하는 것을 허용할 수도 있다. 이렇게 하여, 제어기 (32) 는 지오메트리 파이프라인에서의 스테이지들을 플러시한다.
지오메트리 파이프라인의 스테이지들 및 래스터라이저 스테이지 (42) 다음의 그리고 래스터라이저 스테이지 (42) 를 포함하는 스테이지들을 플러시하는 것에 더하여, 제어기 (32) 는 커맨드들의 제 1 세트의 커맨드들의 실행을 중단할 수도 있다. 예를 들어, 제어기 (32) 는 입력 어셈블러 스테이지 (38) 가 임의의 더 많은 프리미티브들을 어셈블링하는 것을 중단하고 커맨드들의 제 1 세트의 커맨드들을 버텍스 셰이더 스테이지 (40) 에 이슈하는 것을 중단할 수도 있다. 절대 출력되지 않은 드로우 콜의 하나 이상의 프리미티브들에 대한 임의의 나머지 데이터가 있다면, 제어기 (32) 는 커맨드들의 제 1 세트가 실행을 완료할 때, 커맨드들의 제 2 세트의 실행의 완료 후에 시스템 메모리 (10) 에 그 데이터에 대한 콘텍스트 값들을 저장할 수도 있다.
콘텍스트 값들은 GPU (12) 가 선점 후에 커맨드들의 실행을 재개하는 방법을 결정하기 위해 이용할 수 있는 값들을 지칭한다. 콘텍스트 값들의 예들은, GPU (12) 가 커맨드들의 제 1 세트의 실행을 선점했을 때에 GPU (12) 가 있었던 것과 동일한 상태에 GPU (12) 가 그 스스로를 배치하기 위해 이용할 수 있는 로케이션 정보, 속성 정보, (예를 들어, 선점이 발생한 커맨드에서의) 커맨드 스트림 정보, GPU 의 상태 정보 (예를 들어, 플립-플롭들의 포지션), 레지스터들 내의 값들 등을 포함한다. 본 개시에서, 다량의 메모리를 요구할 수도 있는, 드로우 콜에 응답하여 프리미티브들의 전부에 대한 콘텍스트 값들의 전부를 저장하는 것보다는, GPU (12) 는 (예를 들어, 단지 출력되지 않은 중간 데이터를 가진 그 프리미티브들에 대한) 제한된 양의 콘텍스트 값들을 저장할 수도 있다.
예를 들어, 선점 통지에 응답하여, 제어기 (32) 는 중간 데이터를 스트림 출력하기 위해 스위치 (S2) 를 열고 스위치 (S1) 를 닫고, 모든 스테이지들이 선점 통지가 수신된 시간에서 현재 실행되고 있는 커맨드들의 제 1 세트의 임의의 커맨드들의 실행을 완료하는 것을 허용한다. 제어기 (32) 는 그 후 커맨드들의 제 2 세트가 완료까지 실행하는 것을 허용한다 (즉, 제어기 (32) 는 커맨드들의 제 2 세트의 마지막 커맨드가 완료되는 것을 허용한다).
커맨드들의 제 2 세트의 실행에 후속하여, 제어기 (32) 는 래스터화 및 픽셀 셰이딩을 위해 시스템 메모리 (10) 로부터 중간 데이터를 취출함으로써 커맨드들의 제 1 세트의 실행을 재개한다. 예를 들어, 커맨드들의 제 1 세트의 실행을 완료하기 위해, 제어기 (32) 는 스위치 (S1) 를 닫고 스위치 (S2) 를 닫는다. 스트림 출력 유닛 (41) 은 선점 통지에 응답하여 시스템 메모리 (10) 에 저장된 시스템 메모리 (10) 로부터의 중간 데이터를 판독하고, 래스터라이저 스테이지 (42) 는 이제 이 중간 데이터를 래스터화하고 픽셀 셰이더 스테이지 (44) 는 래스터라이저 스테이지 (42) 에 의해 생성된 데이터에 픽셀 셰이딩을 적용한다. 추가로, 입력 어셈블러 스테이지 (38) 는 선점 통지가 수신되었을 때 어셈블링되지 않을 수도 있는 저장된 콘텍스트 값들에 기초하여, 드로우 콜의 프리미티브들을 어셈블링한다. 버텍스 셰이더 스테이지 (40) 는 그 후 평소와 같이 이들 프리미티브들 및 그래픽스 파이프라인 기능들을 프로세싱한다 (예를 들어, 제어기 (32) 는 중간 데이터가 시스템 메모리 (10) 에 대신에 로컬로 저장되는 그 정상 상태로 그래픽스 파이프라인을 구성한다).
추가로 이해를 돕기 위해, 다음은 GPU (12) 가 CPU (6) 로부터 드로우 콜을 수신하여 10 프리미티브들을 렌더링하는 경우에 대해 본 개시의 예의 기법들을 설명한다. 이 예는 설명의 용이함을 위해 제공되고 제한하는 것으로 해석되어서는 안된다.
드로우 콜을 수신하는 것에 응답하여, GPU (12) 는 10 프리미티브들을 렌더링하기 위해 커맨드들의 제 1 세트를 실행한다. 입력 어셈블러 스테이지 (38) 는 프리미티브들을 어셈블링하고, 입력 어셈블러 스테이지 (38) 가 프리미티브를 어셈블링하는 것을 완료할 때, 버텍스 셰이더 스테이지 (40) 는 프리미티브의 버텍스들을 프로세싱하기 위해 버텍스 셰이더의 인스턴스화들을 실행한다. 래스터라이저 스테이지 (42) 는 버텍스들을 수신하고 픽셀 타일 단위 기반으로 프로세싱한다.
래스터화 및 픽셀 셰이딩은 미지의 시간이 걸릴 수도 있고, 버텍스 셰이딩보다 더 오래 걸리는 경향이 있기 때문에, 일부 예들에서, 래스터라이저 스테이지 (42) 가 프로세싱하고 있는 프리미티브와 버텍스 셰이더 스테이지 (40) 가 동작하고 있는 프리미티브 사이의 몇몇 프리미티브들의 차이가 존재할 수도 있다. 예를 들어, 10 프리미티브들 중, 버텍스 셰이더 스테이지 (40) 는 프리미티브 8 을 프로세싱하고 있을 수도 있는 한편, 래스터라이저 스테이지 (42) 는 프리미티브 5 의 픽셀 타일에 대해 동작하고 있다.
버텍스 셰이더 스테이지 (40) 가 프리미티브 8 을 프로세싱하고 있고 래스터라이저 스테이지 (42) 가 프리미티브 5 의 복수의 픽셀 타일들 중의 픽셀 타일에 대해 동작하고 있는 동안, 그 제어기 (32) 가 선점 통지를 수신하는 것을 가정한다. 제어기 (32) 는 그 후 스위치 (S2) 를 열고 스위치 (S1) 를 닫는다. 이 경우에, 프리미티브들 1 - 4 는 렌더링되고 그들의 픽셀 값들은 시스템 메모리 (10) 에 저장된다. 버텍스 셰이더 스테이지 (40) 가 프리미티브들 5 - 8 에 대해 생성한 중간 데이터의 전부가 로컬 메모리 (14) 로부터 스트림 출력 유닛 (41) 을 통해 시스템 메모리 (10) 로 스트림 출력된다. 래스터라이저 스테이지 (42) 는 GPU (12) 가 선점 통지를 수신했을 때 래스터라이저 스테이지 (42) 가 프로세싱하고 있었던 프리미티브 5 의 픽셀 타일의 프로세싱을 완료한다. 픽셀 셰이더 스테이지 (44) 및 출력 병합 스테이지 (46) 는 프리미티브 5 의 픽셀 타일에 대해 개별의 프로세스들을 수행한다. 제어기 (32) 는 커맨드들의 제 1 세트의 임의의 것을 GPU (12) 의 그래픽스 파이프라인의 스테이지들 중 임의의 스테이지에 이슈하는 것을 중단한다.
프리미티브들 9 및 10 에 대해, 제어기 (32) 는 커맨드들의 제 1 세트가 선점된 커맨드들의 제 2 세트를 실행하는 것을 GPU (12) 가 완료한 후에 입력 어셈블러 스테이지 (38) 가 이들 프리미티브들을 어셈블링할 수 있도록 그들 콘텍스트 값들을 저장한다. 제어기 (32) 는 또한, GPU (12) 가 커맨드들의 제 1 세트의 나머지 커맨드들을 실행할 때 제어기 (32) 가 스트림 출력 유닛 (41) 으로 하여금 프리미티브 5 의 다음 픽셀 타일을 취출하게 할 수 있도록 어느 픽셀 타일 래스터라이저 스테이지 (42) 가 프로세싱하고 있었는지를 표시하는 정보를 저장할 수도 있다.
상기 설명한 바와 같이, 제어기 (32) 는 지오메트리 파이프라인에 의해 생성된 중간 데이터를 외부 메모리 (예를 들어, 시스템 메모리 (10)) 로 선택적으로 출력하도록 GPU (12) 의 그래픽스 파이프라인을 동적으로 구성한다. 아래에 설명되는 바와 같이, 일부 기법들은, 커맨드들의 실행 이전에, GPU (12) 가 중간 데이터를 시스템 메모리 (10) 로 출력했는지 중간 데이터를 로컬 메모리에 저장된 상태로 유지했는지를 설정했다. 스트림 출력 유닛 (41) 을 로컬 메모리 (14) 에 (예를 들어, 런타임 동안) 동적으로 접속함으로써, 제어기 (32) 는 커맨드들의 제 1 세트의 실행 동안, 본 개시에서 설명된 기법들이 픽셀 타일 레벨 입도로 드로우 콜 경계들 간의 선점을 수행하는 것을 허용하게 하는 그래픽스 파이프라인을 구성한다.
도 5 는 그래픽스 파이프라인의 다른 예를 예시하는 블록 다이어그램이다. 도 5 의 그래픽스 파이프라인은 예를 들어, DX9/Open GL 3.x API 의 그래픽스 파이프라인의 일 예이다. 예를 들어, 도 5 는 입력 어셈블리 스테이지 (38), 버텍스 셰이더 (VS) 스테이지 (40), 및 픽셀 셰이더 (PS) 스테이지 (44) 를 예시한다. 래스터라이저 스테이지 (42) 같은 래스터라이저는 용이함을 위해 예시되지 않는다.
입력 어셈블리 (48) 는 프리미티브들의 좌표들과 같은 그래픽스 데이터를 수신하고, 복수의 프리미티브들 (예를 들어, 삼각형들) 을 구성한다. 버텍스 셰이더 스테이지 (40) 는 프리미티브들의 버텍스들에 대해 동작들을 수행한다. 버텍스 셰이더 스테이지 (40) 는 버텍스 파라미터 캐시 (VPC) 로 때때로 지칭되는, 버텍스 파라미터 메모리 (VPM) 에서 포스트-변환 버텍스 속성들을 출력 (예를 들어, 디포짓) 할 수도 있다. 이 예에서, 포스트-변환 버텍스 속성들은 버텍스 셰이더 스테이지 (40) 가 생성한 중간 데이터이다. VPM 은 GPU 로컬 메모리 (14) 의 일부 (예를 들어, GPU (12) 가 액세스하기 위해 버스 (20) 를 필요로 하지 않는 GPU (12) 의 온-칩 메모리) 일 수도 있다. 픽셀 셰이더 스테이지 (44) 는 VPM 으로부터 포스트-변환 버텍스 속성들을 프로세싱하기 위해 수신한다 (예를 들어, 소비한다).
도 6 은 그래픽스 파이프라인의 다른 예를 예시하는 블록 다이어그램이다. 도 6 의 그래픽스 파이프라인은 예를 들어, DX10/11/Open GL. 4.x API 의 그래픽스 파이프라인의 일 예이다. 도 6 은 입력 어셈블리 스테이지 (38), 버텍스 셰이더 스테이지 (40), 및 픽셀 셰이더 스테이지 (44) 를 예시한다. 예시한 바와 같이, 도 6 에서, 버텍스 셰이더 스테이지 (40) 는 모든 포스트-변환 버텍스 속성들을 외부 메모리 (10) 로 스트림 출력할 수도 있다. 픽셀 셰이더 스테이지 (44) 는 분리되어, 메모리 (10) 로부터 포스트-변환 버텍스 속성들을 소비한다 (예를 들어, 프로세싱하기 위해 수신한다).
도 5 및 도 6 에 예시된 예들에서, 선점은 모든 상태 변수들을 저장하고 특정한 포지션으로부터 다시 시작함으로써 발생할 수도 있다. 예를 들어, 도 5 및 도 6 에서, 선점은 드로우 콜 경계들에서 단지 발생할 수도 있다. 도 5 및 도 6 에 대하여, 선점은 픽셀/프래그먼트 셰이더 스테이지가 완료되지 않는 한 일어날 수 없고, 이는 기본적으로 드로우콜 경계이다.
본 개시에서 설명된 기법들에서, GPU (12) 는 선점에 기초하여 지오메트리 파이프라인으로부터 생성된 중간 데이터를 시스템 메모리 (10) 로 선택적으로 출력할 수도 있다. 이런 의미에서, GPU (12) 는 선점에 기초하여 "DX9" 스타일 (예를 들어, 도 5) 과 "DX11" 스타일 (예를 들어, 도 6) 버텍스 출력 스트림 출력 (예를 들어, 버텍스 정보가 출력되는 방식) 사이에 동적으로 선정할 수도 있다.
선점을 위해, GPU (12) 는 그래픽스 파이프라인에서의 프리미티브들에 대한 데이터 저장을 위해 메모리 (10) 를 이용하고, 픽셀 (예를 들어, 타일) 생성을 중단하고, 모든 버텍스 스테이지들을 플러시하지만, 그 대신 그들을 메모리 (10) 로 동적으로 디렉션한다. 예를 들어, 스테이지는 사용자/API 에 의한 선불 (upfront) 대신에 선점을 지원하도록 GPU (12) 에 의해 동적으로 결정되는 것을 제외하고는 DX10 의 스트림출력 피처 (예를 들어, 스트림 출력 유닛 (41)) 와 유사하다. 재개 시에, GPU (12) 는 래스터라이저 스테이지 (42) 에 의한 프로세싱을 위해 시스템 메모리 (10) 로부터 포스트 변환 버텍스 속성들을 수신한다.
도 7 은 데이터를 프로세싱하는 일 예의 방법을 예시하는 플로우차트이다. 예시한 바와 같이, GPU (12) 는 드로우 콜을 수신하는 것에 응답하여 GPU (12) 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행할 수도 있다 (50). 드로우 콜은 커맨드들의 제 1 세트에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하고, 그래픽스 파이프라인은 GPU (12) 의 로컬 메모리에 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들에 의해 생성된 데이터를 저장하도록 구성된다. GPU (12) 는 커맨드들의 제 1 세트의 실행 동안 그리고 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신한다 (52).
선점 통지를 수신하는 것에 응답하여, GPU (12) 는 커맨드들의 제 1 세트의 실행 동안 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 그래픽스 파이프라인의 스테이지로부터 GPU (12) 의 로컬 메모리의 출력부를 접속해제하고 GPU (12) 의 로컬 메모리의 출력부를 GPU (12) 의 하드웨어 스트림 출력 유닛 (41) 에 접속할 수도 있다 (54). GPU (12) 는 스트림 출력 유닛 (41) 으로부터, 커맨드들의 제 1 세트의 실행 동안, GPU (12) 의 그래픽스 파이프라인의 스테이지들의 인터커넥션의 동적 구성으로 인해 GPU 외부에 있는 메모리로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력할 수도 있다 (56). 예를 들어, 제어기 (32) 는 시스템 메모리 (10) 로 중간 데이터를 출력하기 위하여, 커맨드들의 제 1 세트의 실행 동안, GPU (12) 의 그래픽스 파이프라인을 동적으로 구성하기 위해 래스터라이저 스테이지 (42) 로부터 로컬 메모리 (14) 의 출력부를 접속해제하고 시스템 메모리 (10) 로 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 지오메트리 파이프라인에 의해 생성된 중간 데이터를 출력하기 위해 로컬 메모리 (14) 의 출력부를 스트림 출력 유닛 (41) 에 접속할 수도 있다.
예를 들어, 정상 동작 동안, 스테이지 (예를 들어, 래스터라이저 스테이지 (42)) 는 선점 통지를 수신하기 이전에 스테이지에 의한 프로세싱을 위해 로컬 메모리로부터 중간 데이터를 수신한다. 그 후, 단지 선점 통지를 수신하는 것에 응답하여, GPU (12) 는, 스트림 출력 유닛 (41) 을 통해, 셰이더 (예를 들어, 버텍스 셰이더 스테이지 (40)) 에 의해 생성된 중간 데이터를 GPU (12) 외부에 있는 메모리 (예를 들어, 시스템 메모리 (10)) 로 출력한다. 제어기 (32) 는 그 후 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 중단한다.
GPU (12) 는 커맨드들의 제 2 세트를 실행하기 위해, 드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, 커맨드들의 제 1 세트의 실행을 선점할 수도 있다 (58). GPU (12) 는 그 후 커맨드들의 제 2 세트를 실행할 수도 있다 (60). 커맨드들의 제 2 세트의 실행에 후속하여, GPU (12) 는, 일 예로서 스트림 출력 유닛 (41) 을 통해, 래스터라이저 스테이지 (42) 에 의해 래스터화하고 픽셀 셰이더 스테이지 (44) 에 의해 픽셀 셰이딩하기 위해 GPU (12) 외부에 있는 메모리 (예를 들어, 시스템 메모리 (10)) 로부터 중간 데이터를 취출함으로써 커맨드들의 제 1 세트의 실행을 재개한다.
드로우 콜의 하나 이상의 프리미티브들을 렌더링하기 위한 커맨드들의 제 1 세트의 실행을 완료하기 이전에, GPU (12) 는 커맨드들의 제 1 세트의 실행을 선점할 수도 있기 때문에, GPU (12) 는 드로우 콜 경계들에 도달하기 이전에 선점할 수도 있다. 예를 들어, 드로우 콜의 하나 이상의 프리미티브들이 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함한다는 것을 가정한다. 이 예에서, 선점하는 것은 (예를 들어, 선점을 위해 픽셀 타일 레벨 입도를 제공하기 위해) 다른 후속 픽셀 타일이 아니라 픽셀 타일을 래스터라이저 스테이지 (42) 로 래스터화하고 픽셀 셰이더 스테이지 (44) 로 픽셀 셰이딩한 후에 선점하는 것을 포함한다. 설명한 바와 같이, 래스터화 및 픽셀 셰이딩은 그래픽스 파이프라인의 2 개의 스테이지들 (예를 들어, 그래픽스 파이프라인의, 각각, 래스터라이저 스테이지 (42) 및 픽셀 셰이더 스테이지 (44)) 에 의해 수행된 기능들을 포함한다.
이 예에서, 픽셀 타일은 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는다. 따라서, 프리미티브들의 제 2 세트의 프리미티브들, 및 심지어 프리미티브들의 제 1 세트 내의 픽셀 타일들도 렌더링되어야 할 수도 있지만, GPU (12) 는 드로우 콜 경계 또는 막대한 양의 콘텍스트 값들을 저장하는 것을 대기하기 보다는, 픽셀 타일의 프로세싱 후에 선점하는 것이 가능하다.
본 개시에서 설명된 기법들은 하드웨어, 소프트웨어, 펌웨어 또는 그 임의의 조합으로 적어도 부분적으로 구현될 수도 있다. 예를 들어, 설명된 기법들의 다양한 양태들은 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서들 (DSP들), 주문형 집적 회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 또는 임의의 다른 등가의 집적 또는 이산 로직 회로부를 포함하는 하나 이상의 프로세서들, 뿐만 아니라 이러한 컴포넌트들의 임의의 조합들 내에 구현될 수도 있다. 용어 "프로세서" 또는 "프로세싱 회로부" 는 일반적으로, 전술한 로직 회로부, 단독으로 또는 다른 로직 회로부와 함께, 또는 프로세싱을 수행하는 이산 하드웨어와 같은 임의의 다른 등가의 회로부 중 임의의 것을 지칭할 수도 있다.
이러한 하드웨어, 소프트웨어, 및 펌웨어는 본 개시에서 설명된 다양한 동작들 및 기능들을 지원하도록 동일한 디바이스 내에 또는 별도의 디바이스들 내에 구현될 수도 있다. 추가로, 설명된 유닛들, 모듈들 또는 컴포넌트들 중 임의의 것은 별개이지만 상호동작가능한 로직 디바이스들로서 함께 또는 별도로 구현될 수도 있다. 모듈들 또는 유닛들로서의 상이한 피처들의 서술은 상이한 기능적 양태들을 강조하도록 의도되고 이러한 모듈들 또는 유닛들이 별도의 하드웨어 또는 소프트웨어 컴포넌트들에 의해 실현되어야 하는 것을 반드시 의미하는 것은 아니다. 오히려, 하나 이상의 모듈들 또는 유닛들과 연관된 기능성은 별도의 하드웨어, 펌웨어 및/또는 소프트웨어 컴포넌트들에 의해 수행되거나, 또는 공통 또는 별도의 하드웨어 또는 소프트웨어 컴포넌트들 내에 통합될 수도 있다.
본 개시에서 설명된 기법들은 또한 명령들을 저장하는 컴퓨터 판독가능 저장 매체와 같은, 컴퓨터 판독가능 매체에 저장, 수록 또는 인코딩될 수도 있다. 컴퓨터 판독가능 매체에 수록 또는 인코딩된 명령들은, 예를 들어, 명령들이 하나 이상의 프로세서들에 의해 실행될 때, 하나 이상의 프로세서들로 하여금, 본 명세서에서 설명된 기법들을 수행하게 할 수도 있다. 컴퓨터 판독가능 저장 매체들은 랜덤 액세스 메모리 (RAM), 판독 전용 메모리 (ROM), 프로그래밍가능 판독 전용 메모리 (PROM), 소거가능한 프로그래밍가능 판독 전용 메모리 (EPROM), 전기적으로 소거가능한 프로그래밍가능 판독 전용 메모리 (EEPROM), 플래시 메모리, 하드 디스크, CD-ROM, 플로피 디스크, 카세트, 자기 매체들, 광학 매체들, 또는 유형인 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
다양한 양태들 및 예들이 설명되었다. 그러나, 다음의 청구항들의 범위로부터 벗어남 없이 본 개시의 구조 또는 기법들에 변경들이 행해질 수 있다.

Claims (25)

  1. 데이터를 프로세싱하는 방법으로서,
    그래픽스 프로세싱 유닛 (GPU) 으로, 드로우 콜 (draw call) 을 수신하는 것에 응답하여 상기 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하는 단계로서, 상기 드로우 콜은 상기 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하는 단계;
    상기 GPU 로, 상기 커맨드들의 제 1 세트의 실행 동안 그리고 상기 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지 (preemption notification) 를 수신하는 단계;
    상기 선점 통지를 수신하는 것에 응답하여, 상기 커맨드들의 제 1 세트의 실행 동안 상기 그래픽스 파이프라인의 스테이지들의 인터커넥션 (interconnection) 을 동적으로 구성하기 위해 상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하고 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 상기 GPU 의 하드웨어 스트림 출력 유닛에 접속하는 단계;
    상기 하드웨어 스트림 출력 유닛으로부터, 상기 커맨드들의 제 1 세트의 실행 동안, 상기 GPU 의 상기 그래픽스 파이프라인의 스테이지들의 상기 인터커넥션의 상기 동적 구성으로 인해 상기 GPU 외부에 있는 메모리로 상기 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하는 단계;
    상기 GPU 로, 커맨드들의 제 2 세트를 실행하기 위해, 상기 드로우 콜의 상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 상기 실행을 완료하기 이전에, 상기 커맨드들의 제 1 세트의 상기 실행을 선점하는 단계; 및
    상기 커맨드들의 제 2 세트를 실행하는 단계
    를 포함하는, 데이터를 프로세싱하는 방법.
  2. 제 1 항에 있어서,
    상기 하나 이상의 프리미티브들은 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함하고, 선점하는 단계는, 다른 후속 픽셀 타일이 아니라, 상기 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 상기 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일을 래스터화 및 픽셀 셰이딩한 후에 선점하는 단계를 포함하고, 래스터화 및 픽셀 셰이딩은 상기 그래픽스 파이프라인의 2 개의 스테이지들에 의해 수행된 기능들을 포함하는, 데이터를 프로세싱하는 방법.
  3. 제 1 항에 있어서,
    선점하는 단계는 드로우 콜 경계들에 도달하기 이전에 선점하는 단계를 포함하는, 데이터를 프로세싱하는 방법.
  4. 제 1 항에 있어서,
    상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하는 단계는,
    래스터라이저 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 접속해제하는 단계를 포함하는, 데이터를 프로세싱하는 방법.
  5. 제 1 항에 있어서,
    단지 상기 선점 통지를 수신하는 것에 응답하여, 상기 GPU 외부에 있는 상기 메모리로 셰이더에 의해 생성된 중간 데이터를 출력하는 단계; 및
    상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 실행을 중단하는 단계
    를 더 포함하는, 데이터를 프로세싱하는 방법.
  6. 제 1 항에 있어서,
    상기 커맨드들의 제 2 세트의 실행에 후속하여, 래스터화 및 픽셀 셰이딩을 위해 상기 GPU 외부에 있는 상기 메모리로부터 상기 중간 데이터를 취출함으로써 상기 커맨드들의 제 1 세트의 실행을 재개하는 단계를 더 포함하는, 데이터를 프로세싱하는 방법.
  7. 제 1 항에 있어서,
    상기 스테이지로, 상기 선점 통지를 수신하기 이전에 상기 스테이지에 의한 프로세싱을 위해 상기 로컬 메모리로부터 상기 중간 데이터를 수신하는 단계를 더 포함하는, 데이터를 프로세싱하는 방법.
  8. 데이터를 프로세싱하기 위한 디바이스로서,
    시스템 메모리; 및
    그래픽스 프로세싱 유닛 (GPU)
    을 포함하고,
    상기 GPU 는, 하드웨어 스트림 출력 유닛 및 로컬 메모리를 포함하고, 상기 GPU 는,
    드로우 콜을 수신하는 것에 응답하여 상기 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하는 것으로서, 상기 드로우 콜은 상기 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하고;
    상기 커맨드들의 제 1 세트의 실행 동안 그리고 상기 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하고;
    상기 선점 통지를 수신하는 것에 응답하여, 상기 커맨드들의 제 1 세트의 실행 동안 상기 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 출력부를 접속해제하고 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 상기 GPU 의 상기 하드웨어 스트림 출력 유닛에 접속하고;
    상기 하드웨어 스트림 출력 유닛으로부터, 상기 커맨드들의 제 1 세트의 실행 동안, 상기 GPU 의 상기 그래픽스 파이프라인의 스테이지들의 상기 인터커넥션의 상기 동적 구성으로 인해 상기 GPU 외부에 있는 상기 시스템 메모리로 상기 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하고;
    커맨드들의 제 2 세트를 실행하기 위해, 상기 드로우 콜의 상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 상기 실행을 완료하기 이전에, 상기 커맨드들의 제 1 세트의 상기 실행을 선점하고; 그리고
    상기 커맨드들의 제 2 세트를 실행하도록
    구성되는, 데이터를 프로세싱하기 위한 디바이스.
  9. 제 8 항에 있어서,
    상기 그래픽스 파이프라인은 래스터라이저 스테이지 및 픽셀 셰이더 스테이지를 포함하고, 상기 하나 이상의 프리미티브들은 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함하고, 상기 GPU 는, 다른 후속 픽셀 타일이 아니라, 상기 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 상기 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일을 상기 래스터라이저 스테이지로 래스터화하고 상기 픽셀 셰이더 스테이지로 픽셀 셰이딩한 후에 선점하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  10. 제 8 항에 있어서,
    상기 GPU 는 드로우 콜 경계들에 도달하기 이전에 선점하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  11. 제 8 항에 있어서,
    상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 출력부를 접속해제하기 위해, 상기 GPU 는 래스터라이저 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 접속해제하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  12. 제 8 항에 있어서,
    상기 GPU 는,
    단지 상기 선점 통지를 수신하는 것에 응답하여, 상기 GPU 외부에 있는 상기 시스템 메모리로 셰이더에 의해 생성된 중간 데이터를 출력하고; 그리고
    상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 실행을 중단하도록
    구성되는, 데이터를 프로세싱하기 위한 디바이스.
  13. 제 8 항에 있어서,
    상기 GPU 는,
    상기 커맨드들의 제 2 세트의 실행에 후속하여, 래스터화 및 픽셀 셰이딩을 위해 상기 GPU 외부에 있는 상기 시스템 메모리로부터 상기 중간 데이터를 취출함으로써 상기 커맨드들의 제 1 세트의 실행을 재개하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  14. 제 8 항에 있어서,
    상기 스테이지는 상기 선점 통지를 수신하기 이전에 상기 스테이지에 의한 프로세싱을 위해 상기 로컬 메모리로부터 상기 중간 데이터를 수신하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  15. 제 8 항에 있어서,
    상기 데이터를 프로세싱하기 위한 디바이스는 무선 통신 디바이스를 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  16. 명령들을 저장하고 있는 컴퓨터 판독가능 저장 매체로서,
    상기 명령들은, 데이터를 프로세싱하기 위한 디바이스의 그래픽스 프로세싱 유닛 (GPU) 으로 하여금,
    드로우 콜을 수신하는 것에 응답하여 상기 GPU 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하게 하는 것으로서, 상기 드로우 콜은 상기 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하게 하고;
    상기 커맨드들의 제 1 세트의 실행 동안 그리고 상기 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하게 하고;
    상기 선점 통지를 수신하는 것에 응답하여, 상기 커맨드들의 제 1 세트의 실행 동안 상기 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하고 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 상기 GPU 의 하드웨어 스트림 출력 유닛에 접속하게 하고;
    상기 하드웨어 스트림 출력 유닛으로부터, 상기 커맨드들의 제 1 세트의 실행 동안, 상기 GPU 의 상기 그래픽스 파이프라인의 스테이지들의 상기 인터커넥션의 상기 동적 구성으로 인해 상기 GPU 외부에 있는 메모리로 상기 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하게 하고;
    커맨드들의 제 2 세트를 실행하기 위해, 상기 드로우 콜의 상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 상기 실행을 완료하기 이전에, 상기 커맨드들의 제 1 세트의 상기 실행을 선점하게 하고; 그리고
    상기 커맨드들의 제 2 세트를 실행하게 하는, 컴퓨터 판독가능 저장 매체.
  17. 제 16 항에 있어서,
    상기 하나 이상의 프리미티브들은 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함하고, 상기 GPU 로 하여금, 선점하게 하는 명령들은, 상기 GPU 로 하여금, 다른 후속 픽셀 타일이 아니라, 상기 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 상기 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일을 래스터화 및 픽셀 셰이딩한 후에 선점하게 하는 명령들을 포함하고, 래스터화 및 픽셀 셰이딩은 상기 그래픽스 파이프라인의 2 개의 스테이지들에 의해 수행된 기능들을 포함하는, 컴퓨터 판독가능 저장 매체.
  18. 제 16 항에 있어서,
    상기 GPU 로 하여금, 선점하게 하는 명령들은, 상기 GPU 로 하여금, 드로우 콜 경계들에 도달하기 이전에 선점하게 하는 명령들을 포함하는, 컴퓨터 판독가능 저장 매체.
  19. 제 16 항에 있어서,
    상기 GPU 로 하여금, 상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하게 하는 명령들은,
    상기 GPU 로 하여금, 래스터라이저 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 접속해제하게 하는 명령들을 포함하는, 컴퓨터 판독가능 저장 매체.
  20. 제 16 항에 있어서,
    상기 GPU 로 하여금,
    단지 상기 선점 통지를 수신하는 것에 응답하여, 상기 GPU 외부에 있는 상기 메모리로 셰이더에 의해 생성된 중간 데이터를 출력하게 하고; 그리고
    상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 실행을 중단하게 하는
    명령들을 더 포함하는, 컴퓨터 판독가능 저장 매체.
  21. 데이터를 프로세싱하기 위한 디바이스로서,
    드로우 콜을 수신하는 것에 응답하여 그래픽스 프로세싱 유닛 (GPU) 의 그래픽스 파이프라인을 통해 커맨드들의 제 1 세트를 실행하기 위한 수단으로서, 상기 드로우 콜은 상기 커맨드들의 제 1 세트의 실행에 의해 렌더링되어야 하는 하나 이상의 프리미티브들을 정의하는, 상기 커맨드들의 제 1 세트를 실행하기 위한 수단;
    상기 커맨드들의 제 1 세트의 실행 동안 그리고 상기 하나 이상의 프리미티브들의 전부를 렌더링하기 이전에 선점 통지를 수신하기 위한 수단;
    상기 커맨드들의 제 1 세트의 실행 동안 상기 그래픽스 파이프라인의 스테이지들의 인터커넥션을 동적으로 구성하기 위해 상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하고 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 상기 GPU 의 하드웨어 스트림 출력 유닛에 접속하기 위한 수단;
    상기 하드웨어 스트림 출력 유닛으로부터, 상기 커맨드들의 제 1 세트의 실행 동안, 상기 GPU 의 상기 그래픽스 파이프라인의 스테이지들의 상기 인터커넥션의 상기 동적 구성으로 인해 상기 GPU 외부에 있는 메모리로 상기 커맨드들의 제 1 세트의 하나 이상의 커맨드들의 실행 동안 생성된 중간 데이터를 출력하기 위한 수단;
    커맨드들의 제 2 세트를 실행하기 위해, 상기 드로우 콜의 상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 상기 실행을 완료하기 이전에, 상기 커맨드들의 제 1 세트의 상기 실행을 선점하기 위한 수단; 및
    상기 커맨드들의 제 2 세트를 실행하기 위한 수단
    을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  22. 제 21 항에 있어서,
    상기 하나 이상의 프리미티브들은 프리미티브들의 제 1 세트 및 프리미티브들의 제 2 세트를 포함하고, 상기 선점하기 위한 수단은, 다른 후속 픽셀 타일이 아니라, 상기 프리미티브들의 제 1 세트의 하나 이상의 프리미티브들의 하나 이상의 픽셀들을 포함하고 상기 프리미티브들의 제 2 세트의 픽셀들 중 아무것도 포함하지 않는 픽셀 타일을 래스터화 및 픽셀 셰이딩한 후에 선점하기 위한 수단을 포함하고, 래스터화 및 픽셀 셰이딩은 상기 그래픽스 파이프라인의 2 개의 스테이지들에 의해 수행된 기능들을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  23. 제 21 항에 있어서,
    상기 선점하기 위한 수단은 드로우 콜 경계들에 도달하기 이전에 선점하기 위한 수단을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  24. 제 21 항에 있어서,
    상기 그래픽스 파이프라인의 스테이지로부터 상기 GPU 의 로컬 메모리의 출력부를 접속해제하기 위한 수단은,
    래스터라이저 스테이지로부터 상기 GPU 의 상기 로컬 메모리의 상기 출력부를 접속해제하기 위한 수단을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  25. 제 21 항에 있어서,
    단지 상기 선점 통지를 수신하는 것에 응답하여, 상기 GPU 외부에 있는 상기 메모리로 셰이더에 의해 생성된 중간 데이터를 출력하기 위한 수단; 및
    상기 하나 이상의 프리미티브들을 렌더링하기 위한 상기 커맨드들의 제 1 세트의 실행을 중단하기 위한 수단
    을 더 포함하는, 데이터를 프로세싱하기 위한 디바이스.
KR1020187012000A 2015-09-29 2016-07-08 픽셀 타일 레벨 입도로의 그래픽스 프로세싱 유닛 선점 KR20180059892A (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201562234355P 2015-09-29 2015-09-29
US62/234,355 2015-09-29
US15/013,714 2016-02-02
US15/013,714 US9842376B2 (en) 2015-09-29 2016-02-02 Graphics processing unit preemption with pixel tile level granularity
PCT/US2016/041525 WO2017058331A1 (en) 2015-09-29 2016-07-08 Graphics processing unit preemption with pixel tile level granularity

Publications (1)

Publication Number Publication Date
KR20180059892A true KR20180059892A (ko) 2018-06-05

Family

ID=58409688

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020187012000A KR20180059892A (ko) 2015-09-29 2016-07-08 픽셀 타일 레벨 입도로의 그래픽스 프로세싱 유닛 선점

Country Status (7)

Country Link
US (1) US9842376B2 (ko)
EP (1) EP3357034B1 (ko)
JP (1) JP2018533137A (ko)
KR (1) KR20180059892A (ko)
CN (1) CN108140233B (ko)
BR (1) BR112018006349A2 (ko)
WO (1) WO2017058331A1 (ko)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10338953B2 (en) * 2016-03-18 2019-07-02 Intel Corporation Facilitating execution-aware hybrid preemption for execution of tasks in computing environments
US10460513B2 (en) 2016-09-22 2019-10-29 Advanced Micro Devices, Inc. Combined world-space pipeline shader stages
US11609791B2 (en) 2017-11-30 2023-03-21 Advanced Micro Devices, Inc. Precise suspend and resume of workloads in a processing unit
CN108121566A (zh) * 2017-12-06 2018-06-05 中国航空工业集团公司西安航空计算技术研究所 一种图形指令解析设计方法
CN109683966A (zh) * 2018-12-12 2019-04-26 中国航空工业集团公司西安航空计算技术研究所 一种面向设备优化的OpenGL驱动实现方法
US10748239B1 (en) 2019-03-01 2020-08-18 Qualcomm Incorporated Methods and apparatus for GPU context register management
US20220301095A1 (en) * 2021-03-19 2022-09-22 Samsung Electronics Co., Ltd. Method and apparatus for software based preemption using two-level binning to improve forward progress of preempted workloads

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8139070B1 (en) * 2007-10-03 2012-03-20 Matrox Graphics, Inc. Systems for and methods of context switching in a graphics processing system
US9652282B2 (en) * 2011-11-08 2017-05-16 Nvidia Corporation Software-assisted instruction level execution preemption
US8572573B2 (en) * 2012-03-09 2013-10-29 Nvidia Corporation Methods and apparatus for interactive debugging on a non-preemptible graphics processing unit
US10535185B2 (en) * 2012-04-04 2020-01-14 Qualcomm Incorporated Patched shading in graphics processing
US10002021B2 (en) * 2012-07-20 2018-06-19 Qualcomm Incorporated Deferred preemption techniques for scheduling graphics processing unit command streams
US8963933B2 (en) * 2012-07-23 2015-02-24 Advanced Micro Devices, Inc. Method for urgency-based preemption of a process
US10095526B2 (en) 2012-10-12 2018-10-09 Nvidia Corporation Technique for improving performance in multi-threaded processing units
US9710874B2 (en) 2012-12-27 2017-07-18 Nvidia Corporation Mid-primitive graphics execution preemption
US9230518B2 (en) 2013-09-10 2016-01-05 Qualcomm Incorporated Fault-tolerant preemption mechanism at arbitrary control points for graphics processing
US9280845B2 (en) 2013-12-27 2016-03-08 Qualcomm Incorporated Optimized multi-pass rendering on tiled base architectures
US9396032B2 (en) * 2014-03-27 2016-07-19 Intel Corporation Priority based context preemption

Also Published As

Publication number Publication date
JP2018533137A (ja) 2018-11-08
EP3357034A1 (en) 2018-08-08
WO2017058331A1 (en) 2017-04-06
CN108140233A (zh) 2018-06-08
US9842376B2 (en) 2017-12-12
BR112018006349A2 (pt) 2018-10-16
EP3357034B1 (en) 2019-04-10
CN108140233B (zh) 2021-06-25
US20170091895A1 (en) 2017-03-30

Similar Documents

Publication Publication Date Title
US10210593B2 (en) Adaptive context switching
EP3357034B1 (en) Graphics processing unit preemption with pixel tile level granularity
US10002021B2 (en) Deferred preemption techniques for scheduling graphics processing unit command streams
JP6073533B1 (ja) タイルベースのアーキテクチャ上での最適化されたマルチパスレンダリング
EP2936492B1 (en) Multi-mode memory access techniques for performing graphics processing unit-based memory transfer operations
US20110063306A1 (en) CO-PROCESSING TECHNIQUES ON HETEROGENEOUS GPUs INCLUDING IDENTIFYING ONE GPU AS A NON-GRAPHICS DEVICE
KR20140109431A (ko) 커맨드 프로세서를 갖는 그래픽 프로세싱 유닛
KR20160148594A (ko) 그래픽스 프로세싱에 있어서 렌더 타깃에 기초한 플렉스 렌더링
US10062139B2 (en) Vertex shaders for binning based graphics processing
JP6595101B2 (ja) 後期深度試験と保守的深度試験との間の動的切替え
US10078883B2 (en) Writing graphics data from local memory to system memory
JP2018514855A (ja) ハイブリッド2d/3dグラフィックスレンダリング
US10580151B2 (en) Tile-based low-resolution depth storage