KR20180128075A - 그래픽스 프로세싱을 위한 퍼-쉐이더 프리앰블 - Google Patents

그래픽스 프로세싱을 위한 퍼-쉐이더 프리앰블 Download PDF

Info

Publication number
KR20180128075A
KR20180128075A KR1020187033353A KR20187033353A KR20180128075A KR 20180128075 A KR20180128075 A KR 20180128075A KR 1020187033353 A KR1020187033353 A KR 1020187033353A KR 20187033353 A KR20187033353 A KR 20187033353A KR 20180128075 A KR20180128075 A KR 20180128075A
Authority
KR
South Korea
Prior art keywords
code block
shader
results
preamble code
preamble
Prior art date
Application number
KR1020187033353A
Other languages
English (en)
Other versions
KR101973924B1 (ko
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 KR20180128075A publication Critical patent/KR20180128075A/ko
Application granted granted Critical
Publication of KR101973924B1 publication Critical patent/KR101973924B1/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
    • 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/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)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)
  • Advance Control (AREA)
  • Image Processing (AREA)
  • Complex Calculations (AREA)

Abstract

그래픽스 프로세싱 유닛에서 데이터를 프로세싱하는 방법으로서, 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록을 수신하는 단계, 상기 복수의 스레드 그룹들 중 한 스레드 그룹에 의한 결과를 만드는 상기 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록을 실행하는 단계, 상기 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록의 결과를 상기 복수의 스레드 그룹들 각각에 의해 액세스 가능한 온칩 랜덤 액세스 메모리 (RAM) 에 저장하는 단계, 및 상기 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록의 결과를 저장하는 것이 완료되었다고 결정할 시에, 온칩 RAM으로부터 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록의 결과를 반환하는 단계를 포함한다.

Description

그래픽스 프로세싱을 위한 퍼-쉐이더 프리앰블
본 개시는 데이터 프로세싱에 관한 것으로, 보다 구체적으로는, 그래픽스 프로세싱을 위한 쉐이더 프리앰블의 생성 및 실행에 관한 것이다.
단일 명령 다중 데이터 (SIMD) 프로세싱 시스템은 다수의 데이터 피스들에 대해 동일한 명령을 실행하는 다수의 프로세싱 엘리먼트들을 포함하는 종류의 병렬 컴퓨팅 시스템이다. SIMD 시스템은 독립형 컴퓨터 또는 컴퓨팅 시스템의 서브 시스템일 수도 있다. 예를 들어, 프로그래밍 가능한 쉐이딩을 지원하는 프로그래밍 가능한 쉐이딩 유닛을 구현하기 위해 하나 이상의 SIMD 실행 유닛들이 그래픽스 프로세싱 유닛 (GPU) 에 사용될 수도 있다. SIMD 프로세싱 시스템은 프로그램을 위한 다수의 실행 스레드가 병렬 방식으로 다수의 프로세싱 엘리먼트들에 대해 동시적으로 실행할 수 있게 함으로써, 동일한 연산 세트가 다수의 데이터 피스들에 대해 수행될 필요가 있는 프로그램에 대해 스루풋을 증가시킨다. 특정 SIMD 프로세싱 엘리먼트에서 실행되는 특정 명령은 스레드 또는 파이버로 지칭된다. 스레드 그룹은 웨이브 (wave) 또는 워프 (warp) 로 지칭될 수도 있다.
GPU 와 같은 프로세싱 유닛들은, 명령의 실행을 위한 데이터를 저장하는 범용 레지스터 (GPR) 및 프로세싱 엘리먼트들을 포함한다. 일부 예에서, 프로세싱 엘리먼트는 데이터의 하나의 아이템을 프로세싱하기 위한 명령을 실행하고, 각각의 프로세싱 엘리먼트들은 아이템의 데이터 또는 프로세싱으로부터 아이템의 결과 데이터를 GPR 에 저장한다. 데이터의 아이템은 프로세싱이 일어나는 기본 단위일 수도 있다. 예를 들어, 그래픽스 프로세싱에서, 프리미티브 (primitive) 의 버텍스 (vertex) 는 아이템의 한 예이고, 픽셀은 아이템의 또 다른 예이다. 각각의 버텍스 및 픽셀과 연관된 그래픽스 데이터 (예 : 좌표, 색상 값 등) 이 있다.
명령의 병렬 실행 (예를 들어, 다수의 프로세싱 엘리먼트들이 동일한 명령을 동시에 실행하는 것) 을 허용하는, 프로세싱 엘리먼트의 프로세서 코어 내에 다수의 프로세싱 엘리먼트들이 있을 수도 있다. 쉐이더 (shader) 는, 병렬 프로세싱 환경 (예를 들어, 쉐이더 프로세서) 을 이용할 수 있고 그래픽스 프로세싱 파이프라인의 다양한 스테이지들에서 2차원 및 3차원 모델들에 대해 그래픽스 렌더링 기술을 수행하기 위해 사용되어온 컴퓨터 프로그램이다. 쉐이더의 예들은 픽셀 (또는 프래그먼트) 의 색상 및 다른 속성들을 컴퓨트하는데 사용되는 픽셀 (또는 프래그먼트) 쉐이더; 위치, 이동, 조명 및 색상을 제어하는데 사용되는 버텍스 쉐이더, 또는 버텍스; 그래픽스 프리미티브를 생성하는데 사용되는 지오메트리 쉐이더; 버텍스 데이터의 패치들을 더 작은 프리미티브들로 세분할 때 사용되는 테셀레이션 (tesellation) 관련 쉐이더 (예를 들어, 헐 쉐이더 (hull shader) 및/또는 도메인 쉐이더; 및 다른 정보 (예를 들어, 비 그래픽스 데이터) 를 컴퓨트 (compute) 하는데 사용되는 컴퓨트 쉐이더를 포함한다.
개요
일반적으로, 본 개시는 GPU 의 쉐이더 프로세서 상에서 쉐이더 프로그램을 실행할 때 중복 연산을 줄이기 위한 기술을 설명한다. 일례에서, 본 개시는, 쉐이더의 모든 병렬 프로세싱 엘리먼트들 (예를 들어, 스레드들) 중에서 동일한 결과를 산출하는 명령들이 식별되고 쉐이더 마다 및/또는 커맨드 (예를 들면, 드로우 또는 디스패치 커맨드) 마다 한번씩 실행하도록 스케줄링되는 기술들을 설명한다. 컴파일러는 중복 명령들을 식별하고 중복 명령들을 퍼-쉐이더 프리앰블 (per-shader preamble) 이라고 불리는 코드 블록으로 그룹화할 수도 있다. 그런 다음 GPU 시스템은 퍼-쉐이더 프리앰블을 한 번 실행하고 퍼-쉐이더 프리앰블의 중복 명령들의 결과를 온칩 메모리에 세이브한다. 다음으로, 쉐이더 프로세서의 프로세싱 엘리먼트들 상에서 실행하는 쉐이더의 각각의 후속 스레드는 동일한 결과를 다시 컴퓨트하지 않고 그 결과를 재사용할 수 있다. 게다가, 데이터는 시스템 메모리로부터 온칩 랜덤 액세스 메모리 (RAM) 및/또는 온칩 상태 캐시/버퍼로 퍼-쉐이더 프리앰블을 통해 프리로드 (preload) 될 수도 있다.
본 개시의 일례에서, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법은, 쉐이더 컴파일러로부터 상기 GPU 에 의해, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 단계로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하는 단계, 상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서 상기 GPU 에 의해, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하는 단계, 상기 GPU에 의해, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 단계로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하는 단계, 및 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 GPU 에 의해, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 메인 쉐이더 코드 블록을 실행하는 단계를 포함한다.
또 다른 예에서, 데이터를 프로세싱하기 위한 장치로서, 상기 장치는, 그래픽스 프로세싱 유닛 (GPU) 을 포함하고, 상기 GPU 는 상수 메모리 및 쉐이더 코어를 포함하며, 상기 쉐이더 코어는 제어 유닛, 복수의 프로세싱 엘리먼트들, 및 상수 메모리를 포함하고, 상기 제어 유닛은, 쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 것으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하고, 상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하도록 상기 복수의 프로세싱 엘리먼트들 중 적어도 하나에 지시하고, 상기 상수 메모리에 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 것으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하고, 그리고 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 메인 쉐이더 코드 블록을 실행하도록 상기 복수의 프로세싱 엘리먼트들 중 적어도 하나에 지시하도록 구성된다.
또 다른 예에서, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치로서, 상기 장치는 쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 수단으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하는 수단, 상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하는 수단을 포함한다.
상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 수단으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하는 수단, 및 상기 프리앰블 코드 블록의 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 메인 쉐이더 코드 블록을 실행하는 수단.
또 다른 예에서, 저장된 명령들을 포함하는 비일시적 컴퓨터 판독가능 저장 매체로서, 상기 명령들은 실행될 때, 적어도 하나의 프로세서로 하여금, 쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 것으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하고, 상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하고, 상기 상수 메모리에 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 것으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하고, 그리고 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 메인 쉐이더 코드 블록을 실행하게 한다.
하나 이상의 예들의 상세는 첨부 도면 및 아래의 설명에 제시되어 있다. 다른 특징, 목적 및 이점들은 상세한 설명, 도면, 및 청구항들로부터 분명해질 것이다.
도 1은 본 개시에서 설명된 하나 이상의 예시적인 기법들에 따라 데이터를 프로세싱하기 위한 예시적인 디바이스를 나타내는 블록도이다.
도 2는 도 1에 나타낸 디바이스의 컴포넌트들을 보다 상세하게 나타낸 블록도이다.
도 3은 명령들의 세트의 일례를 나타내는 개념도이다.
도 4는 GPU 의 쉐이더 코어의 범용 레지스터 (GPR) 에서의 데이터 저장의 일례를 나타내는 개념도이다.
도 5는 보다 상세한 도 1의 GPU 의 쉐이더 코어 예의 블록도이다.
도 6은 GPU에서 데이터를 프로세싱하는 예시적인 기술을 나타내는 흐름도이다.
도 7은 쉐이더 프로그램을 컴파일하는 기술 예를 나타내는 흐름도이다.
상세한 설명
병렬로 (예를 들어, 동시에 또는 실질적으로 동시에) 많은 연산들을 수행하도록 구성된 그래픽스 프로세싱 유닛 (GPU) 과 같은 병렬 프로세싱 유닛들은 하나 이상의 프로그램의 명령들을 실행하는 하나 이상의 프로세서 코어들 (예 : GPU 를 위한 쉐이더 코어) 를 포함한다. 설명의 용이성을 위해, 본 개시에서 설명된 기술들은 그래픽스 프로세싱 애플리케이션 및/또는 범용 GPU (GPGPU) 애플리케이션을 수행하도록 구성된 GPU에 관하여 설명된다. 그러나, 본 개시에서 설명된 기술들은 반드시 GPU 또는 GPGPU 일 필요는 없는 병렬 프로세싱 유닛들뿐만 아니라 비 병렬 프로세싱 유닛들 (예를 들어, 병렬 프로세싱을 위해 특별히 구성되지 않은 것들) 로 확장될 수도 있다.
GPU 는 단일 명령, 다중 데이터 (SIMD) 구조로 설계될 수도 있다. SIMD 구조에서, 쉐이더 코어 (또는 보다 일반적으로는 SIMD 프로세싱 코어) 는 복수의 SIMD 프로세싱 엘리먼트들을 포함하며, 여기서 각각의 SIMD 프로세싱 엘리먼트는 동일한 프로그램의 명령들을, 그러나 상이한 데이터에 대해, 실행한다. 특정 SIMD 프로세싱 엘리먼트에서 실행되는 특정 명령은 스레드 또는 파이버로 지칭된다. 스레드 그룹은 웨이브 또는 워프로 지칭될 수도 있다. 함께 워프를 실행하는 모든 프로세싱 엘리먼트들은 벡터 프로세싱 유닛으로 지칭될 수도 있으며, 여기서 벡터의 각각의 레인 (예컨대, 프로세싱 엘리먼트) 는 하나의 스레드를 실행한다. 주어진 스레드에 대한 데이터가 상이할 수도 있기 때문에 각 SIMD 프로세싱 엘리먼트는 상이한 스레드를 실행하는 것으로 고려될 수도 있지만, 프로세싱 엘리먼트 상에서 실행되는 스레드는 다른 프로세싱 엘리먼트들 상에서 실행되는 명령과 동일한 프로그램의 동일한 명령이다. 이러한 방식으로, SIMD 구조는 GPU 가 많은 태스크들을 병렬로 (예를 들어, 동시에) 수행할 수 있게 한다.
쉐이더 (또는 쉐이더 프로그램) 는 병렬 프로세싱 환경 (예를 들어, 쉐이더 프로세서) 을 이용할 수 있는 컴퓨터 프로그램이다. 드로우 커맨드 (draw command) 는 디스플레이 디바이스 상의 디스플레이를 위한 오브젝트를 드로우 (예를 들어, 렌더링) 하기 위하여 그래픽스 프로세싱 유닛 (예 : GPU) 과 상호 작용하는 그래픽스 애플리케이션 프로그램 인터페이스 (API) 로 프로세싱 유닛 (예 : CPU) 에 의해 실행되는 커맨드들의 군 (family) 중 하나 이상을 지칭한다. 디스패치 커맨드 (dispatch command) 는 비 디스플레이 연산들을 실행하기 위하여 그래픽스 프로세싱 유닛 (GPU) 과 상호 작용하는 그래픽스 API 로 프로세싱 유닛 (예 : CPU) 에 의해 실행되는 커맨드들의 군 중 하나 이상을 지칭한다. 드로우 또는 디스패치 커맨드의 엘리먼트들은 연관된 쉐이더에서 중복 연산들을 실행할 수도 있다. 특히, GPU는 드로우 호출 및 디스패치와 같은 일괄 프로세싱 커맨드 (batch processing command) 들을 수행할 수도 있다. 커맨드는 작업 아이템, 픽셀 및 버텍스와 같은 엘리먼트들을 프로세싱하기 위해 하나 이상의 쉐이더들을 사용하도록 GPU 에 명령할 수도 있다. 다음으로, 그 엘리먼트에 대해 쉐이더가 호출될 수도 있다. 동일한 쉐이더가 동일한 유형의 커맨드들의 엘리먼트에 대해 호출될 수도 있다. 쉐이더의 연산은 동일한 유형의 모든 엘리먼트들에 대해 동일한 결과를 산출할 수도 있다. 이러한 연산들이 식별되고 각 엘리먼트에 대해 동일한 코드 세그먼트를 중복하여 실행할 필요없이 단일 회 실행될 수도 있다.
본 개시는 동일한 유형의 모든 엘리먼트에 대해 동일한 결과를 산출하는 쉐이더의 연산들이 식별되고 쉐이더 유형 마다 및/또는 커맨드 (예를 들어, 드로우 또는 디스패치 커맨드) 마다 한번씩 실행되도록 스케줄링되는 방법, 기술 및 디바이스를 설명한다. 컴파일러는 중복 명령들을 식별하고 중복 명령들을 퍼-쉐이더 프리앰블 (per-shader preamble) 이라고 불리는 코드 블록으로 그룹화할 수도 있다. GPU 는 퍼-쉐이더 프리앰블을 한 번 실행하고 퍼-쉐이더 프리앰블의 중복 명령들의 결과들을 온칩 메모리 (예를 들어, 랜덤 액세스 메모리 (RAM)) 에 세이브한다. 중복 명령들은 이 읽기/쓰기 상수 RAM 의 사용을 허용할 수도 있고, 중복 명령들의 계산에 사용된 상수들은 중복 명령들의 실행 전에 이 읽기/쓰기 상수 RAM 에 로드될 수도 있다 (즉, 퍼-쉐이더 프리앰블). 쉐이더의 엘리먼트들은 동일한 결과들을 다시 컴퓨트하지 않고서 그 결과들을 재사용할 수 있다. 이렇게 하면 성능이 현저히 향상되고 전력 소비가 줄어든다.
도 1은 퍼-쉐이더 프리앰블의 생성 및 실행을 위한 본 개시에서 설명된 하나 이상의 예시적인 기법들에 따라 데이터를 프로세싱하기 위한 예시적인 디바이스를 나타내는 블록도이다. 도 1은 디바이스 (10) 를 나타내고, 그의 예들은, 비디오 디바이스, 이를테면 미디어 플레이어, 셋톱 박스, 무선 통신 디바이스 이를테면 이동 전화, PDA (personal digital assistant), 데스크톱 컴퓨터, 랩톱 컴퓨터, 게이밍 콘솔, 비디오 컨퍼런싱 유닛, 테블릿 컴퓨팅 디바이스 등을 포함하지만, 이에 한정되지는 않는다.
도 1의 예에서, 디바이스 (10) 는 프로세서 (12), 그래픽스 프로세싱 유닛 (GPU)(14), 및 시스템 메모리 (16) 를 포함한다. 일부 예들에서, 이를테면 디바이스 (10) 가 이동 디바이스인 예들에서, 프로세서 (12) 및 GPU (14) 는 집적 회로 (IC) 로서 형성될 수도 있다. 예를 들어, IC는 시스템 온칩 (SoC) 과 같은 칩 패키지 내의 프로세싱 칩으로 간주될 수도 있다. 일부 예들에서, 이를테면 디바이스 (10) 가 데스크톱 또는 랩톱 컴퓨터인 예들에서, 프로세서 (12) 및 GPU (14) 는 상이한 집적 회로 (예를 들어, 상이한 칩 패키지) 에 수용될 수도 있다. 그러나, 프로세서 (12) 및 GPU (14) 는 디바이스 (10) 가 이동 디바이스인 예에서 상이한 집적 회로에 수용되는 것이 가능할 수도 있다.
프로세서 (12) 및 GPU (14) 의 예들은, 하나 이상의 디지털 신호 프로세서 (DSP), 범용 마이크로프로세서, ASIC (application specific integrated circuit), FPGA (field programmable logic array), 또는 다른 동등한 집적 또는 이산 로직 회로를 포함하지만 이에 한정되지는 않는다. 프로세서 (12) 는, 디바이스 (10) 의 CPU (central processing unit) 일 수도 있다. 일부 예들에서, GPU (14) 는 그래픽스 프로세싱 (예를 들어, SIMD 프로세서) 에 적합한 대량 병렬 프로세싱 능력을 GPU (14) 에 제공하는 집적 및/또는 이산 로직 회로를 포함하는 특수화된 하드웨어일 수도 있다. 일부 예들에서, GPU (14) 는 범용 프로세싱 능력을 포함할 수도 있고, 범용 프로세싱 태스크 (즉, 비 그래픽스 관련 태스크) 를 구현할 때 범용 GPU (GPGPU) 로 지칭될 수도 있다.
예시의 목적을 위해, 본 개시에 설명된 기술들은 GPU (14) 로 설명된다. 하지만, 본 개시에 설명된 기술들은 그렇게 한정되지 않는다. 본 개시에서 설명된 기술들은 다른 유형의 병렬 프로세싱 유닛들 (예를 들어, 그래픽스 프로세싱을 위한 것이 아닌 경우에도 대량 병렬 프로세싱 능력들을 제공하는 프로세싱 유닛들) 로 확장될 수도 있다. 또한, 본 개시에서 설명된 기술들은 병렬 프로세싱을 위해 특별히 구성되지 않은 프로세싱 유닛들로 확장될 수도 있다.
프로세서 (12) 는 다양한 유형의 애플리케이션들을 실행할 수도 있다. 애플리케이션들의 예들은, 운영 시스템, 웹 브라우저, 이메일 애플리케이션, 스프레드시트, 비디오 게임, 또는 디스플레이를 위해 볼 수 있는 오브젝트들을 생성하는 다른 애플리케이션들을 포함한다. 시스템 메모리 (16) 는 하나 이상의 애플리케이션들의 실행을 위한 명령들을 저장할 수도 있다. 프로세서 (12) 상의 애플리케이션의 실행은 프로세서 (12) 로 하여금 디스플레이될 이미지 콘텐츠를 위한 그래픽스 데이터를 산출하게 한다. 프로세서 (12) 는 추가 프로세싱을 위해 이미지 콘텐츠의 그래픽스 데이터를 GPU (14) 에 송신할 수도 있다.
예로서, 프로세서 (12) 상의 애플리케이션의 실행은 프로세서 (12) 로 하여금 프리미티브들의 버텍스들을 산출하게 하고, 여기서 각 버텍스에서의 프리미티브들의 상호접속은 그래픽 오브젝트를 형성한다. 이 예에서, 프로세서 (12) 가 산출하는 그래픽스 데이터는 버텍스들의 속성들을 위한 속성 데이터이다. 예를 들어, 프로세서 (12) 상에서 실행되는 애플리케이션은, 모두 버텍스들의 속성들의 예인, 버텍스들을 위한 색상 값, 불투명도 값, 좌표 등을 생성할 수도 있다. 버텍스들의 속성 중 일부는 각 버텍스에 대해 복제되는 코드를 부분적으로 사용하여, 특히 그러한 코드가 일단 실행되면 상수로 평가되는 경우에, 생성될 수도 있습니다. 다음으로, 프로세서 (12) 는 식별된 중복 코드를 (예를 들어, 제 1 버텍스에 대한 실행 동안) 단일 회 실행하고 그러한 중복 코드를 사용하는 나머지 버텍스들에 대해 그 결과를 재사용할 수도 있다. 일반적으로, 이 기술은 속성 데이터 이외의 데이터 유형 (예를 들어, 카운터) 으로 확장가능하며, 이 기술은 속성 데이터에 한정되거나 또는 색상 값, 불투명도 값, 좌표 등과 같은 속성 데이터의 예들에 한정되는 것으로 고려되지 않아야 한다.
일부 비 그래픽스 관련 예에서, 프로세서 (12) 는 GPU (14) 에 의해 프로세싱되기에 더 적합한 데이터를 생성할 수도 있다. 이러한 데이터는 그래픽스 또는 디스플레이 목적에 필요하지 않다. 예를 들어, 프로세서 (12) 는 GPU (14) 에 의해 행렬 연산이 수행될 필요가 있는 데이터를 출력할 수도 있고, 차례로 GPU (14) 는 행렬 연산을 수행할 수도 있다.
일반적으로, 프로세서 (12) 는 대량 병렬 연산을 필요로 하는 태스크와 같은 프로세싱 태스크를 GPU (14) 에 오프로드할 수도 있다. 일 예로서, 그래픽스 프로세싱은 대량 병렬 연산을 필요로 하고, 프로세서 (12) 는 이러한 그래픽스 프로세싱 태스크를 GPU (14) 에 오프로드할 수도 있다. 그러나, 행렬 연산과 같은 다른 연산은 또한 GPU (14) 의 병렬 프로세싱 능력으로부터 혜택을 볼 수도 있다. 이들 예에서, 프로세서 (12) 는 GPU (14) 의 병렬 프로세싱 능력을 활용하여 GPU (14) 로 하여금 비 그래픽스 관련 연산을 수행하게 할 수도 있다.
프로세서 (12) 는 특정 API (application processing interface) 에 따라 GPU (14) 와 통신할 수도 있다. 이러한 API의 예로는 Microsoft® 에 의한 DirectX® API, Khronos 그룹에 의한 OpenGL® 또는 OpenGL ES®, 및 OpenCLTM 을 포함하지만, 본 개시의 양태들은 DirectX, OpenGL, 또는 OpenCL API 에 국한되지 않으며 다른 유형의 API 로 확장될 수도 있다. 더욱이, 이 개시에서 설명된 기술들은 API 에 따라 기능하도록 요구되지 않으며, 프로세서 (12) 및 GPU (14) 는 통신을 위해 임의의 기술을 이용할 수도 있다.
디바이스 (10) 는 또한 디스플레이 (18), 사용자 인터페이스 (20) 및 트랜시버 모듈 (22) 을 포함할 수도 있다. 디바이스 (10) 는, 명료성의 목적을 위해 도 1에 도시되지 않은 추가의 모듈들 또는 유닛들을 포함할 수도 있다. 예를 들어, 디바이스 (10) 가 이동 무선 전화기인 예들에서 전화 통신을 이루기 위하여, 디바이스 (10) 는, 스피커 및 마이크로폰을 포함할 수도 있는데, 이들 중 어느 것도 도 1에 도시되지 않지는 않다. 게다가, 디바이스 (10) 에서 보여진 다양한 모듈들 및 유닛들은 디바이스 (10) 의 모든 예에서 필요하지 않을 수도 있다. 예를 들어, 사용자 인터페이스 (20) 및 디스플레이 (18) 는 디바이스 (10) 가 데스크탑 컴퓨터인 예들에서 디바이스 (10) 의 외부에 있을 수도 있다. 또 다른 예로서, 사용자 인터페이스 (20) 는 디스플레이 (18) 가 이동 디바이스의 터치 감지 또는 존재 감지 디스플레이인 예에서 디스플레이 (18) 의 일부일 수도 있다.
디스플레이 (18) 는, LCD (liquid crystal display), CRT (cathode ray tube) 디스플레이, 플라즈마 디스플레이, 터치 감지 디스플레이, 존재 감지 디스플레이, 또는 또 다른 유형의 디스플레이 디바이스를 포함할 수도 있다. 사용자 인터페이스 (20) 의 예들은, 트랙볼, 마우스, 키보드, 및 다른 유형의 입력 디바이스들을 포함하지만 이에 한정되지 않는다. 사용자 인터페이스 (20) 는 또한 터치 스크린일 수도 있고 디스플레이 (18) 의 부분으로서 포함될 수도 있다. 트랜시버 모듈 (22) 은, 디바이스 (10) 와 또 다른 디바이스 또는 네트워크 간에 무선 또는 유선 통신을 허용하기 위한 회로를 포함할 수도 있다. 트랜시버 모듈 (22) 은, 변조기, 복조기, 증폭기 및 유선 또는 무선 통신을 위한 다른 그러한 회로를 포함할 수도 있다.
시스템 메모리 (16) 는 디바이스 (10) 를 위한 메모리일 수도 있다. 시스템 메모리 (16) 는 하나 이상의 컴퓨터 판독가능 저장 매체를 포함할 수도 있다. 시스템 메모리 (16) 의 예들은, RAM (random access memory), EEPROM (electrically erasable programmable read-only memory), 플래시 메모리, 또는 명령들 및/또는 데이터 구조들의 형태로 원하는 프로그램 코드를 지니거나 또는 저장하는데 사용될 수 있고 컴퓨터 또는 프로세서에 의해 액세스될 수 있는 다른 매체를 포함하지만, 이에 한정되지는 않는다.
일부 양태들에서, 시스템 메모리 (16) 는 프로세서 (12) 및/또는 GPU (14) 로 하여금 본 개시에서 프로세서 (12) 및 GPU (14) 로 돌려지는 기능들을 수행하게 하는 명령들을 포함할 수도 있다. 따라서, 시스템 메모리 (16) 는, 실행될 때, 하나 이상의 프로세서들 (예를 들어, 프로세서 (12) 및 GPU (14)) 로 하여금 다양한 기능들을 수행하게 하는 명령들을 저장한 컴퓨터 판독가능 저장 매체일 수도 있다.
일부 예들에서, 시스템 메모리 (16) 는 비일시적 저장 매체일 수도 있다. 용어 "비일시적" 은, 저장 매체가 캐리어 파 (carrier wave) 또는 전파되는 신호에서 구체화되지 않는다는 것을 나타낼 수도 있다. 하지만, 용어 "비일시적" 은, 시스템 메모리 (16) 가 이동가능하지 않다는 것 또는 그의 콘텐츠가 정적이라는 것을 의미하는 것으로 해석되서는 안된다. 일 예로서, 시스템 메모리 (16) 는 디바이스로부터 제거되고, 또 다른 디바이스로 이동될 수도 있다. 또 다른 예로서, 시스템 메모리 (16) 와 실질적으로 유사한, 메모리가 디바이스 (10) 내에 삽입될 수도 있다. 특정 예들에서, 비일시적 저장 매체는, 경시적으로, (예를 들어, RAM 에서) 변화할 수 있는 데이터를 저장할 수도 있다.
예를 들어, 본 개시의 다른 곳에서 보다 상세히 설명된 바와 같이, 시스템 메모리 (16) 는 본 개시에서 설명된 하나 이상의 예들의 기술들을 수행하는 프로세서 (12) 상에서 실행되는 컴파일러를 위한 코드를 저장할 수도 있다. 시스템 메모리 (16) 는 또한 GPU (14) 의 쉐이더 코어 (쉐이더 프로세서 또는 커넬이라고도 함) 상에서 실행되는 쉐이더 프로그램 (예를 들어, 버텍스 쉐이더, 픽셀 또는 프래그먼트 쉐이더, 테셀레이션 관련 쉐이더, 컴퓨트 쉐이더 등) 을 위한 코드를 저장할 수도 있다. 또한, 시스템 메모리 (16) 는 하나 이상의 상수 버퍼들을 저장할 수도 있다. 상수 로드 명령들은 컴파일러 (38) 로 하여금 시스템 메모리로부터 GPU (14) 의 상수 메모리 (44) 로 상수들을 로드할 수 있게 할 수도 있다. 상수 메모리 (44) 가 가득차면 상수들이 GPR (26) (또는 uGPR (27)) 에 로드될 수도 있다.
본 개시에서 그래픽스 아이템 (graphics item) 이라는 용어는 GPU (14) 가 병렬 프로세싱을 수행하는 기본 단위 (base unit) 를 지칭하기 위해 사용된다. GPU (14) 는 복수의 그래픽스 아이템들을 병렬로 (예를 들어, 동시에) 프로세싱할 수도 있다. 예를 들어, 버텍스 쉐이더는 버텍스를 프로세싱할 수도 있고, GPU (14) 는 버텍스 쉐이더의 복수의 인스턴스들을 병렬로 실행하여 복수의 버텍스들을 동시에 프로세싱할 수도 있다. 유사하게, 픽셀 또는 프래그먼트 쉐이더는 디스플레이의 픽셀을 프로세싱할 수도 있고, GPU (14) 는 픽셀 쉐이더의 복수의 인스턴스들을 병렬로 실행하여 디스플레이의 복수의 픽셀들을 동시에 프로세싱할 수도 있다. 버텍스 및 픽셀은 그래픽스 아이템의 예들이다. 비 그래픽스 관련 애플리케이션에 대해, "작업 아이템" (work item) 이라는 용어는 GPU (14) 가 프로세싱을 수행하는 최소 단위를 지칭할 수도 있다.
아래에서 보다 상세히 설명되는 바와 같이, 본 개시의 다양한 예들에 따르면, GPU (14) 는 GPU (14) 에서 워프 (또는 다수의 워프에 대한) 모든 스레드가 프로세서 (12) 에 의해 실행되는 컴파일러에 의해 식별된 제 1 스레드/워프의 실행 동안 (단일 또는 다수의 워프에 대한) 각 스레드간에 공통되는 제 1 명령 세트를 실행할 것이라는 표시를 (예를 들어, 퍼-쉐이더 프리앰블에서) 수신하도록 구성될 수도 있다. 퍼-쉐이더 프리앰블에서의 명령들은 퍼-쉐이더 프리앰블에의 포함을 위해 식별되었을 수도 있는데, 그 이유는 명령들이 일정 및/또는 가변/동적일 수도 있는 비 발산의 (non-divergent) 입력들 (예를 들어, 그들은 모든 파이버/스레드에 걸쳐 균일하거나 및/또는 스칼라임) 을 사용하기 때문이다. 다음으로, GPU (14) 는 시스템 메모리 (16) 로부터 그러한 상수들에 액세스하고 이들을 GPU (14) 상의 상수 RAM 에 저장할 수도 있다. 퍼-쉐이더 프리앰블의 공통 명령들을 실행할 때, GPU (14) 는 상수 RAM 에서의 상수들에 액세스할 수도 있다. GPU (14) 는 공통 명령들을 수행할 수도 있다. 퍼-쉐이더 프리앰블의 공통 명령들을 수행한 후에, GPU (14) 는 읽기/쓰기 상수 RAM 에 그 결과들을 저장할 수도 있다. 또 다른 예에서, 퍼-쉐이더 프리앰블의 결과들 (예를 들어, 상수 값들) 은 하나 이상의 범용 레지스터 (GPR), 균일 GPR (uGPR) 또는 공유 GPR (sGPR) 에, 또는 GPU (14) 상의 다른 온칩 RAM 에 또는 시스템 메모리 (16) 에 저장될 수도 있다. 그러나, GPR, uGPR 및 sGPR 은 각 워프 사이에서 클리어될 수도 있고 (즉, 데이터는 워프들 사이의 GPR 에서 공유될 수 없고), 그러한 데이터는 워프 마다 그러한 GPR 로 다시 쓰여져야만 한다. GPR 은 또한, 특정 스레드/파이버에 대한 (그리고 이에 의해 액세스 가능한) 데이터를 저장할 수도 있는 반면에, uGPR은 웨이브/워프의 모든 스레드/파이버에 대한 (그리고 이에 의해 액세스 가능한) 데이터를 저장할 수도 있다. 데이터는 또한 인터-워프 데이터 공유를 허용하는 시스템 메모리 (16) 또는 온칩 (예를 들어, GPU (14) 상) 메모리에 저장될 수도 있다. 퍼-쉐이더 프리앰블의 실행 결과는 동일한 결과들을 두 번째로 (또는 그 이상으로) 재생하지 않고 쉐이더의 각 엘리먼트 (예 : 스레드) 에 재사용될 수도 있다. 퍼-쉐이더 프리앰블의 실행 결과들은 또한 동일한 결과들을 두 번째로 (또는 그 이상으로) 재생하지 않고 쉐이더의 다수의 워프들에 재사용될 수도 있다.
도 2는 도 1에 나타낸 디바이스의 컴포넌트들을 보다 상세하게 나타낸 블록도이다. 도 2에 나타낸 바와 같이, GPU (14) 는, 범용 레지스터 (GPR) (26), 균일 GPR (27) 및 상수 메모리 (44) 를 포함하는 쉐이더 코어 (24), 고정 기능 파이프라인 (fixed-function pipeline; 30) (들) 및 GPU 메모리 (42) 를 포함한다. GPR (26) 은 단일 GPR, GPR 파일 및/또는 GPR 뱅크를 포함할 수도 있다. uGPR (27) 은 단일 uGPR, uGPR 파일 및/또는 uGPR 뱅크를 포함할 수도 있다. GPR (26) 은 단일 스레드/파이어에 대해 액세스 가능한 데이터를 저장할 수도 있다. uGPR (27) 은 단일 웨이브/워프 내의 모든 스레드/파이버에 의해 액세스 가능한 데이터를 저장할 수도 있다. 쉐이더 코어 (24) 및 고정 기능 파이프라인(들) (30) 은, 그래픽스 또는 비 그래픽스 관련 기능들을 수행하기 위해 사용되는 프로세싱 파이프라인을 함께 형성할 수도 있다. 프로세싱 파이프라인은 GPU (14) 상에서 실행되는 소프트웨어 또는 펌웨어에 의해 정의되는 기능들을 수행하고, 특정한 기능들을 수행하기 위하여 하드와이어링된 고정 기능 유닛 (fixed-function unit) 들에 의해 기능들을 수행한다. GPU (14) 의 그러한 고정 기능 파이프라인들 (30) 은 텍스쳐 파이프라인, 테셀레이션 스테이지, 뷰잉 프러스텀 (viewing frustum) 밖으로 벗어난 클리핑 (clipping), 및 조명을 포함할 수도 있다.
GPU (14) 상에서 실행되는 소프트웨어 및/또는 펌웨어는 쉐이더 프로그램 (또는 단순히 쉐이더) 로 지칭될 수도 있고, 쉐이더 프로그램은 GPU (14) 의 쉐이더 코어 (24) 상에서 실행될 수도 있다. 하나의 쉐이더 코어 (24) 만이 나타나 있지만, 일부 예들에서, GPU (14) 는 쉐이더 코어 (24) 와 유사한 2 개 이상의 쉐이더 코어들을 포함할 수도 있다. 고정 기능 파이프라인(들) (30) 은 고정 기능 유닛들을 포함한다. 쉐이더 코어 (24) 및 고정 기능 파이프라인(들) (30) 은 서로 데이터를 송신 및 수신할 수도 있다. 예를 들어, 프로세싱 파이프라인은, 고정 기능 파이프라인 (30) 의 고정 기능 유닛으로부터 데이터를 수신하고 프로세싱된 데이터를 고정 기능 파이프라인 (30) 의 또 다른 고정 기능 유닛에 출력하는 쉐이더 코어 (24) 상에서 실행되는 쉐이더 프로그램을 포함할 수도 있다.
쉐이더 프로그램들은 사용자가 임의의 생각할 수 있는 방식으로 원하는 태스크를 수행하도록 쉐이더 프로그램을 설계할 수 있기 때문에 사용자 및/또는 개발자에게 기능적 유연성을 제공한다. 하지만, 고정된 기능 유닛들은, 고정된 기능 유닛들이 태스크들을 수행하는 방식을 위해 하드와이어링된다. 따라서, 고정된 기능 유닛들은 많은 기능적인 유연성을 제공하지 못할 수도 있다.
쉐이더 프로그램의 예들은 버텍스 쉐이더 프로그램 (32), 프래그먼트 쉐이더 프로그램 (34), 및 컴퓨트 쉐이더 프로그램 (36) 을 포함한다. 버텍스 쉐이더 프로그램 (32) 및 프래그먼트 쉐이더 프로그램 (34) 은 그래픽스 관련 태스크를 위한 쉐이더 프로그램일 수도 있고, 컴퓨트 쉐이더 프로그램 (36) 은 비 그래픽스 관련 태스크를 위한 쉐이더 프로그램일 수도 있다. 지오메트리 쉐이더 및 테셀레이션 관련 쉐이더와 같은 쉐이더 프로그램의 추가 예들이 있는데, 이들은 간결성을 위해 설명하지 않는다.
프로세서 (12) 상에서 실행되는 그래픽스 드라이버 (40) 는 애플리케이션 프로그래밍 인터페이스 (API) 를 구현하도록 구성될 수도 있지만; 그래픽스 드라이버 (40) 는 특정 API에 따라 구성되는 것으로 한정될 필요는 없다. 그러한 예들에서, 쉐이더 프로그램들 (예컨대, 버텍스 쉐이더 프로그램 (32), 프래그먼트 쉐이더 프로그램 (34) 및 컴퓨트 쉐이더 프로그램 (36)) 은 그래픽스 드라이버 (40) 에 의해 지원되는 API에 따라 구성될 수도 있다. 디바이스 (10) 가 이동 디바이스인 예에서, 그래픽스 드라이버 (40) 는 OpenGL ES API 에 따라 구성될 수도 있다. OpenGL ES API는 이동 디바이스들 위해 특별히 설계된다. 디바이스 (10) 가 비 이동 디바이스인 예에서, 그래픽스 드라이버 (40) 는 OpenGL API 에 따라 구성될 수도 있다. 다른 API 예들은 Microsoft Corporation 에 의한 DirectX API 군을 포함한다. 나타내지는 않았지만, 시스템 메모리 (16) 는 프로세서 (12) 가 실행을 위해 시스템 메모리 (16) 로부터 취출하는 그래픽스 드라이버 (40) 를 위한 코드를 저장할 수도 있다. 그래픽스 드라이버 (40) 는 그래픽스 드라이버 (40) 가 이 예에서 하드웨어 (예를 들어, 프로세서 (12)) 상에서 실행되는 소프트웨어임을 나타내기 위해 점선 박스로 나타나 있다.
그래픽스 드라이버 (40) 는 프로세서 (12) 및 GPU (14) 가 서로 통신할 수 있게 하도록 구성될 수도 있다. 예를 들어, 프로세서 (12) 가 GPU (14) 에 그래픽 또는 비 그래픽 프로세싱 태스크를 오프로드할 때, 프로세서 (12) 는 그래픽스 드라이버 (40) 를 통해 GPU (14) 에 그러한 프로세싱 태스크를 오프로드한다.
예로서, 프로세서 (12) 는 그래픽스 데이터를 산출하는 게이밍 애플리케이션을 실행할 수 있고, 프로세서 (12) 는 이 그래픽스 데이터의 프로세싱을 GPU (14) 에 오프로드할 수도 있다. 이 예에서, 프로세서 (12) 는 그래픽스 데이터를 시스템 메모리 (16) 에 저장할 수도 있고, 그래픽스 드라이버 (40) 는 GPU (14) 에게 그래픽스 데이터를 언제 취출할지, 시스템 메모리 (16) 내 그래픽스 데이터를 어디서 취출할지, 그리고 그래픽스 데이터를 언제 프로세싱할지 명령할 수도 있다. 또한, 게이밍 애플리케이션은 GPU (14) 에 하나 이상의 쉐이더 프로그램들을 실행하도록 요구할 수도 있다. 예를 들어, 게이밍 애플리케이션은 (예컨대, 도 1의 디스플레이 (18) 상에) 디스플레이될 이미지들을 생성하기 위해 버텍스 쉐이더 프로그램 (32) 및 프래그먼트 쉐이더 프로그램 (34) 을 실행하도록 쉐이더 코어 (24) 에 요구할 수도 있다. 그래픽스 드라이버 (40) 는 쉐이더 프로그램을 언제 실행할지 GPU (14) 에 명령할 수도 있고 쉐이더 프로그램에 필요한 그래픽스 데이터를 어디서 취출할지 GPU (14) 에 명령할 수도 있다. 이러한 방식으로, 그래픽 드라이버 (40) 는 프로세서 (12) 와 GPU (14) 사이의 링크를 형성할 수도 있다.
일부 예에서, 시스템 메모리 (16) 는 버텍스 쉐이더 프로그램 (32), 프래그먼트 쉐이더 프로그램 (34), 및 컴퓨트 쉐이더 프로그램 (36) 중 하나 이상을 위한 소스 코드를 저장할 수도 있다. 이러한 예에서, 프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 런타임 동안 GPU (14) 의 쉐이더 코어 (24) 에 의해 실행 가능한 오브젝트 또는 중간 코드를 생성하기 위해 이들 쉐이더 프로그램의 소스 코드를 (예를 들어, 이들 쉐이더 프로그램이 쉐이더 코어 (24) 상에서 실행될 시에) 컴파일할 수도 있다. 일부 예에서, 컴파일러 (38) 는 쉐이더 프로그램들을 사전 컴파일하고 쉐이더 프로그램들의 오브젝트 또는 중간 코드를 시스템 메모리 (16) 에 저장할 수도 있다.
본 개시의 기술에 따라, 프로세서 (12) 상에서 실행되는 컴파일러 (38) (또는 또 다른 예에서 그래픽스 드라이버 (40)) 는 "메인" 쉐이더 컴포넌트 및 "프리앰블" 쉐이더 컴포넌트를 포함하는 다수의 컴포넌트들로 쉐이더를 구축할 수도 있다. 메인 쉐이더 컴포넌트는 프리앰블 쉐이더 컴포넌트를 포함하지 않는 쉐이더 프로그램의 일부 또는 전부를 지칭할 수도 있다. 컴파일러 (38) 는 프로세서 (12) 상에서 실행되는 프로그램으로부터 컴파일할 코드를 수신할 수도 있다. 컴파일러 (38) 는 또한 쉐이더에서 상수 로드 명령들 및 공통 연산들을 식별하고 (메인 쉐이더 컴포넌트보다는) 프리앰블 쉐이더 컴포넌트 내에 공통 연산들을 포지셔닝할 수도 있다. 컴파일러 (38) 는, 예를 들어, 공통 명령들에서 상수들 (즉, 상수 값들) 의 전용 (exclusive use ) 에 의해, 이들 공통 명령들을 식별할 수도 있다. 컴파일러 (38) 는 쉐이더 프리앰블의 시작을 마킹하기 위해 쉐이더 프리앰블 시작 및 쉐이더 프리앰블의 종료를 마킹하기 위해 쉐이더 프리앰블 종료와 같은 명령들을 이용할 수도 있다. 컴파일러 (38) 는 SHPS (shader preamble start) 명령을 이용하여 퍼-쉐이더 프리앰블의 시작을 마킹할 수도 있다. MAIN 은 현재 웨이브가 첫번째 웨이브가 아닌 경우에 SHPS 명령이 (예를 들어, 코드의 메인 쉐이더 블록으로) 분기할 수도 있는 예시적인 라벨이다. 컴파일러 (38) 는 SHPE (shader preamble end) 명령을 이용하여 퍼-쉐이더 프리앰블의 종료를 마킹할 수도 있다.
쉐이더 코어 (24) 는 동일한 쉐이더 프로그램의 동일한 명령들의 많은 인스턴스를 병렬로 실행하도록 구성될 수도 있다. 예를 들어, 그래픽스 드라이버 (40) 는 복수의 버텍스들에 대한 버텍스 값을 취출하도록 GPU (14) 에 명령하고, 버텍스들의 버텍스 값들을 프로세싱하기 위해 버텍스 쉐이더 프로그램 (32) 을 실행하도록 GPU (14) 에 명령할 수도 있다. 이 예에서, 쉐이더 코어 (24) 는 버텍스 쉐이더 프로그램 (32) 의 다수의 인스턴스들을 실행할 수도 있고, 각 버텍스에 대한 쉐이더 코어 (24) 의 하나의 프로세싱 엘리먼트 상에서 버텍스 쉐이더 프로그램 (32) 의 하나의 인스턴스를 실행하는 것에 의해 그렇게 할 수도 있다.
쉐이더 코어 (24) 상에서 쉐이더 프로그램 (32, 34 또는 36) 의 실행의 첫번째 웨이브를 프로세싱하는 동안, 쉐이더 코어 (24) 는 쉐이더 프리앰블을 실행할 수도 있다. 쉐이더 프리앰블의 실행에 사용된 상수 입력들은 읽기/쓰기 상수 메모리 (44) (예를 들어, 상수 RAM), GPR (예를 들어 GPR (26)) 또는 uGPR (예를 들어, uGPR (27)) 에 저장될 수도 있다. 쉐이더 코어 (24) 의 로드 유닛은 상수들을 상수 메모리 (44) 에 로드할 수도 있다. 쉐이더 코어 (24) 의 로드 유닛에 대한 명령들은 퍼-쉐이더 프리앰블 코드 블록 내에서 발견될 수도 있으며, 상수들로 하여금 시스템 메모리 (16) 로부터 GPU (14) 상의 온칩 상수 메모리로 로드될 수 있게 할 수도 있다.
일부 예에서, 쉐이더 프리앰블은 쉐이더 코어 (24) 상의 스칼라 프로세서 (예를 들어, 단일 산술 로직 유닛 (ALU)) 에 의해 실행될 수도 있다. 다른 예에서, 쉐이더 프리앰블은 쉐이더 코어 (24) (종종 벡터 프로세서라 칭함) 의 병렬 프로세싱 엘리먼트들에 의해 실행될 수도 있다. 쉐이더 프리앰블을 실행의 결과로 상수 값 또는 값들의 세트가 얻어질 수도 있다. 상수 값 프리앰블 결과는 온칩 메모리에, 이를테면, uGPR (27), 상수 메모리 (44) (예를 들어, 상수 RAM), GPU 메모리 (42), 또는 시스템 메모리 (16) 에 저장될 수도 있다. 상수 메모리 (44) 는 uGPR (27) 또는 GPR (26) 에 유지된 값과 같은 특정한 워프 또는 스레드를 위해 예약된 바로 특정 부분보다는 쉐이더 코어 (24) 의 모든 엘리먼트들에 의해 액세스 가능한 메모리를 포함할 수도 있다. 또한, 상수 메모리 (44) 는 각각의 워프 전에 데이터로 다시 로드될 필요가 있기 보다는 워프들간에 데이터를 지속적으로 저장할 수도 있다. 쉐이더의 실행의 후속 워핑의 실행 동안, 쉐이더 프로그램들 (32, 34, 또는 36) 의 실행의 제 1 워프 동안 계산된 상수 값들 (즉, 프리앰블 결과들) 은 중복 코드를 실행하기보다는 상수 메모리 (44) 로부터 취출될 수도 있다. GPU (14) 는 쉐이더의 제 1 워프만이 쉐이더 프리앰블을 실행하도록 보장할 수도 있다. GPU (14) 는 쉐이더의 제 1 워프만이 온칩 내부 상태 레지스터, 상수 메모리 (44) 또는 GPU 메모리 (42) 에서 플래그를 통해 쉐이더 프리앰블을 실행하도록 보장할 수도 있다. GPU (14) 는 또한 제 1 워프로서 쉐이더 프리앰블의 실행을 시작한 워프를 추적할 수도 있다. 현재의 워프가 제 1 워프 (또는, 다른 예에서는 그것은 제 1 워프가 아님) 임을 나타내는 플래그는 GPU (14) 에 의해, 온칩 내부 상태 레지스터, 상수 메모리 (44) 또는 GPU 메모리 (42) 에 값으로서 저장될 수도 있다. GPU (14) 는 또한 제 1 워프가 쉐이더 프리앰블 명령들의 실행을 완료했는지 여부를 추적할 수도 있다. 제 1 워프가 쉐이더 프리앰블 명령들의 실행을 완료했음 (또는 또 다른 예에서는 완료하지 않았음) 을 나타내는 플래그는 GPU (14) 에 의해, 온칩 내부 상태 레지스터, 상수 메모리 (44) 또는 GPU 메모리 (42) 에 저장될 수도 있다. 쉐이더 코어 (24) 는 쉐이더 프리앰블을 실행할지 (예를 들어, 이것이 첫번째 워프이거나 및/또는 프리앰블이 이전에 실행되지 않았다면) 또는 안할지 (예를 들어, 이것이 첫번째 워프가 아니거나 및/또는 프리앰블은 이전에 실행되었다면) 를 결정하기 위해 이들 플래그들을 이용할 수 있다. 쉐이더 코어 (24) 는 또한 쉐이더 프리앰블의 실행의 완료 및 GPU (14) 에 의한 상수 메모리 (44), GPU 메모리 (42) 또는 uGPR (27) 에서 프리앰블의 상수 결과들의 로드 때까지 쉐이더 프로그램 (32, 34 또는 36) 의 스레드들의 두번째 워프의 실행을 지연시킬 수도 있다.
일례에서, 각 유형의 쉐이더 코어 (24) 는 온칩 내부 상태 레지스터에 저장된 콘텍스트(예를 들어, 플래그) 비트들에 액세스할 수 있다. 쉐이더 코어 (24) 는 현재 워프가 첫번째 워프이거나/아니거나 및/또는 쉐이더 코어 (24) 상의 워프 (또는 무 워프) 가 프리앰블을 실행하기 시작했음을 나타낼 수도 있는 1- 비트 preamble_token_taken 콘텍스트 비트를 가질 수도 있다. 이들 비트들 양자 모두는 특정 유형의 쉐이더 (예를 들어, 쉐이더 코어 (24)) 가 로드될 때 거짓 (false) 인 것으로 초기화될 수도 있다. 예를 들어, 주어진 쉐이더 코어 (24) 또는 쉐이더 유형에서 SHPS (예를 들어, 쉐이더 프리앰블 시작) 명령을 실행하기 위한 첫번째 워프는 preamble_token_taken 플래그가 거짓임을 발견한다. 쉐이더 코어 (24) 는 preamble_token_taken 플래그를 참인 것으로 설정할 것이다. 첫번째 워프가 SHPE (예를 들어, 쉐이더 프리앰블 종료) 명령을 실행할 때, 쉐이더 코어 (24) 는 preamble_completed 플래그를 참인 것으로 설정한다. 그런 다음 쉐이더 코어 (24) 는 메인 쉐이더 명령 레이블로부터 코드를 계속 실행할 것이다. 첫번째가 아닌 워프에서, preamble_token_taken 플래그는 참인 것으로 설정될 수도 있다. 모든 후속 워프들은 메인 코드 섹션 (예를 들어, MAIN 라벨)으로 분기하고, preamble_completed 플래그가 거짓에서 참으로 변할 때까지 거기서 기다린다. preamble_completed 플래그의 변경이 거짓에서 참으로 변경될 때, 쉐이더 코어 (24) 는 후속 웨이브들을 실행한다.
도 3은 쉐이더 프리앰블 (39) 을 포함하는 명령 세트 (37) 를 보여주는 개념도이다. 이 예에서, 쉐이더 프리앰블 (39) 은 SHPS (shader preamble start instruction) 명령을 포함한다. preamble_token_taken 플래그가 참인 것으로 설정되면 쉐이더 프리앰블 시작 명령은 (예를 들어, 메인 쉐이더 명령들 (41) 에서) "Label_MAIN" 레이블로 분기하여 쉐이더 프리앰블로 하여금 단일 회만 실행되게 할 것이다. 또한, 그 명령은, preamble_token_taken 플래그가 거짓으로 설정된 경우에, preamble_token_taken 플래그를 참으로 설정하도록 쉐이더 코어 (24) 에 명령할 수도 있다.
명령 (예 : ADD z, y, x 명령) 은 쉐이더 코드에서 중복 명령을 나타낸다. 명령이 실행될 수도 있다 (예를 들어, "ADD z, y, x;" 는 "x" 와 "y" 에서의 값들을 함께 가산하고 그 결과 값을 "z" 에 저장한다). 각각의 중복 명령들이 마찬가지로 실행된다. 중복 값들은 상수 메모리 (44) 에 예를 들어, 상수 메모리에 데이터 저장 명령을 통해 세이브될 수도 있다 (예를 들어, "STC c[5], z" 는 "z" 에서의 값을 상수 RAM 로케이션 5에 저장한다). 중복 값들은 또한 uGPR (27) 또는 GPR (26) 로 이동될 수도 있다.
그 다음의 예시적인 명령은, 예를 들어, 상수 로드 명령을 통해 상수 버퍼로부터 상수 메모리 (44) 로 다수의 상수를 로드할 수도 있다 (예를 들어, "LDC c[10], index, CB1, 4;" 는 상수 버퍼 (CB) 1 로부터 4개의 상수들을 로케이션 10 에서 시작하는 상수 RAM 으로 로드할 것이다.) 쉐이더 프리앰블 (39) 은 SHPE (shader preamble end instruction) 으로 닫힌다. 특정 구현에서, 쉐이더 프로그램 (32, 34 또는 36) 에서 단일 쉐이더 프리앰블 시작 및 쉐이더 프리앰블 종료 명령만이 있을 수도 있다. 쉐이더 프리앰블 (39) 다음에 메인 쉐이더 명령들 (41) 이 있다.
쉐이더 프리앰블 (39) 내의 명령들은 쉐이더의 모든 스레드들에 대해 동일한 결과를 산출하는 명령들을 포함할 수 있고 (예를 들어, 그러한 명령들은 상수 값들에 대해서만 동작하기 때문에) 그리고 쉐이더 실행의 워프들 사이에서 변하지 않는다. 이들 명령들은 컴파일러 (38) 에 의해 식별될 수도 있다.
다음으로, 쉐이더 프리앰블 (39) 은 쉐이더 프로그램 (32, 34 또는 36) 의 실행의 워프들의 수에 관계 없이 단일 회만 실행된다. 메인 쉐이더 명령들 (41) 은 각각의 워프에 대해 따로따로 실행된다. 쉐이더 프리앰블 (39) 의 실행시에 생성된 결과들은 메인 쉐이더 명령들 (41) 의 실행에 이용되고 상수 메모리 (44) 에 저장될 수도 있다. 실행시, 쉐이더 코어 (24) 는, 다양한 플래그들을 이용하여 쉐이더 프리앰블 (39) 이 실행되었고 따라서 쉐이더 프리앰블 (39) 의 프리앰블 코드를 2번째로 실행할 필요가 없는지 여부를 결정하고 상수 메모리 (44) 내에 저장된 쉐이더 프리앰블 (39) 의 실행의 결과(들) 이 있는 곳을 결정할 수도 있다. 다양한 플래그들은 현재 워프가 첫번째 워프라는 것 (또는 또 다른 예에서는 첫번째 워프가 아님) 임을 나타내는 플래그 및 첫번째 워프가 쉐이더 프리앰블 명령들의 실행을 완료했음 (또는 또 다른 예에서는 그렇지 않음) 을 표시하는 플래그를 포함할 수도 있다. 이들 플래그는 GPU (14) 에 의해, 온칩 내부 상태 레지스터, 상수 메모리 (44) 또는 GPU 메모리 (42) 에 저장될 수도 있다.
쉐이더 프리앰블 (39) 은 메인 쉐이더 명령들 (41) 전에 쉐이더 코드 (37) 의 처음에 있는 것으로 나타나 있지만, 오직 쉐이더 프리앰블 시작 명령 (예를 들어, SHPS) 및 쉐이더 프리앰블 종료 명령 (SHPE) 에 의해 범위가 정해지는 쉐이더 코드 (37) 내부에 산재될 수도 있다. 또한, 쉐이더 프리앰블은 제어 흐름 내부에 있을 수도 있다. 쉐이더 프리앰블이 제어 흐름 내부에 있으면, 프리앰블을 실행하기 위한 웨이브가 쉐이더의 첫 번째 웨이브가 아닐 수도 있다.
도 4는 GPU 의 쉐이더 코어의 GPR 에서의 데이터 저장의 일례를 나타내는 개념도이다. 나타낸 바와 같이, GPU (14) 는 쉐이더 코어 (24) 를 포함하고, 쉐이더 코어 (24) 는 GPR (26) 을 포함한다. 예로서, 쉐이더 코어 (24) 는 32 개의 프로세싱 엘리먼트들을 포함할 수도 있고, 각각은 하나의 그래픽스 아이템을 프로세싱하기 위해 쉐이더 프로그램의 하나의 인스턴스를 실행할 수도 있다. GPR (26) 은 그래픽스 아이템을 위한 데이터를 저장할 수도 있다. 예를 들어, GPR (26) 은 32개의 그래픽스 아이템을 위한 9개의 속성에 대한 속성 데이터를 저장할 수도 있다. 그러나, GPR (26) 은 32개의 그래픽스 아이템을 위한 9개보다 많거나 적은 속성에 대한 데이터를 저장할 수도 있다. 또한, GPR (26) 은 그래픽 아이템들의 속성과 연관되지 않은 데이터를 저장할 수도 있지만, 그래픽스 아이템들을 프로세싱하는데 필요한 변수를 위한 데이터이다.
도 4에 나타낸 예에서, 그래픽스 아이템은 P0-P31 로서 식별되며, 이는 버텍스들일 수도 있다. 속성은 그래픽스 아이템 식별자 뒤에 오는 변수에 의해 식별된다. 예를 들어 P0.X는 P0 그래픽 아이템에 대한 x 좌표를 나타내고 P0.Y는 P0 그래픽스 아이템에 대한 y 좌표를 나타내는 등이다. P0.R, P0.G, P0.B, 및 P0.A 는 각각, P0 그래픽스 아이템의 적색 컴포넌트, 녹색 컴포넌트, 청색 컴포넌트 및 불투명도를 나타낸다. 다른 그래픽스 아이템들 (예를 들어, P1-P31) 도 유사하게 식별된다.
바꾸어 말하면, 도 4에서, 버텍스들 P0-P31 은 각각 복수의 변수들과 연관된다. 일례로서, 버텍스들 P0-P31 의 각각은 x-좌표 (P0.X 내지 P31.X) 를 식별하는 변수와 연관된다. 버텍스들 P0-P31 각각은 y-좌표 (P0.Y 내지 P31Y) 를 식별하는 변수와 연관되는 등이다. 이들 변수들의 각각의 변수는 복수의 그래픽스 아이템들의 각각을 프로세싱하기 위해 필요하다. 예를 들어, x-좌표를 식별하는 변수는 버텍스들 P0-P31 의 각각을 프로세싱하는데 필요하다.
또한, 도 4에 나타낸 바와 같이, 그래픽스 아이템들의 각각은 또한 PRJ 속성을 포함한다. PRJ 속성은 쉐이더 코어 (24) 의 프로세싱 엘리먼트들에서 실행하는 버텍스 쉐이더가 활용할 수도 있는 투영 행렬 (projection matrix) 이다. 이 예에서, PRJ 속성은 각각의 버텍스들 P0-P31 을 프로세싱하는데 필요한 또 다른 변수이다. 예를 들어, 버텍스 쉐이더는 투영 행렬과 각각의 좌표를 승산할 수도 있다 (예를 들어, P0.PRJ 와 P0.X, P0.Y, P0.Z, 및 P0.W 를 승산한다).
GPU (14) 가 데이터 (예를 들어, 값) 를 저장할 수도 있는 다양한 유닛들이 있을 수도 있다는 것을 이해해야 한다. GPU (14) 는 시스템 메모리 (16) 에 데이터를 저장할 수도 있거나 또는 로컬 메모리 (예를 들어, 캐시) 에 데이터를 저장할 수도 있다. 쉐이더 코어 (24) 의 GPR (26) 은 시스템 메모리 (16) 및 GPU (14) 의 로컬 메모리 양자 모두와 구별된다. 예를 들어, 시스템 메모리 (16) 는 디바이스 (10) 의 다양한 컴포넌트들에 의해 액세스 가능하고, 이들 컴포넌트들은 시스템 메모리 (16) 를 사용하여 데이터를 저장한다. GPU (14) 의 로컬 메모리는 GPU (14) 의 다양한 컴포넌트들에 의해 액세스 가능하며, 이들 컴포넌트들은 GPU (14) 의 로컬 메모리를 사용하여 데이터를 저장한다. 그러나, GPR (26) 은 쉐이더 코어 (24) 의 컴포넌트들에 의해서만 액세스 가능할 수도 있고, 쉐이더 코어 (24) 의 프로세싱 엘리먼트를 위한 데이터만을 저장할 수도 있다.
일부 예들에서, 그래픽 워프 내의 그래픽스 아이템들의 하나 이상의 변수들은 그래픽 워프에 걸쳐 균일하다. 이러한 예들에서, GPR (26) 에 각 스레드/파이버에 대한 개별 엔트리들에서 하나 이상의 변수들을 위한 균일 데이터를 저장하기 보다는, GPU (14) 는 상수 메모리 (44) 에 또는 워프/웨이브에서 모든 스레드/파이버에 의해 액세스 가능한 uGPR (27) 에 균일 데이터를 단일 회 저장할 수도 있다.
일 예에서, uGPR (27) 은 복수의 저장 로케이션들을 포함할 수도 있으며, 여기서 각각의 저장 로케이션는 그래픽스 아이템의 복수의 속성들 중 하나의 속성과 연관된다. 예를 들어, 도 4 에 나타낸 바와 같이, 각 그래픽스 아이템 P0-P31 은 9개의 속성들 (PRJ, x, y, z, w, R, G, B, 및 A) 를 포함한다. 이 예에서, uGPR (27) 은 9 개의 저장 로케이션들을 포함할 수도 있으며, 여기서 uGPR (27) 의 첫번째 로케이션은 PRJ 속성과 연관되고, uGPR (27) 의 두번째 로케이션은 x 좌표와 연관되는 등이다. 다시, uGPR (27) 에 있는 데이터는 워프의 각 스레드에 의해 사용될 수도 있다.
상수들은 시스템 메모리 내 상수 버퍼에 저장될 수도 있다. 상수 로드 명령들은 컴파일러로 하여금 시스템 메모리로부터 상수 메모리 (44) 로 상수를 로드할 수 있게 하는데 이용될 수도 있다. 상수 메모리 (44) 가 가득차면 상수들은 또한 GPR (26) 및 uGPR (27) 에 저장될 수도 있다.
전통적으로, 데이터는 워프들간에 세이브될 수 없다. 일부 예에서, GPR (26) 및 uGPR (27) 은 각각의 웨이브에 대해 재로드되거나 또는 재계산된다. 상수 메모리 (44) 는 워프들간에 세이브될 수도 있다. 그러나, 쉐이더 코어 (24) 는 첫번째 워프 동안 프리앰블 명령들에 액세스하고 이들을 실행할 수도 있다. 명령들이 실행된 후에, 후속 워프들은 상수 메모리 (44) 에 있는 이들 명령들의 결과에 액세스할 수도 있다.
도 5는 본 개시의 균일한 술어 (predicate) 들을 위한 기술들을 구현하는데 사용될 수도 있는 GPU (14) 의 예시적인 구성을 나타내는 블록도이다. GPU (14) 는 프로그램을 위한 명령들을 병렬 방식으로 실행하도록 구성된다. GPU (14) 는, 제어 유닛 (72), 프로세싱 엘리먼트들 (74A-74D) (총칭하여 "프로세싱 엘리먼트들 (74)"), 명령 스토어 (76), GPR (26), 상수 메모리 (44), uGPR (27), 상태 레지스터 (92), 통신 경로 (80, 82, 84, 86A-86D), 및 로드 유닛 (90) 을 포함하는, 쉐이더 코더 (24) 를 포함한다. 통신 경로 (86A-86D) 는 총칭하여 "통신 경로 (86)" 로 지칭될 수도 있다. 일부 예에서, GPU (14) 는 프로세싱 엘리먼트 (74) 를 사용하여 프로그램의 워프 (예를 들어, 쉐이더) 에 대한 복수의 실행 스레드들을 실행하도록 구성된 단일 명령, 다중 데이터 (SIMD) 프로세싱 시스템으로서 구성될 수도 있다. 이러한 SIMD 시스템에서, 프로세싱 엘리먼트들 (74) 은 상이한 데이터 아이템들에 대해 한번에 단일 명령을 함께 프로세싱할 수도 있다. 프로그램과 연관된 모든 스레드들이 실행을 완료한 후에 프로그램이 리타이어 (retire) 될 수도 있다.
제어 유닛 (72) 은 통신 경로 (80) 를 통해 명령 스토어 (76) 에, 통신 경로 (82) 를 통해 프로세싱 엘리먼트 (74) 에, 그리고 통신 경로 (84) 를 통해 GPR (26) 에 통신 가능하게 커플링된다. 제어 유닛 (72) 은 통신 경로 (80) 를 사용하여 명령 스토어 (76) 에 읽기 명령들을 전송할 수도 있다. 읽기 명령은 명령이 취출되어야 하는 명령 스토어 (76) 에서 명령 어드레스를 지정할 수도 있다. 제어 유닛 (72) 은 읽기 명령을 전송하는 것에 응답하여 명령 스토어 (76) 로부터 하나 이상의 프로그램 명령들을 수신할 수도 있다. 제어 유닛 (72) 은 명령 스토어 (76) 로부터 쉐이더 프리앰블 (39) 및 메인 쉐이더 명령들 (41) 을 읽을 수도 있다. 제어 유닛 (72) 은 (온칩 상태 레지스터 (92), uGPR (27), 또는 GPR (26)에 저장된 플래그를 통해) 프리앰블이 이전에 실행되었는지 여부를 결정할 수도 있다. 제어 유닛은 (온칩 상태 레지스터 (92), uGPR (27), 또는 GPR (26)에 저장된 플래그를 통해) 현재 워프가 첫번째 워프인지 여부를 결정할 수도 있다. 또한, 제어 유닛 (72) 은 근본적 상태가 변화할 때 (예를 들어, 프리앰블이 실행되었거나 및/또는 현재 워프가 첫번째 워프가 아닐 때) 전술한 플래그들을 변경할 수도 있다. 제어 유닛 (72) 에 의한 전술한 플래그들의 사용은 프리앰블 코드가 단일 회만 실행되도록 그리고 프리앰블이 실행을 완료하기 전에 후속 (예를 들어, 두번째, 세번째 등) 워프들이 시작되지 않을 수 있도록 보장할 수도 있다. 제어 유닛 (72) 은 통신 경로 (82) 를 사용하여 프로세싱 엘리먼트 (74) 에 명령들을 제공할 수도 있고, 일부 예들에서, 프로세싱 엘리먼트 (74) 로부터 데이터, 예를 들어 분기 조건을 평가하기 위한 비교 명령의 결과를 수신할 수도 있다. 일부 예에서, 제어 유닛 (72) 은 예를 들어 분기 조건을 결정하기 위해 상태 레지스터 (92), uGPR (27), GPR (26) 또는 상수 메모리 (44) 로부터 데이터 아이템 값을 취출하기 위해 통신 경로 (84) 를 사용할 수도 있다. 도 5 는 GPU (14) 가 통신 경로 (84) 를 포함하는 것으로 나타내지만, 다른 예들에서, GPU (14) 는 통신 경로 (84) 를 포함하지 않을 수도 있다.
원래 상수 값은 시스템 메모리 (16) 내 상수 버퍼들에 저장될 수도 있다. 로드 유닛 (90) 은 제어 유닛 (72), 컴파일러 (38), 및/또는 그래픽스 드라이버 (40) 로부터의 명령들을 통해, 시스템 메모리 (16) 내 상수 버퍼로부터 상수 메모리 (44), uGPR (27) 또는 GPR (26) 로 상수 값을 로드할 수도 있다. 로드 유닛 (90) 은 상수 메모리 (44) 에 할당된 공간이 가득차면 uGPR (27) 에 상수들을 로드하도록 구성될 수도 있다.
각각의 프로세싱 엘리먼트들 (74) 은 명령 스토어 (76) 에 저장된 프로그램을 위한 명령들을 프로세싱하도록 구성될 수도 있다. 일부 예에서, 각각의 프로세싱 엘리먼트들 (74) 은 동일한 세트의 연산들을 수행하도록 구성될 수도 있다. 예를 들어, 각각의 프로세싱 엘리먼트들 (74) 은 동일한 명령 세트 아키텍처 (ISA) 를 구현할 수도 있다. 추가적인 예들에서, 각각의 프로세싱 엘리먼트들 (74) 은 산술 로직 유닛 (ALU) 일 수도 있다. 다른 예들에서, GPU (14) 는 벡터 프로세서로서 구성될 수도 있고, 각각의 프로세싱 엘리먼트들 (74) 은 벡터 프로세서 내의 프로세싱 엘리먼트일 수도 있다. 추가적인 예들에서, GPU (14) 는 SIMD 실행 유닛일 수도 있고, 각각의 프로세싱 엘리먼트들 (74) 은 SIMD 실행 유닛 내의 SIMD 프로세싱 엘리먼트일 수도 있다.
프로세싱 엘리먼트들 (74) 에 의해 수행되는 연산들은 산술 연산, 논리 연산, 비교 연산 등을 포함할 수도 있다. 산술 연산은 예를 들어, 가산 연산, 감산 연산, 승산 연산 등과 같은 연산을 포함할 수도 있다. 산술 연산은 또한, 예를 들어 정수 산술 연산 및/또는 부동 소수점 산술 연산을 포함할 수도 있다. 논리 연산들은, 예를 들어, 비트 단위 (bit-wise) AND 연산, 비트 단위 (bit-wise) OR 연산, 비트 단위 XOR 연산 등과 같은 연산들을 포함할 수도 있다. 비교 연산들은, 예를 들어, 초과 연산 (greater than operation), 미만 연산 (less than operation), 제로와 동일 연산 (equal to zero operation), 제로와 비동일 연산 (not equal to zero operation) 등과 같은 연산들을 포함할 수도 있다. 초과 및 미만 연산들은 제 1 데이터 아이템이 제 2 데이터 아이템을 초과하는지 또는 미만인지 여부를 결정할 수도 있다. 제로와 동일 및 제로와 비동일 연산들은 데이터 아이템이 0과 동일한지 또는 비동일한지 여부를 결정할 수도 있다. 연산들에 사용되는 피연산자는 GPR (26) 또는 uGPR (27) 에 포함된 레지스터에 저장될 수도 있다.
각각의 프로세싱 엘리먼트들 (74) 은 통신 경로 (82) 를 통해 제어 유닛 (72) 으로부터 명령을 수신하는 것에 응답하여 연산을 수행하도록 구성될 수도 있다. 일부 예에서, 각각의 프로세싱 엘리먼트들 (74) 은 다른 프로세싱 엘리먼트들 (74) 과는 독립적으로 활성화 및/또는 비활성화되도록 구성될 수도 있다. 이러한 예들에서, 각각의 프로세싱 엘리먼트들 (74) 은 각각의 프로세싱 엘리먼트 (74A-74D) 가 활성화될 때 제어 유닛 (72) 으로부터 명령을 수신하는 것에 응답하여 연산을 수행하도록, 그리고 각각의 프로세싱 엘리먼트 (74A-74D) 가 비활성화, 즉 활성화되지 않을 때 제어 유닛 (72) 으로부터 명령을 수신하는 것에 응답하여 연산을 수행하지 않도록 구성될 수도 있다.
각각의 프로세싱 엘리먼트들 (74A-74D) 은 각각의 통신 경로 (86A-86D) 를 통해 GPR (26) 에 통신 가능하게 커플링될 수도 있다. 프로세싱 엘리먼트들 (74) 은 GPR (26), uGPR (27) 및/또는 상수 메모리 (44) 로부터 데이터를 취출하고 통신 경로 (86) 를 통해 GPR (26), uGPR (27), 및/또는 상수 메모리 (44) 에 데이터를 저장하도록 구성될 수도 있다. GPR (26), uGPR (27) 및/또는 상수 메모리 (44) 로부터 취출된 데이터는, 일부 예들에서, 프로세싱 엘리먼트들 (74) 에 의해 수행되는 연산을 위한 피연산자일 수도 있다. GPR (26), uGPR (27) 및/또는 상수 메모리 (44) 에 저장된 데이터는, 일부 예들에서, 프로세싱 엘리먼트들 (74) 에 의해 수행되는 연산의 결과일 수도 있다.
명령 스토어 (76) 는 GPU (14) 에 의한 실행을 위한 프로그램을 저장하도록 구성된다. 프로그램은 명령들의 시퀀스로서 저장될 수도 있다. 이들 명령들은 쉐이더 프리앰블 (39) 및 메인 쉐이더 명령들 (41) 을 포함할 수도 있다. 일부 예들에서, 각각의 명령은 고유한 명령 어드레스 값에 의해 어드레싱될 수도 있다. 이러한 예들에서, 명령들의 시퀀스 내의 나중 명령들에 대한 명령 어드레스 값은 명령들의 시퀀스 내의 이전 명령들에 대한 명령 어드레스 값보다 크다. 일부 예에서, 프로그램 명령은 기계 수준 명령일 수도 있다. 즉, 그러한 예들에서, 명령들은 GPU (14) 의 ISA에 대응하는 포맷일 수도 있다. 명령 스토어 (76) 는 통신 경로 (80) 를 통해 제어 유닛 (72) 으로부터 읽기 명령을 수신하도록 구성된다. 읽기 명령은 명령이 취출되어야 하는 명령 어드레스를 지정할 수도 있다. 읽기 명령을 수신하는 것에 응답하여, 명령 스토어 (76) 는 읽기 명령에서 지정된 명령 어드레스에 대응하는 명령을 통신 경로 (80) 를 통해 제어 유닛 (72) 에 제공할 수도 있다.
명령 스토어 (76) 는 임의의 유형의 메모리, 캐시 또는 이들의 조합일 수도 있다. 명령 스토어 (76) 가 캐시일 때, 명령 스토어 (76) 는 GPU (14) 외부의 프로그램 메모리에 저장된 프로그램을 캐싱할 수도 있다. 명령 저장소 (76) 가 GPU (14) 내에 있는 것으로 나타나 있지만, 다른 예들에서, 명령 저장소 (76) 는 GPU (14) 의 외부에 있을 수도 있다.
GPR (26) 은 프로세싱 엘리먼트들 (74) 에 의해 사용되는 데이터 아이템들을 저장하도록 구성된다. 일부 예들에서, GPR (26) 은 복수의 레지스터를 포함할 수도 있으며, 각각의 레지스터는 GPU (14) 상에서 연산되는 복수의 데이터 아이템들 내에 각각의 데이터 아이템을 저장하도록 구성된다. GPR (26) 은 GPR (26) 내 레지스터들과 메모리 또는 캐시 (미도시) 사이에서 데이터를 전송하도록 구성된 하나 이상의 통신 경로들 (도시되지 않음) 에 커플링될 수도 있다.
uGPR (27) 은 프로세싱 엘리먼트들 (74) 에 의해 사용되는 데이터 아이템을 저장하도록 구성되고, uGPR (27) 내의 각 메모리 엘리먼트는 웨이브/워프의 다수의 프로세싱 엘리먼트들 (예를 들어 스레드/파이버) 에 의해 액세스 가능하도록 구성된다.
상태 레지스터 (92), uGPR (27) 또는 GPR (26) 은 제어 유닛 (72) 에 의해 사용되는 다수의 플래그들을 저장할 수도 있다. 상태 레지스터 (92), uGPR (27) 또는 GPR (26)에 저장된 플래그들은 프리앰블이 이전에 실행되었음을 나타내기 위한 플래그를 포함할 수도 있다. 이 플래그는 제어 유닛 (72) 으로 하여금, 쉐이더 프리앰블 (39) 이 완전히 실행되었고 그 실행의 결과들이 상수 메모리 (44), uGPR (27) 및/또는 GPR (26) 에 저장된 후에 시작할 워프 내의 스레드들의 프로세싱을 타이밍하는 것을 가능하게 할 수도 있다. 프리앰블이 이전에 실행되었다는 것을 나타내는 플래그는 처음에 상태 레지스터 (92), uGPR (27) 또는 GPR (26)에서 "오프" 로 설정될 수도 있다. 상태 레지스터 (92), uGPR (27), 또는 GPR (26) 은 또한 현재 워프가 첫번째 워프임을 나타내는 플래그를 포함할 수도 있다. 현재 워프가 첫번째 워프임을 나타내는 플래그는 처음에 "온" 으로 설정될 수도 있다.
도 5는 프로세싱 엘리먼트 (74) 에 의해 사용되는 데이터를 저장하기 위한 단일 GPR (26) 을 나타내지만, 다른 예들에서, GPU (14) 는 각각의 프로세싱 엘리먼트들 (74) 을 위한 별도의 전용 데이터 스토어들을 포함할 수도 있다. GPU (14) 는 예시적인 목적을 위해 4개의 프로세싱 엘리먼트들 (74) 을 나타낸다. 다른 예들에서, GPU (14) 는 동일하거나 또는 상이한 구성에서 더 많은 프로세싱 엘리먼트들을 가질 수도 있다.
제어 유닛 (72) 은 GPU (14) 를 제어하여 명령 스토어 (76) 에 저장된 프로그램을 위한 명령들을 실행하도록 구성된다. 프로그램의 각각의 명령 또는 명령들의 세트에 대해, 제어 유닛 (72) 은 통신 경로 (80) 를 통해 명령 스토어 (76) 로부터 명령을 취출하고 그 명령을 프로세싱할 수도 있다. 일부 예들에서, 제어 유닛 (72) 은 명령과 연관된 연산이 하나 이상의 프로세싱 엘리먼트들 (74) 상에서 실행되게 함으로써 명령을 프로세싱할 수도 있다. 예를 들어, 제어 유닛 (72) 에 의해 취출된 명령은 명령에 의해 지정된 데이터 아이템들에 대해 산술 연산을 수행하도록 GPU (14) 에 명령하는 산술 명령일 수도 있으며, 제어 유닛 (72) 은 하나 이상의 프로세싱 엘리먼트들 (74) 로 하여금 지정된 데이터 아이템들에 대한 산술 연산을 수행하게 할 수도 있다. 다른 예에서, 제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 상에서 연산이 수행되게 하지 않고 명령을 프로세싱할 수도 있다.
제어 유닛 (72) 은 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 에 명령을 제공함으로써 하나 이상의 프로세싱 엘리먼트들 (74) 상에서 연산이 수행되게 할 수도 있다. 그 명령은 프로세싱 엘리먼트들 (74) 에 의해 수행될 연산을 지정할 수도 있다. 하나 이상의 프로세싱 엘리먼트들 (74) 에 제공된 명령은 명령 스토어 (76) 로부터 취출된 명령과 동일하거나 또는 상이할 수도 있다. 일부 예에서, 제어 유닛 (72) 은, 연산이 수행되어야 하는 프로세싱 엘리먼트 (74) 의 특정 서브세트를 활성화하는 것 및 연산이 수행되어서는 안되는 프로세싱 엘리먼트들 (74) 의 또 다른 서브세트를 비활성화하는 것 중 하나 또는 양자 모두에 의해 (단일 프로세싱 엘리먼트에 의해서를 포함하는) 프로세싱 엘리먼트들 (74) 의 특정 서브세트에 대해 연산이 수행되게 할 수도 있다. 제어 유닛 (72) 은 각각의 활성화 및/또는 비활성화 신호를 통신 경로 (82) 를 통해 각각의 프로세싱 엘리먼트들 (74) 에 제공함으로써 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다. 일부 예들에서, 제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 에 명령을 제공하는 것과 함께 프로세싱 엘리먼트들 (74) 에 활성화 및/또는 비활성화 신호를 제공함으로써 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다. 다른 예들에서, 제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 에 명령을 제공하기 전에 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다. 제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 을 사용하여 프로그램을 위한 복수의 실행 스레드들을 실행할 수도 있다. 병렬로 실행될 복수의 스레드들은 때때로 워프 (warp) 라고 불린다. 각각의 프로세싱 엘리먼트들 (74) 은 복수의 스레드들 중 각각의 스레드에 대한 프로그램의 명령들을 프로세싱하도록 구성될 수도 있다. 예를 들어, 제어 유닛 (72) 은 프로세싱을 위해 프로세싱 엘리먼트들 (74) 중 개개의 하나에 각각의 실행 스레드를 할당할 수도 있다. 프로그램을 위한 실행 스레드는 데이터 아이템 세트 내의 상이한 데이터 아이템들에 대해 동일한 명령 세트를 실행할 수도 있다. 예를 들어, 프로세싱 엘리먼트 (74A) 는 복수의 데이터 아이템들에서 제 1 서브세트의 데이터 아이템들에 대해 명령 스토어 (76) 에 저장된 프로그램을 위한 제 1 실행 스레드를 실행할 수도 있고, 프로세싱 엘리먼트 (74B) 는 복수의 데이터 아이템들에서 제 2 서브세트의 데이터 아이템들에 대해 명령 스토어 (76) 에 저장된 프로그램을 위한 제 2 실행 스레드를 실행할 수도 있다. 제 1 실행 스레드는 제 2 실행 스레드와 동일한 명령들을 포함할 수도 있지만, 데이터 아이템들의 제 1 서브세트는 데이터 아이템들의 제 2 서브세트와 상이할 수도 있다. 프로세싱 엘리먼트들 (74) 은 메인 쉐이더 명령 (41) 들을 실행할 수도 있다. 프로세싱 엘리먼트들 (74) 은 쉐이더 프리앰블 (39) 을 실행할 수도 있다. 또 다른 예에서, 쉐이더 코어 (24) 는 통신 경로 (88) 를 통해 별도의 스칼라 프로세싱 유닛 (94) 을 이용하여 쉐이더 프리앰블 (39) 의 명령들을 실행할 수도 있다.
스칼라 프로세싱 유닛 (94) 은 한번에 하나의 데이터 아이템에 대해 연산하도록 구성된 임의의 유형의 프로세서일 수도 있다. 프로세싱 엘리먼트들 (74) 과 같이, 스칼라 프로세싱 유닛 (94) 은 ALU를 포함할 수도 있다. 스칼라 프로세싱 유닛 (94) 에 의해 수행되는 연산들은 산술 연산, 논리 연산, 비교 연산 등을 포함할 수도 있다. 산술 연산은 예를 들어, 가산 연산, 감산 연산, 승산 연산, 제산 연산 등과 같은 연산을 포함할 수도 있다. 산술 연산은 또한, 예를 들어 정수 산술 연산 및/또는 부동 소수점 산술 연산을 포함할 수도 있다. 논리 연산들은, 예를 들어, 비트 단위 AND 연산, 비트 단위 OR 연산, 비트 단위 XOR 연산 등과 같은 연산들을 포함할 수도 있다. 비교 연산들은, 예를 들어, 초과 연산, 미만 연산, 제로와 동일 연산, 제로와 비동일 연산 등과 같은 연산들을 포함할 수도 있다. 초과 및 미만 연산들은 제 1 데이터 아이템이 제 2 데이터 아이템을 초과하는지 또는 미만인지를 결정할 수도 있다. 제로와 동일 및 제로와 비동일 연산들은 데이터 아이템이 0과 동일한지 또는 비동일한지 결정할 수도 있다. 연산들에 사용되는 피연산자는 GPR (26)에 포함된 레지스터에 저장될 수도 있다.
프리앰블 명령의 결과를 참조하는 쉐이더 명령이 실행될 때, 쉐이더 프리앰블 명령을 다시 실행하는 대신 GPR (26) 로부터 (상수) 결과가 취출된다.
도 6 는 본 개시의 기법들에 따른 예시적인 방법을 나타내는 플로우차트이다. 도 6의 기술들은 GPU (14) 및/또는 프로세서 (12) 중 하나 이상에 의해 구현될 수도 있다 (도 1 및 도 2 참조).
본 개시의 일례에서, GPU (14) 는 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 쉐이더 컴파일러 (38) 로부터 수신하도록 구성될 수도 있다 (100). 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하고, 그 하나 이상의 결과들은 쉐이더 프로그램을 실행하는 복수의 스레드 그룹 (예를 들어, 웨이브/워프) 각각에 대해 동일한 하나 이상의 결과들일 수도 있다. GPU (14) 는 하나 이상의 결과들을 산출하기 위해 프리앰블 코드 블록을 실행하도록 추가로 구성될 수도 있다 (102). 프리앰블 코드 블록은 GPU (14) 상의 스칼라 프로세싱 유닛 (94) 에 의해 실행될 수도 있다. 프리앰블 코드 블록은 상수 값으로 평가될 수도 있다.
GPU (14) 는 또한 프리앰블 코드 블록의 하나 이상의 결과들을 저장하도록 구성될 수도 있다 (104). 그 결과들은 온칩 랜덤 액세스 메모리 (RAM) 에 저장될 수도 있다. 온칩 RAM 은 복수의 스레드 그룹들의 각각에 의해 액세스 가능할 수도 있고 쉐이더 코어 (24) 의 모든 프로세싱 엘리먼트들에 의해 액세스 가능할 수도 있다. 온칩 RAM 은 메인 버스에 액세스하지 않고 GPU (14) 에 의해 액세스 가능할 수도 있다. 온칩 RAM 은 쓰기 가능한 버퍼 관리 캐시를 포함할 수도 있다. GPU (14) 가 쉐이더의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록의 결과를 저장하는 것을 완료했다고 결정할 시에, GPU (14) 는 프리앰블 코드 블록을 실행하는 것에 의해 산출되는 하나 이상의 결과들을 이용하여 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 메인 쉐이더 코드 블록을 실행하도록 구성될 수도 있다 (106). 본 개시의 일례에서, GPU (14) 는 쉐이더 프리앰블 시작 명령을 식별하는 것에 기초하여 프리앰블 코드 블록을 식별하도록 구성될 수도 있다.
본 발명의 다른 예에서, GPU (14) 는 제 1 스레드 그룹에 의해 프리앰블 코드 블록이 실행되었는지 여부를 추적하여 쉐이더로 하여금 복수의 스레드 그룹들 중 후속 스레드 그룹을 실행할 수 있게 하도록 구성될 수도 있다. GPU (14) 는 또한 복수의 스레드 그룹들 중 어느 스레드 그룹이 제 1 스레드 그룹 이전에 실행되었는지 여부를 추적하여, 적어도 부분적으로, 프리앰블 코드 블록이 이전에 실행되었는지 여부를 결정하도록 구성될 수도 있다. GPU (14) 는 또한 프리앰블 코드 블록이 실행되었는지 여부를 추적하여, 적어도 부분적으로, 프리앰블 코드 블록을 실행할지 여부를 결정하도록 구성될 수도 있다. 본 개시의 추가적인 예에서, GPU (14) 는 시스템 RAM (예를 들어, 비 온칩 RAM) 에 위치한 상수 버퍼로부터 온칩 상수 메모리로의 프리앰블 코드 블록의 하나 이상의 결과들을 로드하도록 구성될 수도 있다.
프로세서 (12) 상에서 실행되는 쉐이더 컴파일러 (예를 들어, 컴파일러 (38)) 는 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과인 하나 이상의 결과들을 산출하도록 실행 가능한 명령들의 코드 블록을 식별할 수도 있다. 프로세서 (12) 상에서 실행되는 쉐이더 컴파일러 (예를 들어, 컴파일러 (38)) 는 명령들의 코드 블록을 쉐이더 프로그램의 프리앰블 코드 블록으로 그룹화할 수도 있다. 이러한 그룹화는 GPU (14) 에 의해 사용될 수도 있다. 쉐이더 명령들의 복수의 스레드 그룹들에 공통되는 명령들의 코드 블록의 식별은 상수로 평가되는 명령들의 식별을 포함할 수도 있다. 식별 가능한 코드 블록은 프리앰블 코드로 조직될 수도 있다. 프리앰블 코드는 복수의 스레드 그룹들 중 제 1 스레드 그룹에 의해 실행되도록 구성될 수도 있다. 실행된 프리앰블 코드의 하나 이상의 결과들은 복수의 스레드 그룹들 중 다른 그룹들에 의해 이용 가능할 수도 있다.
도 7 는 본 개시의 기법들에 따른 예시적인 방법을 나타내는 플로우차트이다. 도 7의 기술들은 GPU (14) 및/또는 프로세서 (12) 중 하나 이상에 의해 구현될 수도 있다 (도 1 및 도 2 참조).
프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 쉐이더 코드를 수신할 수도 있다 (200). 프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 상수로 평가되는 명령들을 식별할 수도 있다 (202). 프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 명령들을 쉐이더 프리앰블로 그룹화할 수도 있다 (204). 쉐이더 프리앰블은 쉐이더 프리앰블 시작 및 쉐이더 프리앰블 종료 커맨드에 의해 기술될 수도 있다. 프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 쉐이더 코드에 있는 명령들을 오브젝트 코드로 변환할 수도 있다 (206). 이러한 오브젝트 코드는 GPU (14) 상에서 실행되도록 구성된다. 프로세서 (12) 상에서 실행되는 컴파일러 (38) 는 쉐이더 코어 (24) 상에서 실행하기 위해 오브젝트 코드를 GPU (14) 에 전송할 수도 있다.
하나 이상의 예들에서, 설명된 기능들은 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현되면, 그 기능들은 컴퓨터 판독가능 매체 상에 하나 이상의 명령들 또는 코드로서 저장되거나 송신될 수도 있고 하드웨어 기반 프로세싱 유닛에 의해 실행될 수도 있다. 컴퓨터 판독가능 매체는, 데이터 저장 매체와 같은 유형의 매체에 대응하는, 컴퓨터 판독가능 저장 매체를 포함할 수도 있다. 이러한 방식으로, 컴퓨터 판독가능 매체는 일반적으로 비일시적인 유형의 컴퓨터 판독가능 저장 매체에 대응할 수도 있다. 데이터 저장 매체는, 본 개시에서 설명된 기법들의 구현을 위해 명령들, 코드 및/또는 데이터 구조들을 취출하기 위하여 하나 이상의 컴퓨터들 또는 하나 이상의 프로세서들에 의해 액세스될 수 있는 임의의 가용 매체일 수도 있다. 컴퓨터 프로그램 제품은 컴퓨터 판독가능 매체를 포함할 수도 있다.
예로서, 그리고 비제한적으로, 이러한 컴퓨터 판독가능 저장 매체들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광학 디스크 저장, 자기 디스크 저장, 또는 다른 자기 저장 디바이스들, 플래시 메모리, 또는 명령들 또는 데이터 구조들의 형태로 희망하는 프로그램 코드를 저장하기 위해 이용될 수 있으며 컴퓨터에 의해 액세스될 수 있는 임의의 다른 매체를 포함할 수 있다. 컴퓨터 판독가능 저장 매체 및 데이터 저장 매체는, 캐리어 파, 신호 또는 다른 일시적 매체를 포함하는 것이 아니라, 대신에 비일시적, 유형의 저장 매체로 향하게 된다는 것이 이해되야 한다. 여기에 사용된, 디스크 (disk) 및 디스크 (disc) 는 CD (compact disc), 레이저 디스크 (laser disc), 광 디스크 (optical disc), DVD (digital versatile disc), 플로피 디스크 (floppy disk) 및 블루레이 디스크 (Blu-ray disc) 를 포함하며, 여기서, 디스크 (disk) 는 보통 데이터를 자기적으로 재생하지만, 디스크 (disc) 는 레이저를 이용하여 광학적으로 데이터를 재생한다. 또한, 상기의 조합은 컴퓨터 판독가능 매체의 범위 내에 포함되어야 한다.
명령들은 하나 이상의 프로세서, 이를테면 하나 이상의 DSP (digital signal processor), 범용 마이크로프로세서, ASIC (application specific integrated circuit), FPGA (field programmable logic array), 또는 다른 등가 집적 또는 이산 로직 회로에 의해 실행될 수도 있다. 따라서, 본원에 사용된 용어 "프로세서" 는 전술한 구조 중 임의의 것 또는 본원에 설명된 기법들의 구현에 적합한 임의의 다른 구조를 지칭할 수도 있다. 추가로, 일부 양태들에서, 여기서 설명된 기능은 인코딩 및 디코딩을 위해 구성된 전용 하드웨어 및/또는 소프트웨어 모듈들 내에 제공되거나 또는 결합된 코덱에 포함될 수도 있다. 또한, 그 기법들은 하나 이상의 회로 또는 로직 엘리먼트들에서 완전히 구현될 수 있다.
본 개시의 기법들은 무선 핸드셋, 집적 회로 (IC) 또는 IC 들의 세트 (예를 들면, 칩 세트) 를 포함하여, 광범위하게 다양한 디바이스들 또는 장치들에서 구현될 수도 있다. 다양한 컴포넌트들, 모듈들 또는 유닛들이, 개시된 기술들을 수행하도록 구성된 디바이스들의 기능적인 양태들을 강조하기 위하여 본 개시에 설명되었지만, 상이한 하드웨어 유닛들에 의한 실현을 반드시 필요로 하는 것은 아니다. 오히려, 상술된 바처럼, 다양한 유닛들이 코덱 하드웨어 유닛에 결합될 수도 있거나, 또는 적합한 소프트웨어 및/또는 펌웨어와 함께, 상술된 하나 이상의 프로세서들을 포함하는 연동적인 (interoperative) 하드웨어 유닛들의 집합에 의해 제공될 수도 있다.
다양한 예들이 설명되었다. 이들 및 다른 예들은 다음의 청구항들의 범위 내에 있다.

Claims (30)

  1. 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법으로서,
    쉐이더 컴파일러로부터 상기 GPU 에 의해, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 단계로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하는 단계;
    상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서 상기 GPU 에 의해, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하는 단계;
    상기 GPU에 의해, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 단계로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하는 단계; 및
    상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 GPU 에 의해, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 상기 메인 쉐이더 코드 블록을 실행하는 단계
    를 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  2. 제 1 항에 있어서,
    프로세서 상에서 실행되는 상기 쉐이더 컴파일러에 의해, 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 상기 동일한 하나 이상의 결과들인 상기 하나 이상의 결과들을 산출하도록 실행 가능한 명령들의 코드 블록을 식별하는 단계; 및
    상기 프로세서 상에서 실행되는 상기 쉐이더 컴파일러에 의해, 상기 명령들의 코드 블록을 상기 쉐이더 프로그램의 상기 프리앰블 코드 블록으로 그룹화하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  3. 제 2 항에 있어서,
    상기 명령들의 코드 블록의 식별은 상수로 평가되는 명령들의 식별을 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  4. 제 1 항에 있어서,
    쉐이더 프리앰블 시작 명령을 식별하는 것에 기초하여 상기 프리앰블 코드 블록을 식별하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  5. 제 1 항에 있어서,
    상기 제 1 스레드 그룹에 의해 상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여 상기 GPU 로 하여금 상기 복수의 스레드 그룹들 중 후속 스레드 그룹을 실행할 수 있게 하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  6. 제 1 항에 있어서,
    상기 복수의 스레드 그룹들 중 어느 스레드 그룹이 상기 제 1 스레드 그룹 이전에 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록이 이전에 실행되었는지 여부를 결정하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  7. 제 1 항에 있어서,
    상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록을 실행할지 여부를 결정하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  8. 제 1 항에 있어서,
    상기 프리앰블 코드 블록의 실행은 상기 GPU 상의 스칼라 프로세서에 의해 실행되는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  9. 제 1 항에 있어서,
    상기 하나 이상의 결과들의 저장은 쓰기 가능한 버퍼 관리 캐시에 있는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  10. 제 1 항에 있어서,
    상기 하나 이상의 결과들의 저장은 쉐이더 프로세서의 모든 프로세싱 엘리먼트들에 의해 액세스 가능한, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  11. 제 1 항에 있어서,
    상기 프리앰블 코드 블록은 하나 이상의 상수 결과들로 평가하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  12. 제 1 항에 있어서,
    상기 GPU 에 의해, 랜덤 액세스 메모리 (RAM) 로부터 상수 메모리로 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 로드하는 단계를 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키는 방법.
  13. 데이터를 프로세싱하기 위한 장치로서,
    그래픽스 프로세싱 유닛 (GPU) 을 포함하고,
    상기 GPU 는 메모리 및 쉐이더 코어를 포함하며, 상기 쉐이더 코어는 제어 유닛, 복수의 프로세싱 엘리먼트들, 및 상수 메모리를 포함하고,
    상기 제어 유닛은
    쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 것으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하고;
    상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하도록 상기 복수의 프로세싱 엘리먼트들 중 적어도 하나에 지시하고;
    상기 상수 메모리에 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 것으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하고; 그리고
    상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 상기 메인 쉐이더 코드 블록을 실행하도록 상기 복수의 프로세싱 엘리먼트들 중 적어도 하나에 지시하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  14. 제 13 항에 있어서,
    프로세서를 더 포함하고,
    상기 프로세서는
    상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 상기 동일한 하나 이상의 결과인 상기 하나 이상의 결과들을 산출하도록 실행 가능한 명령들의 코드 블록을 식별하고; 그리고
    상기 명령들의 코드 블록을 상기 쉐이더 프로그램의 상기 프리앰블 코드 블록으로 그룹화하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  15. 제 14 항에 있어서,
    상기 명령들의 코드 블록의 식별은 상수로 평가되는 명령들의 식별을 포함하는, 데이터를 프로세싱하기 위한 장치.
  16. 제 13 항에 있어서,
    상기 제어 유닛은 또한
    쉐이더 프리앰블 시작 명령을 식별하는 것에 기초하여 상기 프리앰블 코드 블록을 식별하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  17. 제 13 항에 있어서,
    상기 제어 유닛은 또한
    상기 제 1 스레드 그룹에 의해 상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여 상기 GPU 로 하여금 상기 복수의 스레드 그룹들 중 후속 스레드 그룹을 실행할 수 있게 하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  18. 제 13 항에 있어서,
    상기 제어 유닛은 또한
    상기 복수의 스레드 그룹들 중 어느 스레드 그룹이 상기 제 1 스레드 그룹 이전에 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록이 이전에 실행되었는지 여부를 결정하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  19. 제 13 항에 있어서,
    상기 제어 유닛은 또한
    상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록을 실행할지 여부를 결정하도록 구성되는, 데이터를 프로세싱하기 위한 장치.
  20. 제 13 항에 있어서,
    상기 프리앰블 코드 블록의 실행은 상기 복수의 프로세싱 엘리먼트들의 스칼라 프로세서에 의해 실행되는, 데이터를 프로세싱하기 위한 장치.
  21. 제 13 항에 있어서,
    저장된 상기 하나 이상의 결과들은 상기 쉐이더 코어의 모든 프로세싱 엘리먼트들에 의해 액세스 가능한, 데이터를 프로세싱하기 위한 장치.
  22. 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치로서,
    쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 수단으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하는 수단;
    상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하는 수단;
    상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 수단으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하는 수단; 및
    상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 상기 메인 쉐이더 코드 블록을 실행하는 수단
    을 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  23. 제 22 항에 있어서,
    상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 상기 동일한 하나 이상의 결과인 상기 하나 이상의 결과들을 산출하도록 실행 가능한 명령들의 코드 블록을 식별하는 수단; 및
    상기 명령들의 코드 블록을 상기 쉐이더 프로그램의 상기 프리앰블 코드 블록으로 그룹화하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  24. 제 22 항에 있어서,
    쉐이더 프리앰블 시작 명령을 식별하는 것에 기초하여 상기 프리앰블 코드 블록을 식별하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  25. 제 22 항에 있어서,
    상기 제 1 스레드 그룹에 의해 상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여 상기 GPU 로 하여금 상기 복수의 스레드 그룹들 중 후속 스레드 그룹을 실행할 수 있게 하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  26. 제 22 항에 있어서,
    상기 복수의 스레드 그룹들 중 어느 스레드 그룹이 상기 제 1 스레드 그룹 이전에 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록이 이전에 실행되었는지 여부를 결정하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  27. 제 22 항에 있어서,
    상기 프리앰블 코드 블록이 실행되었는지 여부를 추적하여, 적어도 부분적으로, 상기 프리앰블 코드 블록을 실행할지 여부를 결정하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  28. 제 22 항에 있어서,
    상기 프리앰블 코드 블록은 하나 이상의 상수 결과들로 평가하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  29. 제 22 항에 있어서,
    랜덤 액세스 메모리 (RAM) 로부터 상수 메모리로 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 로드하는 수단을 더 포함하는, 그래픽 프로세싱 유닛 (GPU) 을 동작시키도록 구성된 장치.
  30. 저장된 명령들을 포함하는 비일시적 컴퓨터 판독가능 저장 매체로서,
    상기 명령들은 실행될 때, 적어도 하나의 프로세서로 하여금
    쉐이더 컴파일러로부터, 프리앰블 코드 블록 및 메인 쉐이더 코드 블록을 포함하는 쉐이더 프로그램을 수신하는 것으로서, 상기 프리앰블 코드 블록은 하나 이상의 결과들을 산출하도록 실행 가능하며, 상기 하나 이상의 결과들은 상기 쉐이더 프로그램을 실행하는 복수의 스레드 그룹들의 각각에 대해 동일한 하나 이상의 결과들인, 상기 쉐이더 프로그램을 수신하고;
    상기 복수의 스레드 그룹들 중 제 1 스레드 그룹 상에서, 상기 하나 이상의 결과들을 산출하기 위해 상기 프리앰블 코드 블록을 실행하고;
    상수 메모리에 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들을 저장하는 것으로서, 상기 프리앰블 코드 블록의 상기 하나 이상의 결과들은 상기 복수의 스레드 그룹들의 각각에 의해 액세스 가능한, 상기 하나 이상의 결과들을 저장하고; 그리고
    상기 프리앰블 코드 블록의 상기 하나 이상의 결과들의 전부를 저장하는 것이 완료되었다고 결정할 시에, 상기 프리앰블 코드 블록을 실행하는 것에 의해 산출된 상기 하나 이상의 결과들을 이용하여 상기 복수의 스레드 그룹들 중 한 스레드 그룹의 각각의 스레드에 대해 상기 메인 쉐이더 코드 블록을 실행하게 하는, 저장된 명령들을 포함하는 비일시적 컴퓨터 판독가능 저장 매체.

KR1020187033353A 2016-05-23 2017-04-10 그래픽스 프로세싱을 위한 퍼-쉐이더 프리앰블 KR101973924B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/162,272 2016-05-23
US15/162,272 US9799089B1 (en) 2016-05-23 2016-05-23 Per-shader preamble for graphics processing
PCT/US2017/026835 WO2017204909A1 (en) 2016-05-23 2017-04-10 Per-shader preamble for graphics processing

Publications (2)

Publication Number Publication Date
KR20180128075A true KR20180128075A (ko) 2018-11-30
KR101973924B1 KR101973924B1 (ko) 2019-04-29

Family

ID=58664778

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020187033353A KR101973924B1 (ko) 2016-05-23 2017-04-10 그래픽스 프로세싱을 위한 퍼-쉐이더 프리앰블

Country Status (9)

Country Link
US (1) US9799089B1 (ko)
EP (1) EP3465606A1 (ko)
JP (2) JP6911055B2 (ko)
KR (1) KR101973924B1 (ko)
CN (1) CN109074625B (ko)
BR (1) BR112018073898A2 (ko)
HK (1) HK1258710A1 (ko)
SG (1) SG11201808972SA (ko)
WO (1) WO2017204909A1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023055532A1 (en) * 2021-09-29 2023-04-06 Advanced Micro Devices, Inc. System and methods for efficient execution of a collaborative task in a shader system

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10186069B2 (en) * 2017-02-15 2019-01-22 Arm Limited Methods and systems for grouping and executing initial pilot shader programs
US10891708B1 (en) 2019-11-25 2021-01-12 Arm Limited Shader program execution in graphics processing
US11966726B2 (en) * 2022-02-25 2024-04-23 International Business Machines Corporation Operating system (OS) scheduler and compiler for code generation optimization in a (simultaneous multi-threading) SMT enabled CPU

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20140125821A (ko) * 2012-01-27 2014-10-29 퀄컴 인코포레이티드 그래픽 병렬 처리 유닛에 대한 버퍼 관리
KR20140138842A (ko) * 2012-03-07 2014-12-04 퀄컴 인코포레이티드 그래픽스 프로세싱 유닛 상의 그래픽스 및 비그래픽스 어플리케이션들의 실행
KR20160004963A (ko) * 2014-07-03 2016-01-13 에이알엠 리미티드 그래픽 처리

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6885374B2 (en) 2001-06-29 2005-04-26 Intel Corporation Apparatus, method and system with a graphics-rendering engine having a time allocator
JP4202033B2 (ja) * 2001-09-05 2008-12-24 三菱電機株式会社 並列画像処理装置および並列画像処理方法
JP4335516B2 (ja) * 2001-12-04 2009-09-30 パナソニック株式会社 複数のプロセッサを用いた動画像符号化装置およびその方法
US7394464B2 (en) 2005-01-28 2008-07-01 Microsoft Corporation Preshaders: optimization of GPU programs
US8154554B1 (en) * 2006-07-28 2012-04-10 Nvidia Corporation Unified assembly instruction set for graphics processing
US8325177B2 (en) 2008-12-29 2012-12-04 Microsoft Corporation Leveraging graphics processors to optimize rendering 2-D objects
US10002021B2 (en) 2012-07-20 2018-06-19 Qualcomm Incorporated Deferred preemption techniques for scheduling graphics processing unit command streams
US9123167B2 (en) 2012-09-29 2015-09-01 Intel Corporation Shader serialization and instance unrolling
US9189881B2 (en) 2013-05-30 2015-11-17 Arm Limited Graphics processing
US10134102B2 (en) 2013-06-10 2018-11-20 Sony Interactive Entertainment Inc. Graphics processing hardware for using compute shaders as front end for vertex shaders
US10114755B2 (en) 2013-06-14 2018-10-30 Nvidia Corporation System, method, and computer program product for warming a cache for a task launch
US9754342B2 (en) 2014-05-30 2017-09-05 Intel Corporation Method and apparatus for parallel pixel shading
US9665370B2 (en) * 2014-08-19 2017-05-30 Qualcomm Incorporated Skipping of data storage

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20140125821A (ko) * 2012-01-27 2014-10-29 퀄컴 인코포레이티드 그래픽 병렬 처리 유닛에 대한 버퍼 관리
KR20140138842A (ko) * 2012-03-07 2014-12-04 퀄컴 인코포레이티드 그래픽스 프로세싱 유닛 상의 그래픽스 및 비그래픽스 어플리케이션들의 실행
KR20160004963A (ko) * 2014-07-03 2016-01-13 에이알엠 리미티드 그래픽 처리

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023055532A1 (en) * 2021-09-29 2023-04-06 Advanced Micro Devices, Inc. System and methods for efficient execution of a collaborative task in a shader system

Also Published As

Publication number Publication date
JP2020024716A (ja) 2020-02-13
CN109074625A (zh) 2018-12-21
WO2017204909A1 (en) 2017-11-30
HK1258710A1 (zh) 2019-11-15
JP2019517078A (ja) 2019-06-20
EP3465606A1 (en) 2019-04-10
JP6911055B2 (ja) 2021-07-28
KR101973924B1 (ko) 2019-04-29
JP6848028B2 (ja) 2021-03-24
US9799089B1 (en) 2017-10-24
CN109074625B (zh) 2020-04-24
BR112018073898A2 (pt) 2019-02-26
SG11201808972SA (en) 2018-12-28

Similar Documents

Publication Publication Date Title
US10430912B2 (en) Dynamic shader instruction nullification for graphics processing
US9799094B1 (en) Per-instance preamble for graphics processing
JP6848028B2 (ja) グラフィック処理のためのパーシェーダープリアンブル
JP6542483B2 (ja) グラフィックス処理ユニットのためのシェーダにおける一様な述語
EP3161817B1 (en) Load scheme for shared register in gpu
US20140204080A1 (en) Indexed streamout buffers for graphics processing
US11829439B2 (en) Methods and apparatus to perform matrix multiplication in a streaming processor
US20160077837A1 (en) System, method, and computer program product for implementing large integer operations on a graphics processing unit
US9720691B2 (en) Speculative scalarization in vector processing
US9632783B2 (en) Operand conflict resolution for reduced port general purpose register
US20200004533A1 (en) High performance expression evaluator unit
KR20090053129A (ko) 3차원 그래픽스 쉐이더의 산술 논리 장치, 분기 조건 판단방법 및 이를 수행하는프로그램이 기록된 기록매체

Legal Events

Date Code Title Description
A201 Request for examination
A302 Request for accelerated examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant