KR102631479B1 - 그래픽스 처리 - Google Patents

그래픽스 처리 Download PDF

Info

Publication number
KR102631479B1
KR102631479B1 KR1020160091075A KR20160091075A KR102631479B1 KR 102631479 B1 KR102631479 B1 KR 102631479B1 KR 1020160091075 A KR1020160091075 A KR 1020160091075A KR 20160091075 A KR20160091075 A KR 20160091075A KR 102631479 B1 KR102631479 B1 KR 102631479B1
Authority
KR
South Korea
Prior art keywords
shader program
instructions
execution
threads
shader
Prior art date
Application number
KR1020160091075A
Other languages
English (en)
Other versions
KR20170010721A (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 KR20170010721A publication Critical patent/KR20170010721A/ko
Application granted granted Critical
Publication of KR102631479B1 publication Critical patent/KR102631479B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • 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/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • 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
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

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

Abstract

그래픽스 처리유닛의 쉐이더 코어에 의해 실행되는 쉐이더 프로그램(60)에 대한 명령들의 시퀀스는, 쉐이더 프로그램의 "글로벌" 공통 표현을 수행하는 초기의 명령들 61의 세트와, 쉐이더 프로그램이 처리하는 작업항목의 세트 내부의 정해진 작업그룹에 공통된 표현들을 수행하는 쉐이더 프로그램 내의 명령들 62의 세트와, 각 작업항목에 대해서 독립적으로 실행될 필요가 있는 메인 명령 시퀀스 63으로 분할된다.
그리고 나서 실행 스레드들은 메인 명령 시퀀스 66의 시작부에서 또는 작업그룹 공통 표현 65의 시작부에서, 또는 글로벌 공통 표현 64의 시작부에서 쉐이더 프로그램을 실행하는 것을 시작할 수 있다.

Description

그래픽스 처리{GRAPHICS PROCESSING}
본 발명은 그래픽스 처리 시스템에 관한 것으로, 특히 한 개 이상의 프로그래머블 처리 스테이지("쉐이더(shaders)")를 포함하는 그래픽스 처리 시스템의 작동에 관한 것이다.
그래픽스 처리는 한 개 이상의 파이프라인 스테이지가 최종 렌더 출력, 예를 들면 표시되는 프레임을 생성하기 위해서 데이터에 대해 작동하면서, 일반적으로 파이프라인 방식으로 수행된다. 많은 그래픽스 처리 파이프라인은 통상 "쉐이더"라고 불리는, 한 개 이상의 프로그래머블 처리 스테이지를 포함한다. 예를 들면, 그래픽스 처리 파이프라인은 지오메트리 쉐이더(geometry shader), 버텍스 쉐이더(vertex shader) 및 프래그먼트(fragment)(픽셀) 쉐이더 중의 한 개 이상 및 일반적으로는 모두를 포함할 수도 있다. 이들 쉐이더는 입력 데이터 값들에 대해 쉐이더 프로그램을 실행하여, 출력하기 위한 및/또는 그래픽 파이프라인의 나머지에 의해 처리하기 위한 원하는 출력 데이터(예를 들면, 버텍스 쉐이더의 경우에 적절히 변형 및 조명된 버텍스 데이터)의 세트를 생성하는 프로그래머블 처리 스테이지이다. 그래픽스 처리 파이프라인의 쉐이더들은 프로그래머블 처리 회로를 공유할 수도 있고, 또는 그들은 각각 별도의 프로그래머블 처리 유닛일 수도 있다.
그래픽스 처리 파이프라인의 정해진 "쉐이더"에 의해 실행되는 쉐이더 프로그램은 GLSL, HLSL, OpenCL C 등과 같은, 높은 레벨의 쉐이더 프로그래밍 언어를 이용해서 그래픽스 처리를 필요로 하는 어플리케이션에 의해 제공될 것이다. 이 쉐이더 프로그램은 관련 언어 표준(스펙)으로 정의된 원하는 프로그래밍 스텝을 나타내는 "표현(expressions)"으로 구성될 것이다. 그러면 높은 레벨의 쉐이더 프로그램은, 쉐이더 언어 컴파일러에 의해 타겟 그래픽스 처리 파이프라인에 대한 이진 코드로 변환된다. 이 이진 코드는 정해진 타겟 그래픽스 처리 파이프라인에 대한 명령 세트 스펙에 명시된 "명령들"로 구성될 것이다. 쉐이더 언어 표현을 이진 코드 명령으로 변환하는 번역 프로그램(compilation process)은 컴파일러 내부의 프로그램의 다수의 중간 표시를 통해서 발생할 수도 있다. 이와 같이 높은 레벨의 쉐이더 언어로 기록된 프로그램은, 컴파일러 특정 중간 표시로 변환될 수도 있고(컴파일 내부에는 몇몇의 연속적인 중간 표시가 있을 수도 있다), 최종 중간 표시는 타겟 그래픽스 처리 파이프라인에 대한 이진 코드 명령으로 변환된다.
이와 같이, 여기에서 "표현(expressions)"에 대한 언급은, 만약 콘텍스트(context)가 달리 필요하지 않다면, 대상 그래픽스 프로세서 이진 코드로 컴파일되는 (즉, 하드웨어 마이크로 명령들로 표현되는) 쉐이더 언어 구성을 나타낸다. (본 기술분에서 알려진 것처럼, 그러한 쉐이더 언어 구성은, 문제의 쉐이더 언어에 의존해서, "표현" "서술(statements)" 등이라고도 칭할 수 있다. 편의상, 여기에서는 "표현"이라는 용어가 사용되지만, 이것은 GLSL에서 "서술" 등과 같은 모든 같은 쉐이더 언어 구성을 포함하도록 되어 있다.) 그에 대응하여 "명령(instructions)"은 "표현"을 수행하기 위해 발산되는 실제의 하드웨어 명령(코드)을 나타낸다.
이와 같이, 그래픽스 처리 파이프라인 쉐이더는 렌더 타겟, 예를 들면 프레임과 같은, 생성될 출력에 있어서의 각 "작업항목(work item)"에 대하여 작은 프로그램을 실행함으로써 처리를 수행한다(이 경우에 "작업항목"은 보통 (예를 들면, 프래그먼트 쉐이더의 경우에) 버텍스 또는 샘플링 위치일 것이다. 그래픽스 처리 파이프라인이 "컴퓨트 쉐이딩(compute shading)"에 대해서 (예를 들면, OpenCL 혹은 DirectCompute 하에서) 사용되고 있는 경우, 작업항목은 적절한 컴퓨트 쉐이딩 작업항목일 것이다. 이 쉐이더 동작은, 일반적인 렌더 출력, 예를 들면, 프레임이 각각 독립적으로 처리될 수 있는 상당히 많은 수의 작업항목(예를 들면, 버텍스들 또는 프래그먼트들)을 특징으로 한다는 점에서 고도의 병렬 처리(parallelism)를 가능하게 하는 것이 일반적이다.
그래픽스 쉐이더 동작에 있어서는, 각 작업항목은 문제의 작업항목에 대하여 문제의 쉐이더 프로그램을 실행하는 실행 스레드에 의해 처리된다. 일반적으로 다수의 작업항목(예를 들면, 버텍스들 또는 샘플링 위치들)과, 정해진 쉐이더 프로그램에 대하여 처리될, 그에 대응하는 스레드들이 존재하기 때문에, 그래픽스 처리 시스템은 대규모 멀티 스레드(mutli-threaded) 시스템이라고 생각할 수 있다.
본 출원인은 많은 그래픽스 쉐이더 프로그램이 실행될 복수의 스레드의 세트에 대하여(드로우 콜(draw call)에 있어서의 모든 스레드에 대하여) 동일한 값들을 생성하는 동작들(표현들)을 포함할 것이라는 것을 인식했다.
예를 들면, OpenGL ES 버텍스 쉐이더는,
uniform mat4 a;
uniform mat4 b;
uniform mat4 c;
attribute vec4 d;
void main()
{
gl_Position = a * b * c * d;
}
데이터 입력이 균등 변수이기 때문에, 각 스레드(여기서 각 스레드는 정해진 버텍스를 나타낸다)에 대한 "a * b * c"의 계산에 대하여 동일한 값들을 생성할 것이다. 이와 같이, 이 계산이 한번 실행될 수 있고, 그 결과가 복수의 스레드 사이에서 공유되면, 쉐이더 프로그램의 실행이 보다 효율적으로 이루어질 수 있다.
본 출원인은 그들의 이전 UK 특허출원번호 GB-A-2516358에서 복수의 스레드의 세트에 대해서(예를 들면, 드로우 콜에 대하여) 동일한 값들을 생성하는 표현을 한번 실행하기 위한 "파일럿(pilot)" 쉐이더 프로그램과, 매회 공통 표현을 다시 계산하는 대신에 "파일럿 쉐이더"의 결과를 이용해서, 각 작업항목에 대하여 실행하는 "메인" 쉐이더 프로그램의 이용을 제안했다.
그렇지만, 이것에도 불구하고, 본 출원인은 한 개 이상의 쉐이더 스테이지를 포함하는 그래픽스 처리 파이프라인에 있어서 쉐이더 프로그램의 실행에 대한 개선의 여지가 남아 있다고 믿는다.
본 발명의 제1 국면에 의하면, 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 프로그래머블 쉐이더 스테이지를 포함하는 그래픽스 처리 파이프라인의 작동방법이 제공되고, 상기 방법은
쉐이더 스테이지가 쉐이딩 동작을 수행하기 위한 쉐이더 프로그램을 실행하는 경우에, 상기 쉐이더 프로그램은 상기 쉐이더 프로그램을 실행할 때 수행되는 명령들의 시퀀스를 포함하고,
실행을 위해서 상기 쉐이더 프로그램이 실행되는 상기 쉐이더 스테이지에 복수의 실행 스레드들을 발행하는 것을 포함하며,
상기 쉐이더 프로그램의 실행을 위한 상기 쉐이더 스테이지에 상기 실행 스레드들을 발행하는 것은, 상기 쉐이더 프로그램의 실행이 상기 실행 스레드들의 상이한 것들에 대해서 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령들로 시작될 수 있도록 구성되고,
상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하며,
상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것은,
상기 쉐이더 프로그램에 대한 명령들의 시퀀스에 있어서 제1 지점에서 시작하는 상기 실행 스레드들의 한 개 이상의 실행 스레드에 대하여 상기 쉐이더 프로그램을 실행하는 것과,
상기 쉐이더 프로그램에 대한 명령들의 시퀀스에 있어서 상이한 지점에서 시작하는 상기 실행 스레드들의 또 다른 하나 또는 또 다른 것들에 대하여 상기 쉐이더 프로그램을 동시에 실행하는 것을 포함한다.
본 발명의 제2 국면에 의하면, 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 프로그래머블 쉐이더 스테이지를 포함하는 그래픽스 처리 파이프라인이 제공되고,
상기 그래픽스 처리 파이프라인은,
쉐이더 스테이지가, 쉐이딩 동작을 수행하기 위한 쉐이더 프로그램을 실행하는 경우에, 상기 쉐이더 프로그램이 상기 쉐이더 프로그램을 실행할 때 수행되는 명령들의 시퀀스를 구비하며,
실행을 위해서 상기 쉐이더 프로그램이 실행되는 상기 쉐이더 스테이지에 복수의 실행 스레드들을 발행하도록 구성되고,
상기 쉐이더 프로그램의 실행을 위한 상기 쉐이더 스테이지에 상기 실행 스레드들을 발행하는 것은, 상기 실행 스레드들의 상이한 것들에 대하여 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령들로 상기 쉐이더 프로그램의 실행이 시작될 수 있도록 구성되고,
상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하며,
상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것은,
상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 제1 지점에서 시작하는 상기 실행 스레드들의 한 개 이상의 실행 스레드에 대하여 상기 쉐이더 프로그램을 실행하고,
상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 상이한 지점에서 시작하는 상기 실행 스레드들의 또 다른 하나 또는 또 다른 것들에 대하여 상기 쉐이더 프로그램을 동시에 실행하는 것을 실행하는 것을 포함한다.
본 발명은 그래픽스 처리 파이프라인에 있어서의 쉐이더 프로그램의 실행에 관한 것이다. 본 발명에 있어서, 쉐이더 프로그램이 실행되는 상이한 실행 스레드들은, 쉐이더 프로그램 내의 상이한 시작점에서 쉐이더 프로그램 내의 명령들을 실행하는 것을 시작할 수 있다. 즉, 쉐이더 프로그램은 실행 스레드들에 대하여 가능한 복수의 "시작"("엔드리")점을 가지므로, 스레드들은 쉐이더 프로그램 내부의 상이한 지점에서(예를 들면, 바람직하게는 문제의 실행 스레드에 더 적합한 지점에서) 쉐이더 프로그램의 실행을 시작할 수 있다.
본 출원인은 쉐이더 프로그램의 시작부 또는 근처에서 실행될 쉐이더 프로그램에 있어서의 "공통" 작업(표현)(즉, 그들이 쉐이더 프로그램을 실행하고 있는 스레드들의 세트 내의 스레드들의 일부 또는 모두에 대해 실행될 때마다 동일한 값(들)을 생성하는 표현(작업))과, 쉐이더 프로그램에서 나중에 실행되는 (즉, 쉐이더 프로그램을 실행하고 있는 스레드들의 세트 내의 각 스레드에 대하여 상이한 값(들)을 (잠재적으로) 생성하는) "비공통" 작업(표현)을 준비하는 것이 가능하다는 점을 인식했다.
또한, 실행 스레드들이 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 지점에서 쉐이더 프로그램에 "진입"(시작)하도록 허용함으로, 일부 스레드들이 시작부분에서 쉐이더 프로그램을 실행할 수 있고(그것에 의해, 예를 들면, 이들 스레드에 대한 공통 동작을 실행하는 것을 방지하는 것이 바람직하고), 다른 스레드들은 나중 지점에서 쉐이더 프로그램의 실행을 시작하도록 배치된다(그것에 의해, 예를 들면, 이들 스레드에 대하여 공통 동작을 실행하는 것을 방지하는 것이 바람직하다). 이것은 "공통" 동작(표현)을 수행하는 스레드들의 수를 줄이는 효과 및 이점을 가질 수 있어, 쉐이더 프로그램의 전체 실행을 더 효율적으로 만든다.
이와 같이, 본 발명에서는, 쉐이더 프로그램 내의 "공통" 표현들을 수행하는 명령들을 실행하는 스레드들의 수를 줄일 수 있다. 그렇지만, 본 발명은 이것을 행하기 위한 별도의 "파일럿 쉐이더" 프로그램의 생성 및 실행을 필요로 하지 않으므로, 파일럿 쉐이더가 단일 스레드에 대해서만 실행할 수도 있다(그러므로, 일반적으로 대규모 멀티 스레드 그래픽스 처리 파이프라인 구조에는 비교적 비효율적이다)는 사실 등, 파일럿 쉐이더 프로그램을 실행하면서 일어날 수 있는 문제를 방지한다.
또한, 본 발명은, 이하에 더 설명하는 것처럼, 컴퓨트 쉐이더 등, 쉐이더에 대한 공통 동작을 좀 더 효율적으로 수행하기 위해서 사용될 수 있고, 여기서 처리 부하는 별개의 "작업그룹"으로 조직화될 수 있다. 그래픽스 처리 파이프라인의 프로그래머블 쉐이딩 스테이지는, 그래픽스 처리 파이프라인의 (그래픽스 처리 파이프라인이 포함하거나 작용하는) 어떤 적절한 원한 프로그래머블 쉐이딩 스테이지("쉐이더")를 구비할 수 있다. 이와 같이, 쉐이딩 스테이지는, 예를 들면 버텍스 쉐이더, 프래그먼트 쉐이더, 또는 컴퓨트 쉐이더(로서 작동할 수도 있다)일 수도 있다. 프로그래머블 쉐이딩 스테이지는 단지 하나의 형태의 쉐이더로서 동작할 수도 있지만, 프로그래머블 쉐이딩 스테이지는 일반적으로 복수의 상이한 형태의 쉐이더를 실행 가능할 수도 있고(바람직하게는 가능하다), 하나의 타입의 쉐이더로서 (예를 들면, (프래그먼트 쉐이딩 동작을 수생하기 위한) 프래그먼트 쉐이더로서) 기능하고, 다른 형태(타입)의 쉐이더로서 기능하도록, 예를 들면, 서로 다른 시간에서 적절히 프로그램될 수도 있는 그래픽스 처리 파이프라인의 한 개 이상의 프로그래머블 스테이지가 있을 수 있다는 점을 인식할 것이다.
이에 상응하여, (프로그래머블) 쉐이더 스테이지에 발행되는 쉐이더 프로그램은, 프로그래머블 쉐이딩 스테이지가 실행하기 위한 어떤 적절한 원하는 쉐이더 프로그램일 수 있다.
본 발명의 기술은, 예를 들면, 정해진 처리 동작(예를 들면, 드로우 콜)에 대하여 실행되는 쉐이더 프로그램의 모두가 아닌 일부에 대해서 사용될 수 있지만, 본 실시예에 있어서는 정해진 처리 동작(예를 들면, 드로우 콜)에 대해서 실행되는 모든 쉐이더 프로그램에 대해서 사용된다.
프로그래머블 쉐이딩 스테이지는 적절한 프로그래머블 처리회로일 것이고, 바람직하게 적절한 프로그래머블 처리회로로서 구현되는 것이 바람직하다. 바람직하게는 처리 동작을 수행하기 위한 쉐이딩 프로그램을 실행하도록 동작 가능한 프로그래머블 실행유닛이 있다. 이와 같이, 프로그래머블 실행유닛이 실행될 실행 스레드들을 수신할 것이고, 이들 스레드에 대해서 적절한 쉐이딩 프로그램을 실행하여 원하는 출력을 생성할 것이다.
단 한 개 또는 복수의 프로그래머블 실행유닛이 있을 수도 있다. 복수의 프로그래머블 실행유닛이 있는 경우에는, 각 실행유닛이 본 발명의 방식으로 동작 가능한 것이 바람직하다.
쉐이더 프로그램을 실행하기 위해 쉐이딩 스테이지에 발행되는 실행 스레드들은 문제의 쉐이더 프로그램에 대하여 적절한 "작업항목"을 표시할 것이다. 이와 같이, 그들은, 예를 들면, 프래그먼트 쉐이딩 프로그램 등에 대하여 버텍스 쉐이딩 프로그램, 또는 샘플링 포인트(또는 픽셀)에 대한 버텍스들을 표시할 수도 있다.
복수의 실행 스레드는 실행을 위한 쉐이딩 스테이지에 발행될 것이다. 실행 스레드들은 그래픽스 처리 파이프라인으로서 작동하는 그래픽스 처리유닛(그래픽스 프로세서)의 어떤 적절한 원하는 구성소자 및 요소에 발행될 수 있다. 예를 들면, 바람직하게는 실행 스레드들에 대하여 쉐이더 프로그램을 실행하는 그래픽스 처리유닛의 프로그래머블 실행유닛에, 실행 스레드들을 발행하도록 작동하는 스레드 스포너(thread spawner)가 있는 것이 바람직하다.
실행을 위한 쉐이딩 스테이지에 발행되는 복수의 실행 스레드들은 (적어도 부분적으로) 병렬로, 즉 함께(동시에) 실행되는 것이 바람직하다.
실행을 위한 쉐이더 스테이지에 발행되는 복수의 실행 스레드들은, 복수의 실행 스레드들의 어떤 적절한 원하는 세트를 구비할 수 있다. 이와 같이, 그들은 원하는 출력, 예를 들면, 프레임, 또는 문제의 프레임의 일부(예를 들면, 타일)를 생성하도록 실행되는 모든 스레드들을 구비할 수도 있고, 또는 그들은 스레드들의 전체 세트 내부의 스레드들의 서브세트(예를 들면, 생성되고 있는 전체 출력의 정해진 드로우 콜에 대해서 실행되는 스레드들의 세트)일 수도 있다. 또한, 스레드들의 세트는 쉐이더 프로그램이 실행되는 정해진 작업그룹 또는 작업그룹들의 세트에 대한 스레드들일 수도 있다(예를 들면, 그래픽스 처리 파이프라인이 컴퓨트 쉐이딩 동작을 수행하고 있을 때). 물론 다른 배치도 가능할 것이다.
상기 설명한 바와 같이, 쉐이더 프로그램이 실행되는 실행 스레드들은, (쉐이더 프로그램용 명령들의 결과에서) 쉐이더 프로그램 내의 상이한 시작(진입)점에서 쉐이더 프로그램의 실행을 시작할 수 있다.
쉐이더 프로그램용 명령들의 결과에서의 제1 지점에서 시작하여 쉐이더 프로그램이 실행되는 복수의 실행 스레드들의 하나 또는 몇몇이, 쉐이더 프로그램용 명령들의 결과에서의 상이한(예를 들면, 나중) 지점에서 시작하여 실행되는 실행 스레드들의 또 다른 하나 또는 또 다른 것들과 병렬로, 즉 함께(동시에) (적어도 부분적으로) 실행되는 것이 바람직하다. 즉, 쉐이더 프로그램에서의 상이한 지점에서 시작하는 복수의 스레드들은 병렬로, 즉 함께(동시에) 실행되는 것이 바람직하다.
이와 같이, 실행 스레드들에 대해서 쉐이더 프로그램을 실행하는 것은, 쉐이더 프로그램용 명령들의 결과에서의 제1 지점에서 시작하는 실행 스레드들의 한 개 이상에 대하여 쉐이더 프로그램을 실행하는 것과, 쉐이더 프로그램용 명령들의 결과에서의 상이한 지점에서 시작하는 실행 스레드들의 또 다른 하나 또는 또 다른 것들에 대하여 쉐이더 프로그램을 동시에 실행하는 것을 포함하는 것이 바람직하다.
이 방식으로 동시에 복수의 스레드들을 실행하는 것은, 예를 들면, 대규모 멀티 스레드 그래픽스 처리 파이프라인 구조를 이용하는, 처리가 비교적 효율적이라는 것을 의미한다.
따라서 이것은 명령들의 결과에서 비교적 나중에 나타나는 명령들의 시퀀스 내의 적어도 한 개 또는 일부 명령이, 명령들의 시퀀스에서 비교적 일찍 나타나는 또 다른 명령 또는 명령들이 (또 다른 스레드에 대해서) 실행되는 것과 동시에 또는 전에 스레드에 대해서 실행될 수도 있다는 것을 의미할 것이다.
이하에 좀 더 상세히 설명하는 것처럼, 스레드에 대한 (예를 들면, 이전) 명령 또는 명령들의 실행의 결과 또는 결과들이 또 다른 스레드에 대한 (예를 들면, 나중) 명령 또는 명령들의 실행에 필요한 경우, 문제의 명령 또는 명령들이 스레드들의 또 하나 또는 다른 것들에 대해서 실행될 때까지 한 개 이상의 스레드들에 대한 쉐이더 프로그램의 실행을 기다릴(차단할) 필요가 있을 수도 있다(바람직한 실시예에 있어서는, 이것이 행해진다).
이와 같이, 일 실시예에 있어서, 복수의 실행 스레드에 대하여 쉐이더 프로그램을 실행하는 것은, 한 개 이상의 스레드에 대한 쉐이더 프로그램의 실행을 차단(중지)하는 것을 포함한다.
바람직하게는, 쉐이더 프로그램용 명령들의 시퀀스에서의 이전 지점에서 시작하는 한 개 이상의 실행 스레드들에 대한 쉐이더 프로그램의 명령 또는 명령들이 완료되었을 때까지, 쉐이더 프로그램용 명령들의 시퀀스에서의 나중 지점에서 시작하는 한 개 이상의 실행 스레드들에 대한 쉐이더 프로그램의 실행이 차단(중지)되는 것이 바람직하다. 이와 같이, 예를 들면, 바람직한 실시예에 있어서는, 바람직하게는, (이전, 예를 들면 제1 지점에서 시작하는) 한 개 이상의 실행 스레드들에 대한 쉐이더 프로그램의 특정한, 바람직하게는 선택된, 명령 또는 명령들의 실행이 완료되었을 때까지 (쉐이더 프로그램용 명령들의 시퀀스에서의 상이한(예를 들면, 나중) 지점에서 시작하는) 실행 스레드들의 또 다른 하나 또는 또 다른 것들에 대한 쉐이더 프로그램의 실행이 차단(중지)된다.
일단 문제의 명령 또는 명령들이 실행되었으면, 차단(중지)되는 한 개 이상의 스레드들에 대한 쉐이더 프로그램의 실행이, 바람직하게는 문제의 명령 또는 명령들의 실행의 결과들을 이용해서, 계속되는 것이 바람직하다.
상술한 것처럼, 쉐이더 프로그램이 실행되는 실행 스레드들은, (쉐이더 프로그램에 대한 명령들의 시퀀스에 있어서) 쉐이더 프로그램에서의 상이한 시작(진입)점에서 쉐이더 프로그램의 실행을 시작할 수 있다.
쉐이더 프로그램에서의 실행 스레드들에 대해서는 적어도 2개의 진입점이 있어야 한다. 하나의 바람직한 실시예에 있어서는, 쉐이더 프로그램에서의 실행 스레드들에 대해서 단지 2개의 진입점만이 있다. 다른 실시예에 있어서는, 쉐이더 프로그램에서의 실행 스레드들에 대해서 2개의 진입점보다 많이 있다. 바람직한 그러한 실시예에 있어서는, 쉐이더 프로그램에서의 실행 스레드들에 대해서 3개의 진입점이 있다. 쉐이더 프로그램에서 제공되는 실행 스레드들에 대한 진입점은 원하는 대로 선택될 수 있다. 진입점 중의 하나는 쉐이더 프로그램의 시작이어야 하고, 바람직하게는 시작이다(즉, 쉐이더 프로그램용 명령들의 시퀀스에서의 제1 명령으로, 스레드가 예를 들면, 어떤 다른 스레드에 의해 출력된 데이터에 의존하는 일없이, 정확하게 실행될 수 있다). 이와 같이 이 진입점은 쉐이더 프로그램에서의 공통 동작을 포함할 수도 있다.
쉐이더 프로그램에서의 다른 진입점 또는 진입점들의 위치는 원하는 대로 선택될 수 있다. 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램에서의 공통 표현을 계산하는 쉐이더 프로그램에서의 명령들 중의 몇몇 명령들 이후에 있고, 바람직하게는 모든 명령들 이후에 있는 쉐이더 프로그램에서의 제2 진입점이 있다(즉, 그것은 문제의 복수의 스레드(작업항목)의 세트에 내의 각 스레드(작업항목)에 대하여 같은 결과를 생성할 것이다). 가장 바람직하게는 쉐이더 프로그램에서의 공통 표현을 수행하는 모든 명령들 이후에 (바람직하게는 모든 명령들 직후에) 있는 쉐이더 프로그램에서의 실행 스레드들에 대한 진입점이 있다.
본 출원인은, 실행될 복수의 스레드의 세트 내의 모든 스레드(작업항목)(그것은 모든 스레드에 공통적이다)에 관련이 있는 (같은 결과를 생성하는) 공통 표현을 포함하는 쉐이더 프로그램뿐만 아니라, 실행될 스레드들(작업항목)의 전체 세트와 스레드들(작업항목)의 서브세트에만 관련이 있는 (같은 결과를 생성하는) 공통 표현도 있을 수 있다. 이것은 예를 들면, 쉐이더 프로그램에 대한 실행 스레드들이 각 작업그룹으로 그룹화될 수 있는 경우일 수도 있고, OpenCL 및 DirectCompute와 같은, 컴퓨트 쉐이더(compute shaders)의 경우일 수 있다. 이 경우에, 작업그룹 내의 각 스레드(작업항목)에 대하여 같은 결과를 생성하지만, 상이한 작업그룹에 대하여 상이한 결과를 생성할 수 있거나 생성하는 표현들의 세트가 있을 수도 있다.
이와 같이, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램이 실행되고 있는 스레드들(작업항목)의 세트 내의 모든 스레드(작업항목)에 대해서 공통적인 표현들을 실행하는 쉐이더 프로그램에서의 명령들의 세트들 이후뿐만 아니라, 쉐이더 프로그램이 실행되고 있는 실행 스레드들(작업항목)의 세트의 서브세트 또는 서브세트들에 대해서 "공통적인" 쉐이더 프로그램에서의 표현들을 실행하는 명령들 이후에, 쉐이더 프로그램의 실행을 실행 스레드들이 시작하는 것이 가능하다.
이와 같이, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램에서의 공통 표현들을 실행하는 명령들의 제1 세트 이후에 있는 쉐이더 프로그램에서의 실행 스레드들에 대한 시작점과, 쉐이더 프로그램에서의 공통 표현들을 실행하는 명령들의 제2 세트 이후에 있는 쉐이더 프로그램의 또 다른 시작점이 있다. 이 경우, 시작점 중의 하나는 실행 스레드들의 서브세트에 대하여, 예를 들면 정해진 작업그룹의 실행 스레드들에 대하여 공통된 결과를 생성하는 쉐이더 프로그램에서의 표현들을 실행하는 명령들의 세트 이후에 있는 것이 바람직하다.
이에 상응하여, 특히 바람직한 실시예에 있어서는, 실행 스레드들에 대하여 쉐이더 프로그램의 3개의 시작점이 있는데, 하나는 쉐이더 프로그램의 시작부분이고, 하나는 쉐이더 프로그램에서의 공통 표현을 실행하는 명령들의 제1 세트 이후이며, 3번째 시작점은 작업그룹 내의 공통 표현들을 실행하는 명령들의 제2 세트 이후이다.
이 경우에, 공통 표현들을 실행하는 명령들의 제1 세트는, 전체적으로 쉐이더 프로그램에 대한 공통 표현들을 실행하는 명령들일 수 있고, 바람직하게는 명령들이며, 공통 표현들을 실행하는 명령들의 제2 세트는 각 작업그룹에 대한 공통 표현들을 실행하는 명령들이다.
이 구성은 실행 스레드들이 작업그룹으로 그룹화될 수 있는 쉐이더 프로그램 및 쉐이더 동작에 특히 적합할 수 있고, OpenCL 및 DirectCompute와 같은, 컴퓨트 쉐이더(compute shaders)의 경우일 수 있다.
쉐이더 프로그램 스레드 실행 "진입점"은, 어떤 적절한 원하는 방식으로, 전체 데이터 처리 시스템의 어떤 적절한 원하는 소자에 의해 쉐이드 프로그램에서 혹은 관하여 결정 및 제공될 수 있다.
특히 바람직한 실시예에 있어서는, 쉐이더 프로그램 스레드 실행 시작점은 그래픽스 처리 파이프라인에 대한 컴파일러(쉐이더 컴파일러)에 의해 결정 및 설정된다. 이와 같이, 컴파일러는 쉐이더 프로그램에서의 적절한 시작점을 결정하는 것이 바람직하다. 스레드 실행 시작점을 식별하는 컴파일러는, 컴파일러가 쉐이더 프로그램에 액세스해서 실행될 쉐이더 프로그램에서의 나중 시작점을 포함하는 것이 가능하지를 판정할 수 있다는 이점이 있다.
특히 바람직한 실시예에 있어서, 컴파일러는 예를 들면, 그래픽스 처리 파이프라인에 의한 처리를 필요로 하는 호스트 프로세서상의 어플리케이션에 의해, 제공되는 쉐이더 프로그램 코드를 분석하고, 쉐이더 프로그램 실행에서 복수의 시작점이 가능하지 여부를 판정하며, 만약 그렇다면, 이들 시작점이 있어야 한다.
특히 바람직한 실시예에 있어서, 컴파일러는 또한 쉐이더 프로그램에서의 표현(동작)을 (가능한 경우) 재배열하도록 동작함으로써, 예를 들면 쉐이더 프로그램 실행에서 나중 스레드 시작점을 포함하는 기회를 제공하고, 및/또는 쉐이더 프로그램의 실행에서 나중 스레드 시작점을 좀 더 효율적으로 포함하여 이용하는 것을 고려한다.
이 점에 있어서, 컴파일러는 쉐이더 프로그램의 실행 순서에서(바람직게는 시작부분에서) 이전에 쉐이더 프로그램이 실행되는 스레드들(작업항목)의 세트의 모든 스레드(작업항목)에 대한 공통(같은) 결과를 생성하는 모든 쉐이더 프로그램 표현(동작)(에 대한 명령)을 배치하도록 동작하는 것이 바람직하다. 바람직하게는, 컴파일러는 또한 쉐이더 프로그램 실행에서(시작부분쪽에서) 이전에, 바람직하게는 스레드들(작업항목)의 세트 내의 모든 스레드(작업항목)에 대한 공통 결과를 생성하는 표현(작동)(에 대한 명령들) 이후에(바람직하게는 직후에), 쉐이더 프로그램에 실행되는 스레드들(작업항목)의 세트의 스레드들(작업항목)의 서브세트에 대한 공통(동일한) 결과를 생성하는 모든 쉐이더 프로그램 표현(동작)(에 대한 명령들)을 배치하도록 식별해서 작동한다.
이에 상응하여, 컴파일러는 쉐이더 프로그램 실행의 종료부분 쪽으로 개별적으로(각 개별 스레드(작업항목)에 대하여 상이한 결과를 잠재적으로 생성하는) 각 스레드(작업항목)에 대해서 실행되는 데에 필요한 쉐이더 프로그램 표현(작동)(에 대한 명령)을 (복수의 스레드(작업항목)에 대하여 공통 결과를 생성하는 쉐이더 프로그램 표현(조작)(에 대한 명령)의 적어도 일부 이후에, 바람직하게는 모두 이후에) 배치하는 것이 바람직하다.
가장 바람직하게는, 컴파일러는, 쉐이더 프로그램에서의 공통 표현을 실행하는 명령 이후에(혹은 적어도 이들 명령이 의존하는 쉐이더 프로그램에서의 공통 표현을 실행하는 명령 이후에) 쉐이더 프로그램에서의 공통 표현을 실행하는 이전 명령들의 결과에 의존하고, 개별적으로 각 작업항목에 대하여 실행될 필요가 있는 표현들을 실행하는 모든 쉐이더 프로그램 명령을 배치하도록 작동한다. 이것은 예를 들면, 공통 표현을 실행하는 쉐이더 프로그램에서의 모든 명령 이후의 명령들을 간단히 배치하는 것을 포함할 수 있었고, 또는 상기 구성은 명령들이 적어도 이들 명령이 의존하는 공통 표현을 실행하는 명령들 이후에 배치되도록 되어 있다.
이에 상응하여, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램이 개별적으로 각 작업항목에 대해서 실행될 필요가 있지만, 쉐이더 프로그램에서의 공통 표현을 실행하는 이전 명령들의 결과에 의존하지 않는 표현을 실행하는 명령들을 포함하면, 쉐이더 프로그램에서의 공통 표현을 실행하는 이전 명령들의 결과에 의존하지 않는 명령들이, 공통 표현을 실행하는 명령들 이후에, 그러나 공통 표현에 의존하는 "작업항목당(per-work item)" 명령들 이전에 쉐이더 프로그램에 대한 명령들의 시퀀스에서 발생하도록 구성되는 것이 바람직하다.
이에 상응하여, 공통 표현 명령 실행 이후에 있는 쉐이더 프로그램에서의 어떤 (혹은 상기) 시작점은, 공통 표현에 의존하지 않는 예를 들면, 작업항목당 명령들의 시작부분에 있도록 설정되는 것이 바람직하다. 그 후에, 이것은 예를 들면 쉐이더 프로그램 실행 시퀀스에서의 그 나중 지점에서 시작하는 실행 스레드들이 공통 표현을 수행하는 명령들이 완료되기 전에 명령들의 실행을 시작하는 것을 허용할 수 있다.
컴파일러는 예를 들면, 그래픽스 처리 파이프라인을 포함하는 전체 데이터 처리 시스템의 호스트 프로세서상에서 작동할 수도 있고, 바람직한 실시예에 있어서는 작동한다(그래픽스 처리 파이프라인이 그래픽스 프로세서와 같은, 또 다른 프로세서상에 있고, 그것은 (컴파일러 및 컴파일된 코드가 전체 데이터 그래픽스 처리 시스템 내부의 별개의 프로세서상에서 작동하도록) 호스트 프로세서와 관련이 있다)). 그렇지만, 컴파일러가 컴파일된 코드와 같은 프로세서상에서 작동하고 있거나, 또는 컴파일러가 별개의 시스템상에 프리컴파일되어(precompiled) 컴파일된 형태로 분포되어 있는 것과 같은, 또 프로그램이 (완전히) 별개의 프로세서상에서 작동하고 있는 것과 같은, 다른 구성도 가능할 것이다.
실행될 쉐이더 프로그램 내의 복수의 스레드 실행 시작점을 식별해서 제공하기 위한 본 발명의 방식의 동작은, 그래픽스 처리 파이프라인에 의해 실행되는 쉐이더 프로그램마다 고려될 수 있다(일 실시예에 있어서는 고려된다). 쉐이더 프로그램의 특정 카테고리 또는 타입에 대해서만 하지만 쉐이더 프로그램의 다른 카테고리 또는 타입에 대해서는 아니게 복수의 스레드 실행 시작점을 식별해서 제공하려는 것도 가능할 것이다(예를 들면, 쉐이더 프로그램의 타입은 유용한 복수의 스레드 실행 시작점을 제공할 가능성이 있다).
예를 들면, 컴파일러가 적절한 복수의 스레드 실행 시작점이 문제의 쉐이더 프로그램에 존재하지 않거나 매우 유용하지 않을 수도 있다고 판정하면, 하나하나 모든 쉐이더 프로그램이 그것에 포함된 복수의 스레드 실행 시작점을 가져야 할 필요는 없다.
본 발명은 또한 컴파일러 자체에 확장된다.
이와 같이, 본 발명의 또 다른 국면에 의하면, 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 그래픽스 처리 파이프라인의 쉐이더 스테이지에 대한 명령들을 생성하기 위한 프로그램을 컴파일하는 컴파일러가 제공되고,
상기 컴파일러는, 쉐이더 스테이지에 의해 실행되는 쉐이더 프로그램에 대하여,
상기 쉐이더 프로그램이 실행될 작업항목의 세트의 모든 작업항목에 대하여 같은 결과를 생성하는 쉐이더 프로그램 표현들에 대한 명령들을 식별하고, 각 작업항목에 대해서 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들 이전에 상기 식별된 명령들을 상기 쉐이더 프로그램의 실행 순서로 배치하도록 구성된다.
본 발명의 또 다른 국면에 의하면, 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 그래픽스 처리 파이프라인의 쉐이더 스테이지에 대한 명령들을 생성하기 위한 프로그램을 컴파일하는 방법이 제공되고,
상기 방법은 쉐이더 스테이지에 의해 실행되는 쉐이더 프로그램에 대하여,
상기 쉐이더 프로그램이 실행될 작업항목의 세트의 모든 작업항목에 대하여 같은 결과를 생성하는 쉐이더 프로그램 표현들에 대한 명령들을 식별하고, 각 작업항목에 대해서 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들 이전에 상기 식별된 명령들을 상기 쉐이더 프로그램의 실행 순서로 배치하는 것을 포함한다.
본 기술분야의 당업자가 알 수 있는 것처럼, 본 발명의 이들 국면은 여기서 설명한 본 발명의 옵션 기능들 중의 한 개 이상 또는 모두를 적절히 포함할 수 있고, 바람직하게는 포함한다.
이와 같이, 예를 들면, 컴파일러는 또한 개별적으로 각 작업항목에 대해서 실행될 필요가 있는 쉐이더 프로그램 표현들에 대해 명령들 전에, 바람직하게는 작업항목의 세트 내의 모든 작업항목에 대하여 공통된 결과를 생성하는 표현들에 대해 모든 명령 이후에(바람직하게는 직후에) 쉐이더 프로그램이 실행되는 작업항목의 세트의 작업항목의 서브세트에 대하여 같은 결과를 생성하는 모든 쉐이더 프로그램 표현들에 대한 명령들을 배치하도록 식별해서 작동하는 것이 바람직하다.
이에 대응하여, 컴파일러는 쉐이더 프로그램에서의 공통 표현들을 실행하는 명령들 이후에(혹은 적어도 이들 명령이 의존하는 쉐이더 프로그램에서의 공통 표현들을 실행하는 명령들 이후에), 쉐이더 프로그램에서의 공통 표현들을 실행하는 이전 명령들의 결과에 의존하며, 개별적으로 각 작업항목에 대하여 실행될 필요가 표현들을 실행하는 모든 쉐이더 프로그램 명령들을 배치하도록 작동하는 것이 바람직하다.
마찬가지로, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램이, 개별적으로 각 작업항목에 대해서 실행될 필요가 있지만, 쉐이더 프로그램에서의 공통 표현들을 실행하는 이전 명령들의 결과에는 의존하지 않는 표현들을 실행하는 명령들을 포함하는 경우에, 쉐이더 프로그램에서의 공통 표현들을 실행하는 이전 명령들의 결과에는 의존하지 않은 이들 명령은, 공통 표현들을 실행하는 명령들 이후에, 하지만, 공통 표현들에 의존하는 "작업항목당" 명령들 이전에 쉐이더 프로그램에 대한 명령들의 시퀀스에서 발생하도록 배열되는 것이 바람직하다.
실행 스레드는 어떤 적절한 원하는 방식으로 쉐이더 프로그램에서의 나중 무대에서 쉐이더 프로그램의 실행을 시작할 수 있도록 구성될 수 있다. 예를 들면, 스레드들은 그들의 상이한 "진입점"을 쉐이더 프로그램으로 설정하기 위해 할당된 상이한 초기의 프로그램 카운터 값일 수 있다(하나의 바람직한 실시예에 있어서는, 이것이 이루어진다). 이 경우에, 쉐이더 프로그램 내부의 상이한 시작점은 상이한 절대 프로그램 카운터 값으로 표시될 수 있거나, 또는 쉐이더 프로그램 내의 예를 들면, 제1 시작점을 나타내는 한 개의 프로그램 카운터 값이 있을 수도 있으며, 그 프로그램 카운터 값에 대한 오프셋 및 오프셋들은, 쉐이더 프로그램 내부의 다른 시작점을 표시 및 트리거하기 위해서 사용되고 있다.
추가로 또는 선택적으로, 스레드들이 쉐이더 프로그램 내의 특정 시작점에서(예를 들면, 쉐이더 프로그램의 시작부분에서) 시작하면 실행되는 공통 표현들에 대응하는 명령들과 같은, 쉐이더 프로그램 내의 명령들은, 그렇게 표시(예를 들면, 플래그(flagged))될 수 있고, 실행 스레드들은 그에 상응하여 적절히 이들 명령을 실행하거나 실행하지 않도록 구성되어 있다.
예를 들면, 공통 표현들에 대응하는 명령들이 그렇게 표시될 수 있는데, 그러면 실행 스레드들은, 명령들이 표시된 "공통 표현" 명령을 접할 때 이들 명령이 이미 완료되었는지 아닌지를 나타내는 플래그 또는 다른 지표를 검사하고, 이들 명령이 완료되었다는 것을 나타내는 예를 들면 플래그가 아직 설정되지 않았으면 "공통 표현" 명령을 실행하거나, 공통 표현 명령이 또 다른 스레드에 의해 완료되었다는 것을 나타내는 플래그 또는 다른 지표가 설정되면 이들 명령을 스킵(생략)한다.
실행 스레드들 자체는 또한 혹은 대신 쉐이더 프로그램 내의 특정 명령들을 실행하도록(혹은 실행하지 않도록) 구성될 수 있다. 예를 들면, 스레드는 공통 표현에 대응하는 명령을 실행하는(실행해야 하는) 스레드인 것으로 표시될 수 있다(혹은 반대로).
실행 스레드들은 어떤 적절한 원한 방식으로 쉐이더 프로그램 내의 상이한 시작점에서 쉐이더 프로그램의 실행을 시작하도록 발생될 수 있다.
예를 들면, 하나의 실행 스레드가 퇴각할(쉐이더 프로그램을 완료할) 때까지 실행 스레드들은 초기에 쉐이더 프로그램의 시작부분에서 그들의 실행을 시작하도록 발행될 수 있는데, 그 후에 발행되는 모든 실행 스레드는 나중 시작점에서(예를 들면, 쉐이더 프로그램 내의 공통 표현 이후에) 쉐이더 프로그램을 시작하도록 구성된다. 이 경우에, 쉐이더 프로그램의 시작부분에서 시작하는 단일 스레드를 실행하는 것이 가능할 것이고, 모든 다른 스레드들은 쉐이더 프로그램 내의 나중 시작점에서 시작하고, 제1 스레드가 완료할 때까지 차단되며(발행되지 않으며), 혹은, 선택적으로, 쉐이더 프로그램의 시작부분에서 시작하는 스레드들은 하나의 스레드가 완료할 때까지 계속해서 발행될 수 있고, 그러면 그 이후에 발행된 스레드들은 나중 시작점을 갖는다. 스레드에 의한 쉐이더 프로그램의 완료는 어떤 적절한 원하는 방식으로, 예를 들면 플래그를 설정함으로써 표시될 수 있다.
특히 바람직한 실시예에 있어서, 쉐이더 프로그램에서 나중에 시작하는 스레드들의 실행을 시작하기 전에 제1 스레드가 쉐이더 프로그램을 완료하기를 기다리는 것보다, 쉐이더 프로그램에서의 나중 지점에서의 명령들의 실행이 쉐이더 프로그램에서의 이전 명령들의 완료에 의존하면, (이전) 스레드들에 의한 쉐이더 프로그램에서의 특정 명령들 또는 명령들의 세트들의 완료가 추적 및 감시되고, 스레드가 쉐이더 프로그램에서의 관련 명령 또는 명령들의 세트를 완료한 경우에는, 나중 시작점에서 쉐이더 프로그램을 시작하는 스레드들이 실행을 위해서 해방(release)된다.
이와 같이, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램에서의 명령들 또는 복수의 명령의 그룹들이 스레드에 의한 쉐이더 프로그램에서의 이전 명령들의 완료에 의존하고 있는 것으로서 표시되고, 쉐이더 프로그램에서의 이전 명령들 이후에(하지만 이들 이전 명령들에 의존하는 명령(들) 또는 복수의 명령들의 세트(들) 이전에) 쉐이더 프로그램을 시작하는 스레드들은, 일단 이전 명령들이 스레드에 의해 완료되었으면 문제의 명령(들) 또는 복수의 명령의 세트(들)를 시작하도록 허용된다.
이전 명령(들)이 완료되었다는 표시(indication)는, 의존도가 충족되었다는 것을 표시하도록 이전 명령들이 완료되었을 때는, 예를 들면, 플래그와 같은, 적절한 표시를 설정함으로써, 원하는 대로 제공될 수 있다(그러면 나중 명령들은 이전 명령들을 그들 자체적으로 완료하지 않은 스레드들에 의해 정확히 실행될 수 있다).
이전 명령들에 대한 나중 명령들의 의존도는 쉐이더 프로그램 내부의 어떤 원하는 레벨의 입도(granularity)(해상도)에서 추적되어 사용될 수 있다.
예를 들면, 의존도가 충족된 것으로 간주되기(표시되기) 전에 단순히 나중 명령들이 완료될 필요가 있는 결과들을 생성하는 (바람직하게는 공통 표현들과 관련이 있는 모든 이전 명령들과 같은) 모든 이전 명령들을 필요로 하는 의존도가 있을 수 있다.
그 대신에 혹은 추가로, 의존도는, 이들 명령이 유도하는 예를 들면, 개개의 공통 표현(값)들과 관련이 있는 각각의 이전 명령들 또는 명령들의 세트들의 레벨에서 설정될 수 있고, 문제의 특정 공통 표현(들)에 의존하는 나중 명령들은 문제의 이전 공통 표현(들)이 완료되었을 때 실행되도록 허용된다.
예를 들면, 쉐이더 프로그램이 명령들의 서로 다른 (예를 들면, 정의된) 그룹들(그 그룹들은 한 개의 명령 또는 복수의 명령을 포함할 수도 있다)의 관점에서 조직화되면, 각각의 그러한 그룹의 명령들은 (예를 들면, 공통 표현을 평가하는) 쉐이더 프로그램에서의 이전 명령 또는 명령들의 그룹에 대한 의존성을 갖는 것으로 표시될 수 있고, 나중 그룹의 명령들의 실행은, 스레드가 이전 명령 또는 명령들의 그룹을 실행해서 그 이전 명령 또는 명령들의 그룹에 대한 관련 결과(데이터 값 또는 값들)를 발생했을 때까지 이전 명령 또는 명령들의 그룹을 실행하지 않는 스레드들에 대해서 차단된다.
바람직한 실시예에 있어서는, 스레드들에 의해 쉐이더 프로그램의 명령들의 완료를 감시하고, 또 문제의 스레드 또는 스레드들에 대한 관련 이전 의존성이 충족되었다는 것을 관측할 때, 실행을 위한 쉐이더 프로그램 내의 나중 지점에서 시작하는 스레드들을 해방하는, 스레드 스케줄러가 있다.
특히 바람직한 실시예에 있어서는, 쉐이더 프로그램 내의 공통 표현들에 대한 명령들을 실행하고 있는 스레드들의 실행(공통 표현들을 실행하는 이들 명령의 실행)을, 쉐이더 프로그램이 실행됨에 따라 우선적으로 처리함으로써, 문제의 스레드들의 세트에 대한 쉐이더 프로그램의 실행 중에 가능한 한 빨리 이들 공통 표현의 결과들을 생성하려고 한다. 그러면 이것은, 문제의 스레드들의 세트에 대한 쉐이더 프로그램의 실행 시에, 쉐이더 프로그램 내부의 공통 표현들에 대한 의존성이 더 일찍, 바람직하게는 가능한 한 빨리 충족될 수 있다(필요한 결과들이 제공된다)는 것을 확인하는데 도움이 될 것이다. 스레드 스케줄러는 이것을 달성하기 위해서 쉐이더 프로그램 내의 공통 표현들을 실행하는 명령들의 실행 및 완료를 우선적으로 처리하도록 구성될 수도 있고, 바람직하게는 구성된다. 예를 들면, 바람직하게는, 쉐이더 프로그램 내의 공통 표현들을 실행하고 있는 제1 스레드는, 쉐이더 프로그램을 실행하고 있는 다른 스레드들의 실행에 대해서 우선적으로 처리된다.
하나의 바람직한 실시예에 있어서는, 단일 스레드가 처리되어야 하는 각 작업항목(예를 들면, 버텍스, 프래그먼트 또는 컴퓨트 쉐이더 작업항목)에 대해서 발행됨으로써, 쉐이더 프로그램의 복수의 부분(예를 들면, 공통 표현들을 포함하는 부분 또는 부분들과 작업항목마다의 표현들을 포함하는 부분)이 작업항목에 대해서 실행되면, 관련 모든 명령들을 실행하는 단일 스레드가 작업항목에 대해서 발행될 것이다.
또 다른 바람직한 실시예에 있어서는, 주어진 작업항목에 대하여 복수의 실행 스레드들을 발행하는 것이 가능하다. 이 경우, 쉐이더 프로그램의 복수의 부분이 작업항목에 대해서 실행되면, 바람직하게는 복수의 실행 스레드들이 작업항목에 대해서 발행되고, 예를 들면, 바람직하게는 하나의 스레드가 작업항목에 대해서 실행되는 쉐이더 프로그램의 각 부분에 대해서 발행된다. 이와 같이, 예를 들면, 쉐이더 프로그램이 (그것의 내부에 상이한 시작점을 가짐으로써) 복수의 부분으로 분할되면, 쉐이더 프로그램의 상이한 부분들이 얼마나 많이 작업항목에 대해서 실행될 필요가 있는지를 판정하는 것이 바람직하고, 그러면 하나의 실행 스레드가 작업항목에 대해서 실행되는 쉐이더 프로그램의 각 부분에 대해서 발행된다. 이 경우, 복수의 스레드가 실행하는 쉐이더 프로그램의 부분들에 대한 각각의 관련 시작점에서 시작하는 것이 바람직하고, 그들이 쉐이더 프로그램의 관련 부분을 완료했을 때 완료하는 것이 바람직하다.
이와 같이, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램이 사실상 복수의 부분으로 분할되는 데, 각 부분은 쉐이더 프로그램 내부의 각 쌍의 진입점(시작점) 사이에 있으며, 각 실행 스레드는 문제의 작업항목에 대해서 실행되는 쉐이더 프로그램의 각 부분에 대한 정해진 작업항목에 대해서 발행된다.
쉐이더 프로그램은 쉐이더 프로그램 내부의 공통 표현들에 대한 명령들을 포함하는 (적어도) 제1 부분과, 각 작업항목에 대해서 개별적으로 실행될 필요가 있는 표현들에 대한 명령들을 포함하는 제2 부분으로 분할되는 것이 바람직하다.
하나의 바람직한 실시예에 있어서는, 쉐이더 프로그램은 3개의 부분으로 분할되는 데, 제1 부분은 쉐이더 프로그램이 실행되는 모든 작업항목에 공통되는 표현들을 실행하는 명령들을 포함하고, 제2 부분은 쉐이더 프로그램이 실행되는 작업항목의 각 작업 그룹에 공통되는 표현들을 실행하는 명령들을 포함하며, 제3 부분은 각 작업항목에 대해서 개별적으로 실행되는 표현들을 실행하는 명령들을 포함한다.
이에 상응하여, 바람직한 실시예에 있어서는, 쉐이더 프로그램의 부분들 중의 어느 것이 작업항목에 대해서 실행될 필요가 있는지에 의존해서, 작업항목마다의 명령들을 실행하는 한 개의 실행 스레드, 또는 2개의 실행 스레드(하나는 작업그룹마다의 공통 표현 명령들을 실행하고, 또 하나는 작업항목마다의 명령들을 실행한다), 또는 3개의 실행 스레드(하나는 글로벌 공통 표현 명령들을 실행하고, 하나는 작업그룹 공통 표현 명령들을 실행하며, 하나는 작업항목마다의 표현 명령들을 실행한다)가 쉐이더 프로그램이 실행되는 작업항목에 대하여 쉐이더 프로그램을 실행하기 위해 발행된다.
쉐이더 프로그램 내의 공통 표현들의 실행에 의해 생성되는 결과들(데이터 값(들))은, 쉐이더 프로그램을 실행하고 있는 다른 스레드들에(특히 나중 지점에서 쉐이더 프로그램을 시작하여 그들 자체적으로 문제의 공통 표현들에 대한 명령들을 실행하지 않는 다른 스레드들에) 사용 가능하게 해야 하고, 바람직하게는 사용 가능하다. 이들 공통 표현 결과(데이터 값)는 어떤 적절한 원하는 방식으로 다른 실행 스레드들에 대해서 사용하기 위해서 제공될 수 있다. 바람직한 실시예에 있어서는, 그 결과들이 쉐이더 프로그램을 실행하고 있는 다른 실행 스레드들에 액세스가능하도록 저장된다.
이들 공통 표현 결과들(데이터 값들)은 그래픽스 처리 파이프라인에 액세스 가능한 어떤 적절한 스토리지에 저장될 수 있다. 이와 같이, 그들은 예를 들면 메모리 내에 적절히 저장될 수 있는 데, 스레드들에 대한 메모리로부터 이들 값을 로드(load)하기 위한 로드 동작들은, 쉐이더 프로그램 내의 다른 스레드들 및 나중 표현들에 필요할 때 이들 값을 로드하는 데에 사용된다. 그렇지만, 특히 바람직한 실시예에 있어서는, 쉐이더 프로그램 내의 공통 표현들에 의해 생성되는 결과들(데이터 값들)은, 캐쉬와 같은, 그래픽스 처리 파이프라인의 적절한 로컬 스토리지 내에, 가장 바람직하게는 그래픽스 처리 파이프라인의 레지스터 내에 저장된다. 이 데이터 값들을, 적절한 로컬 스토리지 내에, 예를 들면, 바람직하게는 쉐이더 프로그램을 실행하고 있는 모든 스레드들에 의해 공유되는, 레지스터들 내에 저장함으로써, 메모리로부터 그들을 로드할 필요없이 쉐이더 프로그램의 나중 부분들에 대한 다른 스레드들이 사용하기 위해 이들 값이 이용가능하다.
이와 같이, 일정한 표현들의 결과들은 메모리에 저장된 후에 각 스레드에 대해서 로드될 수 있거나, 또는 그들은 레지스터 또는 캐쉬와 같은 로컬 스토리지 내에 저장될 수 있는데, 그러면 스레드들은 예를 들면, 바람직하게는 레지스터 파일로부터 직접 그들을 판독한다.
공통 표현들로부터의 결과들이 로컬 스토리지, 예를 들면 레지스터 내에 저장되면, 바람직한 일 실시예에 있어서는 로컬 스토리지, 예를 들면, 레지스터뿐만 아니라 메모리에도 데이터를 저장함으로써, 데이터 값들이 다시 필요하지만 더 이상 로컬 스토리지, 예를 들면 레지스터에 이용할 수 없는 경우에 데이터를 필요하다면 메인 메모리로부터 다시 로드할 수 있다. 이와 같이, 이들 실시예에 있어서는, 공통 표현 데이터 기록들이 일관성이 있을 것이다. 이 경우, 필요하다면 공통 표현 데이터 값들이 재사용하기 위해서 메모리에 이용 가능하다고 (예를 들면, 플래그를 설정함으로써) 기록되어 있는 것이 바람직하다.
그 대신에, 공통 표현 결과들(데이터 값들)이 로컬 스토리지 내에 단독으로 저장될 수 있고, 이들 데이터 값은 파기되어야 하지만 다시 필요한 경우에는, 그들은, 예를 들면, 공통 표현들을 다시 실행하는 스레드 또는 스레드들을 발행함으로써 다시 계산되는 것이 바람직하다. (공통 표현들을 재실행하는 것에 의해 같은 데이터 값들이 생성되기 때문에, 이 상황에서는 이전의 공통 표현 결과들을 파기하는 것이 허용된다.) 이와 같이, 또 다른 바람직한 실시예에 있어서는, 공통 표현들의 결과들이 로컬 스토리지, 예를 들면 레지스터 내에 유지되지만, 다른, 예를 들면 메인 메모리에는 다시 기록되지 않는다.
본 기술분야의 당업자가 알 수 있는 것처럼, 본 발명의 그래픽스 처리유닛은 그래픽스 처리유닛에 의한 그래픽스 처리를 필요로 하는 어플리케이션을 실행하는 예를 들면, 바람직하게는 호스트 프로세서를 포함하는 전체 그래픽스 처리 시스템의 일부일 것이다. 호스트 프로세서는 적절한 코멘드 및 데이터를 그래픽스 처리유닛으로 보내서 그것을 제어해 그래픽스 처리 동작을 수행하고 호스트 프로세서상에서 실행하고 있는 어플리케이션이 필요로 하는 그래픽스 처리(렌더) 출력을 생성할 것이다. 이것을 용이하게 하기 위해서, 호스트 프로세서는 그래픽스 처리유닛의 프로그래머블 실행유닛에 의해 실행되는 쉐이더 프로그램들을 컴파일하기 위한 컴파일러 또는 컴파일러들 및 그래픽스 처리유닛용 드라이버를 실행해야 하고, 바람직하게는 실행한다.
그래픽스 처리유닛은 또한 여기에 기재된 데이터, 및/또는 그래픽스 처리유닛에 의해 생성된 출력 데이터를 저장하고, 및/또는 여기에 기재된 처리들을 수행하기 위한 소프트웨어를 저장하는, 한 개 이상의 메모리 및/또는 메모리 디바이스들을 구비할 수도 있고, 및/또는 그것과 통신할 수도 있다. 그래픽스 처리유닛은 또한 호스트 마이크로프로세서와 통신할 수도 있고, 및/또는 그래픽스 처리유닛에 의해 생성된 데이터에 근거해서 화상을 표시하는 디스플레이와도 통신할 수도 있다.
쉐이더 프로그램(들)을 실행하는 그래픽스 처리유닛의 프로그래머블 실행유닛(들)은 버텍스 쉐이더, 지오메트리 쉐이더, 프래그먼트 쉐이더, 컴퓨트 쉐이더 등과 같은, 어떤 적절한 원하는 그래픽스 처리 쉐이더 스테이지(쉐이더들)로서 기능할 수도 있고, 바람직하게는 기능한다(작동한다)(그래픽스 처리 파이프라인은 이러한 그래픽스 처리 쉐이더 스테이지를 포함할 수도 있다). 바람직한 실시예에 있어서는, 그것은 이들 웨이더의 각각으로서 작동할 수 있다.
그래픽스 처리유닛의 상기 또는 각각의 프로그래머블 실행유닛은, 프로그래머블 처리회로와 같은 어떤 적절한 프로그래머블 하드웨어 소자를 구비할 수도 있다. 각 프로그래머블 처리 스테이지는, 별개의 회로소자로서 처리 파이프라인의 다른 프로그래머블 스테이지들에 제공될 수도 있고, 또는 프로그래머블 처리 스테이지들은 (원하는 프로그래머블 처리 스테이지로서 기능하도록 서로 다르게 프로그램되는) 그들의 프로그래머블 처리회로 중의 일부 또는 모두를 공유할 수도 있다.
프로그래머블 처리(쉐이더) 스테이지뿐만 아니라, 그래픽스 처리 파이프라인은, 래스터화기, 얼리 심도(early depth)(또는 얼리 심도 및 스텐실) 테스터, 레이트 심도(late depth)(또는 심도 및 스텐실) 테스터, 블렌더(blender), 타일 버퍼, 라이트 아웃(write out) 유닛 등을 포함할 수 있는 어떤 다른 적절한 원하는 처리 스테이지도 포함할 수도 있다.
본 발명은 그래픽스 처리 파이프라인이 렌더-텍스처(render-to-texture) 출력 등을 표시하기 위한 프레임들 등을 생성하는 데에 사용될 수 있는, 모든 형태의 출력에 이용될 수 있다. 그래픽스 처리로부터의 출력, 예를 들면 프래그먼트 쉐이드된(fragment shaded), 데이터 값들은 디스플레이용 프레임 버퍼와 같은, 저장 및 사용을 위한, 외부, 예를 들면 메인 메모리에 전해지는 것이 바람직하다.
본 발명은 어떤 적절한 형태 또는 구성의 그래픽스 프로세서에 적용 가능하다. 특히, 본 발명은 타일 기반 그래픽스 프로세서 및 그래픽스 처리 시스템에 적용 가능하다. 이와 같이, 바람직한 실시예에 있어서는, 그래픽스 처리 시스템 및 그래픽스 처리 파이프라인은 각각 타일 기반 시스템 및 파이프라인이다.
특히 바람직한 실시예에 있어서는, 본 발명의 다양한 기능들은, 예를 들면, 디스플레이 디바이스용 프레임 버퍼에 기록되는 렌더된 프래그먼트 데이터를 생성하여 출력하는 한 개의 그래픽스 처리 플랫폼상에서 수행된다.
본 발명은 적절하게 구성된 마이크로프로세서 기반 시스템과 같은, 어떤 적절한 시스템에서 구현될 수 있다. 바람직한 실시예에 있어서는, 본 발명은 컴퓨터 및/또는 마이크로 프로세서 기반 시스템에서 구현된다.
본 발명의 다양한 기능들은 어떤 원하는 적절한 방식으로 수행될 수 있다. 예를 들면, 본 발명의 기능들은 하드웨어 또는 소프트웨어로, 원하는 대로 구현될 수 있다. 이와 같이, 달리 명시하지 않았지만, 본 발명의 다양한 기능소자, 스테이지 및 "수단"은, 원하는 방식으로 작동하도록 프로그램될 수 있는 적절한 전용 하드웨어 소자들 및/또는 프로그래머블 하드웨어 소자들과 같은, 다양한 기능 등을 수행하도록 작동 가능한, 적절한 프로세서 또는 프로세서들, 컨트롤러 또는 컨트롤러들, 기능유닛들, 회로, 처리 로직, 마이크로프로세서 장치 등을 구비할 수도 있다.
본 기술분야의 당업자가 알 수 있는 것처럼, 본 발명의 다양한 기능 등은, 주어진 프로세서상에 중복 및/또는 병렬로 수행될 수 있다는 점에 유념해야 한다. 마찬가지로, 다양한 처리 스테이지들은 원한다면 처리 회로 등을 공유할 수도 있다.
상술한 특정 기능들을 수행하는 데 필요한 어떤 하드웨어에 따라, 데이터 처리 시스템 및 파이프라인은 데이터 처리 파이프라인이 포함하는 통상의 기능유닛들 중의 한 개 이상 또는 모두를 포함할 수 있다.
본 발명의 상술한 국면들 및 실시예들 중의 모두가 여기에서 설명한 바람직한 선택적 특징들 중의 한 개 이상 또는 모두를 적절하게 포함할 수 있고, 바람직하게는 포함한다는 것을 본 기술분야의 당업자는 알 수 있을 것이다.
본 발명에 따른 방법은 소프트웨어, 예를 들면, 컴퓨터 프로그램을 이용해서 적어도 부분적으로 구현될 수 있다. 이와 같이, 추가 국면에서 보면, 본 발명은 데이터 처리 수단에 인스톨될 때 여기에 기재된 방법들을 수행하는 데 특히 적합한 컴퓨터 소프트웨어와, 프로그램 소자가 데이터 처리 수단에서 실행될 때 여기에 기재된 방법들을 수행하기 위한 컴퓨터 소프트웨어 코드부를 구비하는 컴퓨터 프로그램 소자와, 프로그램이 데이터 처리 시스템상에 실행될 때 여기에 기재된 방법 또는 방법들의 모든 스텝들을 수행하는 데 적합한 코드 수단을 구비하는 컴퓨터 프로그램을 제공한다. 데이터 프로세서는 마이크로프로세서 시스템, 프로그래머블 FPGA(field programmable gate array) 등일 수 있다.
또한, 본 발명은, 그래픽스 프로세서, 렌더러 또는, 데이터 처리수단을 구비하는 마이크로프로세서 시스템을 작용시키는 데에 사용될 때 상기 데이터 처리수단과 함께 상기 그래픽스 프로세서, 렌더러 또는 시스템이 본 발명의 방법들의 스텝들을 실행하는 상기 소프트웨어를 구비하는 컴퓨터 소프트웨어 캐리어에도 확장된다. 이러한 컴퓨터 소프트웨어 캐리어는, ROM 칩, CD ROM, RAM, 플래시 메모리나, 디스크 등의 물리적 기억매체일 수 있고, 또는 유선상의 전자신호, 광신호 또는 위성 등에 관한 무선신호 등의 신호일 수 있다.
본 발명의 방법들의 모든 스텝들을 컴퓨터 소프트웨어로 실행할 필요가 없고 이에 따라 또 다른 넓은 국면에서, 본 발명은 컴퓨터 소프트웨어와, 여기에 기재된 방법들의 스텝들 중의 적어도 하나를 실행하기 위한 컴퓨터소프트웨어 캐리어 상에 인스톨된 상기 소프트웨어를 제공한다는 것도 또한 알 것이다.
따라서, 본 발명은, 컴퓨터 시스템에 사용하기 위한 컴퓨터 프로그램 제품으로서 적절히 구현되어도 된다. 이러한 구현은, 유형의, 비일시적 매체, 이를테면 컴퓨터 판독 가능한 매체, 예를 들면, 디스켓, CD-ROM, ROM, RAM, 플래시 메모리, 또는 하드디스크에 고정된 일련의 컴퓨터 판독 가능한 명령들을 포함할 수도 있다. 또한, 본 발명은, 광학적이거나 아날로그적 통신회선을 포함하지만 이에 한정되지 않는 유형의 매체상에서, 또는, 마이크로웨이브, 적외선 또는 그 밖의 전송 기술을 포함하지만 이에 한정되지 않는 무선 기술을 무형으로 사용하여, 모뎀이나 그 밖의 인터페이스 디바이스를 거쳐 컴퓨터 시스템에 전송 가능한, 일련의 컴퓨터 판독 가능한 명령들을 포함할 수 있었다. 상기 일련의 컴퓨터 판독 가능한 명령들은, 여기서 이전에 설명된 기능성의 전부 또는 일부를 구현한다.
본 기술분야의 당업자는, 많은 컴퓨터 아키텍처나 운영체계에 사용하기 위한 다수의 프로그래밍 언어로 상기 컴퓨터 판독 가능한 명령들을 기록할 수 있다는 것을 알 것이다. 또한, 이러한 명령들은, 반도체, 마그네틱, 또는 광학적 기술을 포함하지만 이에 한정되지 않는 현재 또는 미래의 어떠한 메모리 기술을 사용해서 저장될 수도 있거나, 광학적, 적외선 또는 마이크로웨이브를 포함하지만 이에 한정되지 않는 현재 또는 미래의 어떠한 통신기술을 사용해서 전송되어도 된다. 이러한 컴퓨터 프로그램 제품은, 인쇄된 문서나 전자 문서가 첨부되는 착탈 가능한 매체, 예를 들면, 컴퓨터 시스템, 예를 들면, 시스템 ROM이나 고정형 디스크 상에 사전 적재된 쉬링크 랩(wrapped) 소프트웨어로서 배포되거나, 네트워크, 예를 들면, 인터넷이나 월드 와이드 웹상에서 서버나 전자게시판으로부터 배포되어도 된다.
이하, 본 발명의 다수의 바람직한 실시예에 대해서 첨부도면을 참조하여 예시적으로만 설명할 것이다.
도 1은 예시적인 컴퓨터 그래픽스 처리 시스템을 나타낸 것이다.
도 2는 본 발명의 방식으로 동작 가능한 그래픽스 처리 파이프라인을 개략적으로 나타낸 것이다.
도 3은 그래픽스 처리 유닛을 개략적으로 나타낸 것이다.
도 4는 쉐이더 프로그램의 예를 나타낸 것이다.
도 5는 본 발명의 실시예에 있어서의 쉐이더 프로그램 구성의 예를 나타낸 것이다.
도 6은 본 발명의 또 다른 실시예에 있어서의 쉐이더 프로그램 구성의 예를 나타낸 것이다.
도 7은 도 6에 나타낸 실시예에 있어서의 스레드들의 실행을 개략적으로 나타낸 것이다.
도 8은 도 6 및 도 7에 나타낸 실시예에 있어서의 스레드들의 실행의 타이밍의 예를 나타낸 것이다.
도 9는 본 발명의 또 다른 실시예에 있어서의 쉐이더 프로그램 구성의 예를 나타낸 것이다.
도 10은 도 9에 나타낸 실시예에 있어서의 스레드들의 실행을 개략적으로 나타낸 것이다.
도 11은 도 9 및 도 10에 나타낸 실시예에 있어서의 스레드들의 실행의 타이밍의 예를 나타낸 것이다.
도면에서 같은 참조번호는 같은 구성소자에 대해서 적절히 사용된다.
도 1은 일반적인 컴퓨터 그래픽스 처리 시스템을 나타낸다.
호스트 프로세서(1)상에서 실행하고 있는 게임과 같은, 어플리케이션(2)은 관련된 그래픽스 처리 유닛(그래픽스 처리 파이프라인)(3)에 의해 실행되는 그래픽스 처리 동작을 필요로 할 것이다. 이것을 하기 위해서, 어플리케이션은 호스트 프로세서(1)상에서 작동되고 있는 그래픽스 처리 파이프라인(3)용 드라이버에 의해 해석되는 API(Application Programming Interface) 콜(calls)을 생성해서 적절한 코멘드들을 그래픽스 프로세서(3)에 발생해 어플리케이션(2)이 필요로 하는 그래픽 출력을 생성할 것이다. 이것을 용이하게 하기 위해서, "코멘드들"의 세트는 그래픽 출력을 위해서(예를 들면, 표시될 프레임을 생성하기 위해서) 호스트 시스템(1)상에서 작동하는 어플리케이션(2)으로부터의 코멘드들에 응답해서 그래픽스 프로세서(3)에 제공될 것이다.
도 2는 본 실시예의 그래픽스 처리 파이프라인(3)을 더 상세히 나타낸 것이다.
도 2에 나타낸 그래픽스 처리 파이프라인(3)은 타일 기반 렌더러이므로, 생성될 출력 프레임과 같은, 렌더 출력 데이터 어레이의 타일들을 생성할 것이다.
(타일 기반 렌더링에 있어서는, 전체 렌더러 출력, 예를 들면 즉시 모든 렌더링에서와 같이 한꺼번에 효율적으로 처리되고 있는 프레임보다는 오히려, 렌더 출력, 예를 들면 표시될 프레임이, 통상적으로 "타일"이라고 불리는 복수의 작은 서브 영역으로 분할된다. 각 타일(서브 영역)은 개별적으로(일반적으로는 차례로) 렌더되고, 렌더된 타일들(서브 영역들)은 완전한 렌더 출력, 예를 들면, 표시용 프레임을 제공하도록 재결합된다. 그러한 구성에 있어서, 렌더 출력은 일반적으로 (통상적으로, 예를 들면 정사각형 또는 직사각형인) 표준 사이즈 및 형상의 서브 영역들(타일들)로 분할되지만, 이것은 필수적인 것은 아니다).
렌더 출력 데이터 어레이는, 본 기술분야에서 알려진 것처럼, 일반적으로 스크린 또는 프린터와 같은, 디스플레이 디바이스에 표시하기 위한 출력 프레임일 수도 있지만, 예를 들면, ("텍스처에 대한 렌더(render to texture)" 출력으로서도 알려진) 나중의 렌더링 패스(later rendering passes) 등에 사용하기 위한 중간 데이터를 구비할 수도 있다.
(컴퓨터 그래픽스 화상이 표시되는 경우에는, 그것은 통상적으로 먼저 일련의 프리미티브들(폴리콘)로서 정의되고, 그 프리미티브들은 차례로 그래픽스 렌더링을 위한 그래픽스 프래그먼트들로 분할(래스터화)된다. 통상의 그래픽스 렌더링 동작 중에서는, 프래그먼트들이 정확하게 표시될 수 있도록 렌더러가 (예를 들면) 컬러(레드, 그린 및 블루, RGB) 및 각 프래그먼트와 관련된 투명도(transparency)(알파) 데이터를 변경할 것이다. 일단 프래그먼트들이 렌더러를 완전히 횡단했을 경우에는, 그들의 관련 데이터 값들이 출력을 위해, 예를 들면 표시를 위해 준비된, 메모리에 저장된다.)
도 2는 본 실시예의 동작과 관련이 있는 그래픽스 처리 파이프라인(3)의 메인 소자와 파이프라인 스테이지들을 나타낸다. 본 기술분야의 당업자가 알 수 있는 것처럼, 도 2에는 도시하지 않은 그래픽스 처리 파이프라인의 다른 소자들이 있을 수도 있다. 도 2는 단지 개략적인 것이며, 예를 들면, 실제로는 도시한 기능 유닛들 및 파이프라인 스테이지들은 도 2의 별도의 스테이지로서 개략적으로 도시되어 있지만, 중요한 하드웨어 회로들을 공유할 수도 있다는 점에도 유념해야 한다. 또한, 도 2에 도시한 바와 같이 그래픽스 처리 파이프라인의 스테이지들, 소자들 및 유닛들 등의 각각은 원하는 대로 구현될 수도 있고, 그에 따라 필요한 동작 및 기능을 수행하기 위한, 예를 들면, 적절한 회로 및/또는 처리 로직 등을 구비할 것이다.
도 2에 도시한 바와 같이, 그래픽스 처리 파이프라인(3)은 버텍스 쉐이더(vertex shader)(20), 헐 쉐이더(hull shader)(21), 테셀레이터(tesselator)(22), 도메인 쉐이더(23), 지오메트리 쉐이더(geometry shader)(24), 래스터화 스테이지(25), 얼리(early) Z(심도) 및 스텐실(stencil) 테스트 스테이지(26), 프래그먼트 쉐이딩(fragment shading) 스테이지(27)의 형태의 렌더러(renderer), 레이트(late) Z(심도) 및 스텐실 테스트 스테이지(28), 블렌딩 스테이지(29), 타일 버퍼(30) 및 다운샘플링 및 라이트아웃(writeout)(멀티샘플 리졸브(multisample resolve)) 스테이지(31)를 포함하는, 다수의 스테이지를 포함한다.
버텍스 쉐이더(20)는 생성될 출력에 대해서 정의된, 버텍스들 등과 관련된 입력 데이터 값들을 취하고, 이들 데이터 값을 처리해서 그래픽스 처리 파이프라인(3)의 다음 스테이지가 사용하기 위한 대응하는 "버텍스 쉐이드(vertex shaded)" 출력 데이터 값들의 세트를 생성한다. 예를 들면, 버텍스 쉐이딩은 입력 데이터를 변경해서 렌더될 화상에 조명이 미치는 영향을 고려한다.
헐 쉐이더(21)는 패치 제어점(patch control points)의 세트에 대한 조작을 수행하고, 패치 정수(patch constants)로서 알려진 추가 데이터를 생성하며, 테셀레이션(tessellation) 스테이지(22)는 지오메트리를 세분해서 헐(hull)의 고차 표현(higher order representation)을 창출하고, 도메인 쉐이더(23)는 (버텍스 쉐이더와 비슷한) 테셀레이션 스테이지에 의해 출력된 버텍스들에 대한 조작을 수행하고, 지오메트리 쉐이더(24)는 삼각형, 점 또는 선 등의 전체 프리미티브들을 처리한다. 버텍스 쉐이더(21)와 함께 이들 스테이지는, 그래픽스 처리 파이프라인(3)에 제공된 버텍스 데이터와 코멘드들에 응답하여, 변환 및 조명 조작과 같은, 모든 필요한 프래그먼트 프론트엔드(frontend) 조작과, 렌더될 프리미티브들을 셋업하기 위한 프리미티브 셋업을 효율적으로 수행한다.
그래픽스 처리 파이프라인(3)의 래스터화 스테이지(25)는, 처리하기 위한 개개의 그래픽스 프래그먼트로 렌더 출력(예를 들면, 표시될 화상)을 구성하는 프리미티브들을 래스터화하도록 작동한다. 이것을 하기 위해서, 래스터화기(25)는 렌더링하기 위한 그래픽스 프리미티브들을 수신하고, 프리미티브들을 샘플링 포인트에 래스터화하며, 프리미티브들을 렌더링하기 위한 (적절한 샘플링 위치를 나타내는) 적절한 위치를 갖는 그래픽스 프래그먼트들을 생성한다.
래스터화기에 의해 생성된 프래그먼트들은 처리하기 위한 파이프라인의 나머지 전방으로 전해진다.
얼리 Z/스텐실 스테이지(26)는 래스터화기(25)로부터 수신하는, 프래그먼트들에 대하여 Z(심도) 테스트를 수행하여, 어떤 프래그먼트들이 이 스테이지에서 파기(도태)될 수 있는지를 확인한다. 이것을 하기 위해서, 그것은 래스터화기(25)로부터 발행되는 프래그먼트들(과 관련된)의 심도 값들과 이미 렌더된 프래그먼트들의 심도 값들을 비교하여(이들 심도 값은 타일 버퍼(30)의 일부인 심도(Z) 버퍼에 저장된다) 신규 프래그먼트들이 이미 렌더된 프래그먼트들에 의해 폐쇄되는지(아닌지)를 판정한다. 동시에, 얼리 스텐실 테스트를 수행한다.
그리고 나서, 프래그먼트 얼리 Z 및 스텐실 테스트 스테이지(26)를 통과하는 프래그먼트들은, 프래그먼트 쉐이딩 스테이지(27)에 전해진다. 프래그먼트 쉐이딩 스테이지(27)는 얼리 Z 및 스텐실 테스트를 통과하는 프래그먼트들에 대하여 적절한 프래그먼트 처리 조작을 수행함으로써, 프래그먼트들을 처리해서 적절한 렌더된 프래그먼트 데이터를 생성한다.
이 프래그먼트 처리는 프래그먼트들에 대하여 프래그먼트 쉐이더 프로그램을 실행하고, 프래그먼트들에 텍스처를 적용하며, 프래그먼트들에 포깅(fogging) 또는 다른 조작을 적용하는 것과 같은, 어떤 적절한 원하는 프래그먼트 쉐이딩 처리를 포함하여, 적절한 프래그먼트 데이터를 생성할 수도 있다. 본 실시예에 있어서, 프래그먼트 쉐이딩 스테이지(27)는 쉐이더 파이프라인(프로그래머블 프래그먼트 쉐이더)의 형태이다.
그 중에서도 쉐이드된 프래그먼트들에 대해 파이프라인 깊이 테스트의 마지막을 수행하여 렌더된 프래그먼트가 실제로 최종의 화상에서 보이는지 여부를 판정하는 "레이트" 프래그먼트 Z 및 스텐실 테스트 스테이지(18)가 있다. 이 심도 테스트는 타일 버퍼(30) 내의 Z 버퍼에 기억된 프래그먼트의 위치에 대하여 Z 버퍼 값을 이용해서, 본 기술분야에서 알려진 것처럼, 프래그먼트 쉐이딩 스테이지(27)로부터 발행되는 프래그먼트들(과 관련된)의 심도 값들과 (심도 버퍼에 기억된 것처럼) 이미 렌더된 프래그먼트들의 심도 값들을 비교함으로써, 신규 프래그먼트들에 대한 프래그먼트 데이터가 이미 렌더된 프래그먼트들의 프래그먼트 데이터를 대신해야 하는지 여부를 판정한다. 이 레이트 프래그먼트 심도 및 스텐실 테스트 스테이지(28)는 또한 프래그먼트들에 대하여 어떤 필요한 "레이트" 알파 및/또는 스텐실 테스트들을 수행한다.
레이트 프래그먼트 테스트 스테이지(28)를 통과하는 프래그먼트들은, 필요한 경우, 블렌더(29) 내의 타일 버퍼(30)에 이미 저장된 프래그먼트들과의 어떤 필요한 블렌딩 조작의 영향을 받는다. 이 스테이지에서는 또한 디더 등(미도시)과 같은 프래그먼트들에 필요한 어떤 다른 나머지 조작들을 수행한다.
최종적으로, (블렌드된) 출력 프래그먼트 데이터(값들)는, 타일 버퍼(30)에 기록되고, 그 타일 버퍼로부터 예를 들면, 표시용 프레임 버퍼에 출력될 수 있다. 출력 프래그먼트에 대한 심도 값은, 타일 버퍼(30) 내부의 Z 버퍼에 적절히 기록된다. (타일 버퍼는 버퍼들이 나타내는 각 샘플링 포인트에 대하여(본질적으로 처리되고 있는 타일의 각 샘플링 포인트에 대하여), 각각, 적절한 컬러, 등 또는 Z 값을 기억하는 컬러 및 심도 버퍼들을 저장한다.) 이들 버퍼는 전체 렌더 출력(예를 들면, 표시될 화상)의 일부(타일)를 나타내는 프래그먼트 데이터의 어레이를 기억하고, 버퍼들 내의 샘플 값들의 각 세트는 전체 렌더 출력의 각 화소에 대응한다(예를 들면, 샘플 값들의 각 2×2 세트는 출력 화소에 대응해도 되고, 여기서는 4× 멀티샘플링이 사용되고 있다).
타일 버퍼는 그래픽스 처리 파이프라인(칩)에 위치되는 (국부적인 ) RAM의 일부로서 제공된다.
타일 버퍼(30)로부터의 데이터는 다운샘플링(멀티샘플 리졸브) 라이트아웃 유닛(31)에 입력되고, 그 뒤에 디스플레이 디바이스(미도시)의 프레임 버퍼와 같은, 외부 메모리 출력 버퍼에 출력된다(라이트 백된다). (디스플레이 디바이스는 컴퓨터 모니터 또는 프린터와 같은, 예를 들면, 픽셀들의 어레이로 이루어진 디스플레이를 구비할 수 있다.
다운샘플링 및 라이트아웃 유닛(31)은 타일 버퍼(30) 내에 저장된 프래그먼트 데이터를 출력 버퍼(디바이스)에 대한 적절한 해상도로 다운샘플링하여(즉 출력 디바이스의 화소들에 대응하는 화소 데이터의 어레이가 생성된다), 출력 버퍼에 출력하기 위한 출력 값들(화소들)을 생성한다.
일단 렌더 출력의 타일이 처리되었고, 그것의 데이터가 스토리지용 메인 메모리(예를 들면, 메인 메모리(미도시) 내의 프레임 버퍼)에 전해졌으면, 충분한 타일들이 전체 렌더 출력(예를 들면, 표시될 프레임(화상))을 생성하도록 처리되었을 때까지, 다음 타일이 처리된다. 그리고 나서, 다음 렌더 출력(예를 들면, 프레임) 등에 대해서 처리가 반복된다.
그래픽스 처리 파이프라인(3)에 대한 다른 구성도 물론 가능할 것이다.
상기는 도 1에 나타낸 그래픽스 처리 시스템의 조작의 특정한 특징들에 대해서 설명한다. 이하, 본 발명의 실시예에 따른 도 1에 나타낸 그래픽스 처리 시스템의 조작의 추가 특징들에 대해서 설명한다.
도 2로부터 알 수 있는 것처럼, 그래픽스 처리 파이프라인(3)은 다수의 프로그래머블 처리 또는 "쉐이더" 스테이지들, 즉 버텍스 쉐이더(20), 헐 쉐이더(21), 도메인 쉐이더(23), 지오메트리 쉐이더(24), 및 프래그먼트 쉐이더(27)를 포함한다. 이들 프로그래머블 쉐이더 스테이지들은 한 개 이상의 입력 변수를 갖고 출력 변수의 세트를 생성하며 어플리케이션에 의해 제공되는 각각의 쉐이더 프로그램을 실행한다.
이것을 하기 위해서, 어플리케이션(2)은 GLSL, HLSL, OpenCL 등과 같은, 고레벨 쉐이더 프로그래밍 언어를 이용하여 구현된 쉐이더 프로그램을 제공한다. 그러면 이들 쉐이더 프로그램은 쉐이더 언어 컴파일러(shader language compiler)에 의해 타겟 그래픽스 처리 파이프라인(3)용 이진 코드로 변환된다. 이것은, 본 기술분야에서 알려진 것처럼, 컴파일러 내부의 프로그램의 한 개 이상의 중간 표현의 창출을 포함할 수도 있다. (컴파일러는 예를 들면, 드라이버(4)의 일부일 수 있고, 컴파일러를 실행시키는 특별한 API 콜이 있다. 이와 같이 컴파일러 실행은 어플리케이션에 의해 생성된 API 콜에 응답해서 드라이버에 의해 행해진 드로우 콜 준비(draw call preparation)의 일부인 것처럼 보일 수 있다.
도 2는 그래픽스 처리 유닛(3)의 동작 스테이지를 개략적으로 나타낸 것이다.
도 3은 도 2에 나타낸 그래픽스 처리 파이프라인의 스테이지들 및 처리 동작들의 다양한 동작(으로서 작용하도록) 수행하기 위해 사용되는 그래픽스 처리 유닛(3)의 대응하는 기능 유닛을 나타낸다. (그래픽스 처리 유닛(3) 내에는 다른 기능 유닛들이 있을 수도 있다. 도 3은 단지 편의상 본 발명의 방식의 동작과 관련이 있는 이들 기능 유닛을 나타낸다.)
도 3에 나타낸 것처럼, 그래픽스 처리 유닛(3)은 래스터화기(40), 스레드 스포너(tread spawner)(41), 프로그래머블 실행 유닛(42), 가변 인터폴레이터(varying interpolator)(43), 텍스처 맵퍼(texture mapper)(44), 블렌더(45), 및 한 세트의 레지스터(46)를 포함한다.
스레드 스포너(41)는 래스터화기(40)로부터 수신하는 예를 들면, 프래그먼트들에 대하여, 프로그래머블 실행 유닛(42)이 실행하기 위한 실행 스레드들이 생겨나도록 작동 가능하다.
프로그래머블 실행유닛(42)은 쉐이더 프로그램들을 실행하여 헐 쉐이더, 버텍스 쉐이더 및 프래그먼트 쉐이더와 같은, 그래픽스 처리 파이프라인의 쉐이더 조작을 수행하도록 작동하다. 이것을 행하기 위해서, 그것은 스레드 스포너(41)로부터 실행 스레드들을 수신하고, 이들 실행 스레드들에 대한 관련 쉐이더 프로그램을 실행한다. 이 동작의 일부로서, 도 3에 나타낸 것처럼, 실행 스레드들은, 각 레지스터(46)로부터/에 데이터를 판독해서 기록할 것이다.
이 처리의 일부로서, 도 3에 도시한 바와 같이, 프로그래머블 실행 유닛(42)은 가변 인터폴레이터(43), 텍스처 맵퍼(44) 및 블렌더(45)에 호출해서 특정 그래픽스 처리 동작을 수행할 수 있다. 이것을 행하기 위해서, 프로그래머블 실행 유닛은 예를 들면, 그것이 실행하고 있는 쉐이더 프로그램에서의 특정 명령들에 응답해서 관련 엑셀레이터에 적절한 메시지를 보낼 것이다(그곳으로부터 적절한 응답을 수신할 것이다).
가변 인터폴레이터(43)는 그래픽스 프리미티브들 전체에 걸친 값들을 인터폴레이트(interpolate)하도록 동작하고, 이 동작의 일부로서, 종종 그래픽스 텍스처들을 샘플링하기 위해 사용되는 텍스처 좌표들을 창출한다.
텍스처 맵퍼(44)는, 예를 들면, 가변 인터폴레이터(43)에 의해 발생된 텍스처 좌표들을 이용해서 그래픽스 텍스처들을 샘플링하도록 동작하고, 그것으로부터 필터링된 텍스처 샘플 결과를 생성한다(그것은 예를 들면, 샘플링 포인트를 쉐이딩(shading)할 때 사용하기 위한 프로그래머블 실행유닛(42)으로 돌아갈 수 있다).
블렌더(45)는 프로그래머블 실행유닛(42)에 의해 발생된, 예를 들면, 프래그먼트 쉐이딩 결과들을, 타일 버퍼 및/또는 프레임 버퍼 내에 이미 저장되어 있는 결과들과 같은, 이전에 발생된 플래그먼트 쉐이더 결과들과 혼합하도록 동작한다.
상기 설명한 것처럼, 프로그래머블 실행유닛(42)은 실행 스레드들에 대해서 실행되는 쉐이더 프로그램을 실행하고, 스레드 스포너(41)로부터 스레드들을 수신해서 그래픽스 처리 동작들을 수행한다.
이하, 프로그래머블 실행유닛(42)에서 실행 스레드들에 의해 쉐이더 프로그램의 실행을 위한 다수의 바람직한 실시예를 도 4 내지 도 11을 참조하여 설명할 것이다.
이들 실시예에 있어서, 스레드들은 본 발명에 따라, 쉐이더 프로그램 내부의 상이한 시작점에서 쉐이더 프로그램의 실행을 시작할 수 있다.
상기 설명한 것처럼, 본 출원인은, 많은 쉐이더 프로그램들이 쉐이더 프로그램을 실행하는 복수의 스레드들에 대하여 동일한 결과를 생성하는 표현(expressions)뿐만 아니라 쉐이더 프로그램을 실행하는 각 스레드에 대하여 독립적으로 실행될 필요가 있는 표현을 포함할 수 있다는 점을 인식했다.
도 4는 쉐이더 프로그램에 있어서의 이것의 예를 나타낸다. 도 4는 2개의 뚜렷이 다른 작업량(workload)으로 분할될 수 있는 예시적인 프래그먼트 쉐이더(50)와, 각 실행 스레드에 대하여 동일한 결과들을 생성하는 (그래서 "CT-CSE"(cross-thread-common sub-expression) 작업량(51)이라고 생각할 수 있는) 프로그램 쉐이더 프로그램(50) 내의 한 세트의 표현(51)과, 각 프래그먼트에 대해서 독립적으로 실행될 필요가 있고, 그래서 "프래그먼트당(per fragment)" 작업량(52)이라고 간주할 수 있는, 한 세트의 표현(52)을 나타낸다.
이와 같이, 도 4에 나타낸 것처럼, 컴파일러는 2개의 뚜렷이 다른 직업량으로 분할되는 쉐이더 프로그램(50), "공통 표현" 작업량(51) 및 "프래그먼트당" 작업량(52)을 컴파일할 수 있다(임시 균일 값("균일한 템프(uniform temp)")은 관련 프래그먼트당 작업량 표현(52)이 실행될 때 각 프래그먼트에 대해 사용하기 위한 공통 표현 작업량(51)의 결과(들)를 저장하기 위해서 사용되고 있다).
그리고 나서, 그렇게 컴파일된 쉐이더 프로그램을 실행할 때, 예를 들면, 단일 스레드가 양쪽 공통 표현(51)과 프래그먼트마다의 표현(52)을 실행하도록 구성될 수 있지만, 다른 스레드들만이 공통 표현(51)을 실행한 스레드로부터 (결과들을 이용해서) 프래그먼트당 표현(52)을 실행한다). 그러면 이것은 복수의 실행 스레드에 대한 공통 표현(51)의 실행의 반복을 줄이거나 피하는 것에 도움이 된다.
도 5는 본 발명에 따라 구성되는 쉐이더 프로그램(60)의 또 다른 예를 나타낸다. 이 경우, 쉐이더 프로그램(60)에 대한 명령들의 시퀀스는, 쉐이더 프로그램의 "글로벌" 공통 표현을 수행하고(즉, 쉐이더 프로그램이 실행되는 스레드의 세트(작업항목)의 모드 스레드(작업항목)에 대하여 같은 결과를 생성할 것이다) 레지스터(46)에 이들 표현의 결과를 저장하기 위해서 초기의 명령 세트(61)를 포함한다.
그리고 나서, 쉐이더 프로그램이 처리하는 작업항목의 세트 내부의 정해진 작업그룹에(에 대해서 동일한 결과(들)를 생성하는) 공통 표현을 수행하고, 다시 이들 표현의 결과를 레지스터(46)에 저장하는 쉐이더 프로그램에는 명령들(62)의 세트가 있다. 최종적으로, 쉐이더 프로그램은 각 스레드(작업항목)에 대해서 독립적으로 실행될 필요가 있는 그것의 메인 명령 시퀀스(63)를 포함한다.
도 5에 도시한 바와 같이, 스레드들은 글로벌 공통 표현(64)의 시작 시에, 또는 작업그룹 공통 표현(65)의 시작 시에, 또는 메인 명령 시퀀스(66)의 개시 시에 쉐이더 프로그램을 실행하는 것을 시작할 수 있다.
이와 같이, 바람직한 실시예에 있어서는 쉐이더 프로그램(60)을 실행할 때, 도 5에 도시한 바와 같이, 프로그램(6)이 실행되는 스레드들의 세트의 제1 작업그룹의 제1 스레드는, 글로벌 공통 표현 명령(64)의 시작 시에 쉐이더 프로그램을 실행하는 것을 시작할 것이고, 각 나머지 작업그룹에 대한 제1 스레드는 글로벌 공통 표현 명령 이후 및 작업그룹 공통 표현(65)의 시작 이전에 시작할 것이고, 어떤 나머지 스레드들은 메인 명령 시퀀스(63)의 시작(66) 시에 시작될 것이다.
도 5에 도시한 바와 같이, 쉐이더 프로그램의 시작 이후에 그들의 실행을 시작하는 어떤 스레드들은, 관련 공통 표현 결과들이 공통 표현 명령들의 이전 세트를 실행하는 스레드에 의해 이용 가능하게 될 때까지, 차단(대기)된다 67, 68. 일단 공통 표현의 관련 세트가 스레드에 의해 완료되었다는 것을 신호했으면, 쉐이더 프로그램 실행에서 나중의 시작점을 갖는 스레드들이 그들의 시작점에서 실행하는 것을 시작하도록 허용된다.
도 6은 도 5에 나타낸 쉐이더 프로그램과 비슷하게 배열되어 있는 쉐이더 프로그램(70)을 나타내고, 이 쉐이더 프로그램(70)은 쉐이더 프로그램(74)의 개시 시에, 작업그룹 공통 표현(75)의 개시 시에, 및 메인 명령 시퀀스(76)의 개시 시를 해당 시작점으로 해서, 그것의 개시 시에 "글로벌" 공통 표현을 실행하는 명령(71)의 세트와, 그 뒤에 오는 작업그룹마다의 공통 표현을 실행하는 명령(72)의 세트와, 그 뒤에 최종적으로 메인 명령 시퀀스(73)를 갖는다.
그렇지만, 도 6에 도시한 바와 같이, 작업그룹 공통 표현(72)과 메인 명령 시퀀스(73)에 대한 명령들의 세트는, 쉐이더 프로그램에서의 이전 공통 표현에 의존하고, 쉐이더 프로그램에서의 이전 공통 표현에는 의존하지 않는, 명령들의 세트들로 더 세분된다.
이와 같이, 도 6에 도시한 바와 같이, "작업그룹" 공통 표현을 실행하는 명령들(72)의 세트는, 글로벌 공통 표현 명령들(71)에 의존하지 않는 명령들(77)의 제1 세트와, 글로벌 공통 표현(71)의 결과들에 의존하는 작업그룹 공통 표현 명령들(78)의 제2 세트로 분할되고, 글로벌 공통 표현(71)에 의존하지 않는 작업그룹 공통 표현 명령들(77) 뒤에는 글로벌 공통 표현 명령들(71)이 완료될 때까지 스레드들의 실행을 차단하는 역할을 하는 "대기" 점(79)이 배치되어 있다.
이것은 글로벌 표현 명령들(71)의 실행이 완료되기 전에 글로벌 표현(71)에 의존하지 않는 작업그룹 공통 표현 명령들(77)의 실행을 시작하도록 작업그룹 공통 표현(75)의 개시 시에 시작하는 모든 스레드들을 허용하는 효과가 있다. 이것은 예를 들면, 이들 스레드가 "대기" 점(79)에 도달할 때까지, 스레드들이 실제로 결코 멈출 필요가 없도록, 글로벌 공통 표현(71)이 완료될 수도 있었다는 것을 의미할 수 있다.
이에 상응하여, 메인 명령 시퀀스(73)는 공통 표현들 중의 어느 것인가에 의존하지 않는 명령들 80과, 글로벌 공통 표현(71)에 의존하는 명령들 81과, 작업그룹 공통 표현(72)에 의존하는 명령들 82로 분할되고, 필요하면, 다음의 메인 명령들이 의존하는 공통 표현의 관련 세트가 완료될 때까지 스레드들이 멈추는 해당 대기 점(83)이 있다.
다시, 이것은 잠재적으로 메인 명령 시퀀스의 시작부(76)에 시작하는 스레드들이, 공통 표현이 완전히 실행되기 전에 명령들을 실행하는 것을 허용한다(잠재적으로 이들 스레드 중의 어느 것인가의 실행을 멈출 필요가 없다).
이 도면에 있어서, 검은색 실선은 스레드 실행 경로를 나타내고, 점선은 크로스 스레드 컨트롤 시그널링(cross-thread control signalling)을 나타낸다. 이와 같이, 알 수 있는 것처럼, 스레드는 대기 점 79, 83에 시그널링되는, 글로벌 표1)을 완료함으로써, 이들 지점에 도달하거나 멈추는 스레드들은 그들의 실행을 계속하도록 허용될 수 있다. 이에 대응하여, 스레드가 작업그룹 공통 표현(72)을 완료할 때, 그것은 그 지점에 도달하거나 멈추는 스레드들이 메인 명령 시퀀스의 실행을 계속하는 것을 허용하도록 대기 점 84에 시그널링된다.
쉐이더 컴파일러는 쉐이더 프로그램을 컴파일할 때, (가능한 한) 도 6에 나타낸 순서 및 배치를 갖도록 컴파일된 프로그램에 대한 명령 시퀀스를 발생하도록 배열되어 있다.
도 7은 도 6에 나타낸 쉐이더 프로그램 배치에 대한 스레드들의 실행을 나타내는 플로차트이다. 이 실시예에 있어서, 단일 스레드는 쉐이더 프로그램이 실행되는 각 작업항목(예를 들면, 버텍스, 프래그먼트 또는 계산 작업항목)에 대해서 스폰(spawn)되고, 각 스레드는 도 7에 나타낸 플로차트를 따른다. (이와 같이 이 실시예에 있어서는, 동일한 스레드가 정해진 작업항목에 대해서 글로벌 공통 표현, 작업그룹 공통 표현, 및 실제의 메인 명령 시퀀스를 적절히 실행할 것이다.
(도 7은 스레드 실행 플로우만을 나타낸다. 설명의 편의를 위해, 래스터화, 심도/스텐실 테스팅, 블렌딩 등과 같은, 작업항목의 처리를 완료하는 데 필요한 다른 그래픽스 처리 유닛 작업은 도 7에 나타나 있지 않다.)
도 7에 나타나 있는 바와 같이, 스레드가 발행되면, 우선 스레드가 문제의 쉐이더 프로그램을 실행하기 위한 제1 스레드인지 여부를 판정한다. 스레드가 쉐이더 프로그램을 실행하기 위한 제1 스레드라고 판정되면, 쉐이더 프로그램에 글로벌 공통 표현들이 존재하는지를 판정한다(스텝 91). 만약 그렇다면, 스레드는 이들 글로벌 공통 표현에 대한 명령들을 실행한다(스텝 92).
일단 스레드가 스텝 92에서 글로벌 공통 표현들을 완료했으면, 시스템은 이들 글로벌 공통 표현들이 완료되었다는 것을 표시한다(혹은 그에 상응하여 그것을 나타내기 위한 신호를 보낸다)(스텝 93).
그에 상응하여 스텝 91에서 쉐이더 프로그램에 어떤 글로벌 공통 표현도 없다고 판정하면, 이들 표현이 완료한 것을 즉시 표시한다(및/또는 신호한다)(스텝 93).
한편, 스텝 90에서 스레드가 프래그램 내의 제1 스레드가 아니라고 판정되면, 실행되고 있는 스레드가 그것의 작업그룹 내의 제1 스레드인지 판정한다(스텝 94). 스레드가 그것의 작업그룹 내의 제1 스레드라고 판정되면, 쉐이더 프로그램에 작업그룹 공통 표현이 있는지 여부를 판정한다(스텝 95).
도 7에 도시한 것처럼, 일단 그 스레드가 글로벌 공통 표현들을 완료했으면 프로그램에 대한 제1 스레드를 위해서 처리가 그에 상응하여 스텝 95로 진행된다(혹은 그 스레드가 어떤 글로벌 공통 표현도 존재하지 않는다고 판정한다).
스텝 95에서 작업그룹 공통표현이 없다고 판정하면, 스레드가 공통표현에 의존하지 않는 작업그룹 공통 표현에 대한 명령들을 실행한다(스텝 96). 스레드는 글로벌 공통표현이 완료되기를 (필요하다면) 기다리고(스텝 97 및 98), 일단 그들이 있으면, 글로벌 공통 표현에 의존하는 문제의 작업그룹용 작업그룹 공통 표현에 대한 명령들을 실행한다(스텝 99).
일단 글로벌 공통 표현에 의존하는 작업그룹 공통 표현이 완료되었으면, 작업그룹 공통 표현이 완료라고 표시된다(또는 그렇지 않으면 그런 식으로 신호된다)(스텝 100).
도 7에 도시한 바와 같이, 스텝 95에서 쉐이더 프로그램에 작업그룹 공통 표현이 존재하지 않는다고 판정되면, 작업그룹 공통 표현은 그에 상응하여 완료라고 표시 및/또는 신호된다.
한편, 스텝 94에서 스레드가 작업그룹 내의 제1 스레드가 아니라고 판정되면, 스레드는 쉐이더 프로그램 내의 공통 표현들 중의 어는 것인가에 의존하지 않는 메인 명령 시퀀스 내의 명령들을 실행하도록 진행한다(스텝 101).
이에 상응하여, 도 7에 도시한 바와 같이, 일단 스레드가 작업그룹 공통 표현을 완료했으면, 그것은 공통 표현 중의 어느 것인가에 의존하지 않는 메인 명령 시퀀스 내의 명령들을 실행하도록 진행한다(스텝 101).
일단 스레드가 공통 표현에 의존하지 않는 메인 명령 시퀀스 내의 명령들을 완료했으면, 글로벌 공통 표현이 완료될 때까지 (필요하다면) 기다린다(스텝 102 및 103). 일단 글로벌 공통 표현이 완료되었으면, 스레드는 글로벌 공통 표현에 의존하는 메인 명령 시퀀스 내의 명령들을 실행한다(스텝 104). 스레드는 다시 작업그룹 공통 표현이 완료되기를 (필요하다면) 기다리고(스텝 105 및 106), 일단 일들 명령이 완료되었으면, 그것은 작업그룹 공통 표현에 의존하는 나머지 메인 명령 시퀀스 명령들을 실행한다(스텝 107).
그리고 나서 스레드 실행이 완료한다(스텝 108).
이것은 쉐이더 프로그램이 실행되는 각 스레드에 대해서 반복된다.
이 프로세스에 있어서, 공통 표현 명령들을 실행하는 스레드들은 그들의 결과를 적절한 레지스터(46)에 저장함으로써, 이들 결과가 관련 명령 시퀀스(들)를 실행할 때 (그들 자체가 공통 명령들을 실행하지 않았던) 나중의 스레드들에 이용 가능하다. 공통 표현 결과를 메인 메모리에 보존하고 그 후에 나중의 스레드들에 대한 이들 결과를 재로딩하는 것과 같은, 다른 방식도 원한다면 가능할 것이다.
도 8은 도 6 및 7에 나타낸 실시예에 있어서의 예시적인 스레드들에 의한 명령들의 실행 타이밍을 나타낸다.
도 8에 있어서, 행은 실행 스레드들을 나타내고, 시간은 왼쪽에서 오른쪽으로 증가한다. W[x]는 작업그룹 수 x를 나타내고, MIS[x][y]는 정해진 작업항목에 대한 메인 명령 시퀀스를 나타내며(x는 작업그룹 수, y는 작업항목 수이다), (i)는 독립된 명령 시퀀스를 나타내고, (dep G)는 글로벌 공통 표현(글로벌 CT-CSE)에 의존하는 명령 시퀀스를 나타내며, (dep W)는 작업그룹 공통 표현(작업그룹 CT-CSE)에 의존하는 명령 시퀀스를 나타낸다.
도 8은 각각이 2개의 작업항목(하나의 작업항목은 한 개의 하드웨어 스레드에 맵핑한다)을 포함하는, 2개의 작업그룹으로 이루어진 잡의 실행을 나타낸다.
도 8은 멀티스레드(multithreaded) 실행유닛을 이용해서, 의존 작업량의 동시 실행을 허용하는 그래픽스 처리유닛에서의 상기 잡에 대한 스레드들의 실행 타이밍을 나타낸다. 여기에서는 도 8에 나타낸 실행 타이밍은 단지 예시적인 것이며, 스레드 스케줄링은 예를 들면 도 8에 나타낸 것들과 타이밍이 다르다는 것을 알 수 있을 것이다. (예를 들면, 도 8은 모든 4개의 스레드들이 동시에 그들의 실행을 시작할 수 있는 것으로 가정한다.)
도 8에 도시한 바와 같이, 제1 작업그룹 내의 제1 스레드(120)는 글로벌 공통 표현(121)을 실행하는 것에 의해 시작한다.
제1 작업그룹의 제2 스레드(122)는 그에 상응하여 쉐이더 프로그램 내의 공통 표현들 중의 어느 것인가의 실행에 의존하지 않는 그 작업그룹에 대한 메인 명령 시퀀스의 명령들 123의 실행을 시작한다. 도 8에 도시한 바와 같이, 이 제2 스레드의 실행은 이들 "독립된" 명령들이 완료되었을 때 차단된다.
제2 작업그룹으로부터의 제1 스레드 124는 그에 상응하여 글로벌 표현에 의존하지 않는 제2 작업그룹에 대한 작업그룹 공통 표현 125의 실행을 시작한다. 다시, 그 스레드에 의한 추가 실행은 글로벌 표현에 독립적인 이들 작업그룹 공통 표현이 완료되었을 때 차단된다.
제2 작업그룹에 대한 제2 스레드 125는 그에 상응하여 공통 표현 중의 어느 것인가에 독립적인 메인 명령 시퀀스 내의 명령들 126의 실행을 시작한다. 다시, 그 스레드의 실행은 이들 "독립된" 명령들의 실행을 완료하면 멈추게 된다.
제1 스레드 120가 글로벌 공통 표현 121을 완료할 때, 그 이벤트가 다른 스레드들에 신호되고 127, 스레드 120은 글로벌 공통 표현 121에 독립적인 제1 작업그룹에 대한 공통 표현 128(에 대한 명령)의 실행과, 그 다음의 글로벌 공통 표현 121에 의존하는 작업그룹에 대한 공통 표현 129의 실행을 시작한다.
그에 상응하여, 제1 작업그룹에 대한 제2 스레드 122는 (제1 스레드 120에 의해 지금 완료되었던) 글로벌 공통 표현에 의존하는 메인 명령 시퀀스 명령들 130을 실행하도록 해방된다. 다시, 그 스레드의 실행은 이들 명령들이 실행되었을 때 멈추게 된다.
제2 작업그룹의 제1 스레드 124는 그에 상응하여 글로벌 공통 표현 121에 의존하는 제2 작업그룹에 대한 공통 표현의 명령들 131을 (이들 표현이 현재 완료되었을 때) 실행한다.
일단 제2 작업그룹의 제1 스레드(124)가 글로벌 공통 표현 121에 의존하는 작업그룹 공통 표현 131을 완료했으면, 그 이벤트가 다른 스레드들에 신호된다132.
제2 작업그룹에 대한 제2 스레드(125)가 그에 상응하여 글로벌 공통 표현에 의존하는 메인 명령 시퀀스 명령들 133을 실행하도록 허용되고, 그 후에 제2 작업그룹의 제1 스레드(124)가 글로벌 공통 표현(121)에 의존하는 작업그룹에 대한 공통 표현 131을 완료할 때까지 기다린다.
그리고 나서, 도 8에 도시한 바와 같이, 제2 작업그룹 내의 제1 스레드가 작업그룹에 대한 모든 공통 표현을 완료했을 때, 제2 작업그룹에 대한 양쪽 스레드 124 및 125가 메인 명령 시퀀스 명령들의 모든 나머지 처리를 완료한다.
그에 상응하여, 일단 제1 작업그룹에 대한 제1 스레드 120가 그 작업그룹에 대한 모든 공통 작업그룹 공통 표현의 실행을 완료했을 때, 그 이벤트가 신호되고134, 제1 작업그룹에 대한 제1 및 제2 스레드 120, 122는, 도 8에 도시한 바와 같이, 실행하기 위해 남아 있는 나머지 메인 명령 시퀀스 명령들의 실행을 완료한다.
도 9는 도 6에 나타낸 것에 대응하는 시퀀스로 명령들을 조직화한 쉐이더 프로그램을 실행하기 위한 또 다른 실시예를 나타낸다(즉, 글로벌 공통 표현을 실행하기 위한 명령들 71의 세트와, 명령들의 각각의 서브세트로 분할되는, 작업그룹 공통 표현 72를 실행하기 위한 명령들 72의 세트와, 글로벌 공통 표현에 의존하지 않는 작업그룹 공통 표현에 대한 한 개의 서브세트 77과, 글로벌 공통 표현 71에 의존하는 작업그룹 공통 표현을 실행하는 한 개의 서브세트 78가 있고, 그 후에는 3개의 서브세트로 다시 분할되는 메인 명령 시퀀스 73과, 어떤 공통 표현에든 의존하지 않는 메인 명령들(즉, 작업항목당 명령들)의 제1 서브세트 80과, 글로벌 공통 표현에 의존하는 작업항목당 명령들의 서브세트 81과, 작업그룹 공통 표현에 의존하는 작업항목당 명령들 82의 서브세트 82가 있다).
다시, 도 9에 나타낸 구성에 있어서는, 스레드들은, 글로벌 공통 표현 71에 대한 명령들의 시작부 74에서, 또는 작업그룹 공통 표현 명령들 72의 시작부 75에서, 또는 작업항목당 명령들 73, 메인 명령 시퀀스의 시작부 76에서 실행을 시작할 수 있다.
도면에 있어서, 검은색 실선은 다시 스레드 실행 경로를 나타내고, 점선은 크로스 스레드 컨트롤 시그널링을 나타낸다. 이와 같이, 보여진 것처럼, 스레드가 글로벌 표현 71을 완료하면, 그것은 대기점 79, 83에 신호됨으로써, 이들 대기점에 도달하거나 멈추게 되는 스레드들은 그들의 실행을 계속하도록 허용될 수 있다. 이에 대응하여, 스레드가 작업그룹 공통 표현 72를 완료하면, 그것은 그 지점에 도달하거나 멈추게 되는 스레드가 메인 명령 시퀀스의 실행을 계속하도록 대기점 84에 신호된다.
쉐이더 컴파일러는, 쉐이더 프로그램을 컴파일할 때, 도 9에 나타낸 순서 및 배치를 (가능한 한) 갖도록 컴파일된 프로그램에 대한 명령 시퀀스를 생성하도록 배치되어 있다.
상기 설명한 것처럼, 도 6, 7 및 8에 나타낸 쉐이더 프로그램의 실행 시에는, 단일 스레드가 스폰(spawn)되어, 각 작업항목(예를 들면, 버텍스, 프래그먼트, 또는 계산 작업항목)에 대한 쉐이더 프로그램을 실행한다. 이와 같이 문제의 작업항목이 모든 쉐이더 프로그램을 실행하는 것이면, 전체 쉐이더 프로그램을 실행하는 작업항목에 대하여 단일 스레드가 있을 것이다.
도 9에 나타낸 실시예에 있어서는, 정해진 작업항목에 대한 쉐이더 프로그램의 모든 관련 부분을 실행하는 단일 스레드 대신에 (즉, 작업항목이 쉐이더 프로그램 내의 공통 표현들 중의 어느 것인가를 실행하는 것이면, 작업항목에 있어서의 같은 단일 스레드가 이들 공통 표현 및 작업항목당 메인 명령 시퀀스 양쪽을 실행할 것이다), 작업항목이 쉐이더 프로그램 내의 공통 표현들 중의 어느 것인가를 실행하는 것이면, 복수의 스레드는, 문제의 작업항목에 대하여 실행되는 쉐이더 프로그램 실행의 각각의 서브파트(subpart)에 대한 한 개의 스레드, 작업항목에 대해서 스폰되어 발행된다.
이와 같이, 전체 쉐이더 프로그램이 한 작업항목에 대해서 실행되는 것이면, 3개의 스레드가 쉐이더 프로그램을 실행하기 위한 작업항목에 대해서 스폰되어 발행될 것이고, 즉, 한 개의 스레드는 글로벌 공통 표현 71을 실행하여 이들 표현의 시작부 74에서 시작하고, 한 개의 스레드는 작업그룹 공통 표현 72를 실행하며(이렇게 해서 이들 작업그룹 공통 표현의 시작부 75에서 그것의 실행을 시작한다), 한 개의 스레드는 메인 작업항목당 명령 시퀀스 명령들 73을 실행하여 이들 작업항목당 명령들의 시작부 76에서 시작한다.
이에 상응하여, 작업그룹 공통 표현과 메인 명령 시퀀스가 작업항목에 대해서 실행되면, 그 후에 2개의 스레드가 스폰될 것이고, 즉 한 개의 스레드는 작업그룹 공통 표현 72를 실행하고, 한 개의 스레드는 작업항목당 명령 시퀀스 73을 실행한다. 최종적으로, 작업항목에 대하여 작업항목당 메인 명령 시퀀스 73을 실행하는 것만이 필요하면, 이들 명령을 실행하기 위한 단일 스레드가 작업항목에 대해서 스폰되어 발행될 것이다.
작업항목이 쉐이더 프로그램의 한 개 이상의 "부분"을 실행하는 다수의 실행 스레드들을 스폰해서 실행하는 이러한 배치는, 예를 들면, 모든 작업항목당 명령들 및 모든 작업그룹 공통 표현에 있어서의 비의존 작업량이 병렬로 (잠재적으로) 작동 가능하므로, 문제의 작업항목에 대한 실행의 더 큰 병렬화를 허용한다. 그것은 또한 공통 표현 명령들의 실행을 더 간단하게 완료하는 것을 용이하게 할 수 있다. 예를 들면, 스레드가 실제로 완료(후퇴)하는 일없이 명령 시퀀스에서의 관련 지점에 스레드가 도달했다는 것을 신호해야 하는 것보다는, 스레드 완료로 표시가능하기 때문에(스레드가 실행하고 있는 쉐이더 프로그램의 관련 부분을 완료할 때 관련 스레드가 그것의 실행을 완료할 것이기 때문에), 공통 표현 명령들의 실행을 더 간단하게 완료하는 것을 용이하게 할 수도 있다.
도 10은 도 9에 나타낸 구성에 있어서의 스레드들의 스포닝(spawing) 및 실행을 나타내는 플로차트이다.
도 10의 플로차트는, 작업항목(버텍스, 프래그먼트, 계산 작업항목)당 한 번 실행된다. 볼 수 있는 것처럼, 3개의 하드웨어까지는 실행용 스레드들은 정해진 작업항목에 대한 실행유닛에서 스폰될 수 있다.
(도 10은 다시 스레드 실행 플로우만을 나타낸다. 설명을 용이하게 하기 위해서, 래스터화, 심도/스텐실 테스팅, 블렌딩 등과 같은, 작업항목의 처리를 완료하는 데에 필요한 다른 그래픽스 처리유닛 작업은 도 10에 도시되어 있지 않다.)
도 10에 도시한 바와 같이, 제1 스텝은 실행되고 있는 스레드가 쉐이더 프로그램을 실행하고 있는 제1 스레드인지 여부를 판정하는 것이다(스텝 140). 만약 그렇다면, 쉐이더 프로그램에서의 글로벌 공통 표현을 실행하는 명령들이 있는지 여부를 판정한다(스텝 141). 만약 그렇다면, 문제의 작업항목에 대한 제1 스레드는 글로벌 공통 표현 쉐이더 프로그램 시작(진입)점에서 쉐이더 프로그램을 실행하는 것을 시작하기 위해서 발행된다(스텝 142). 스레드가 신호되는 이들 명령의 처리를 완료했고 스레드가 후퇴했으면, 스레드는 글로벌 공통 표현에 대한 명령들 71을 실행할 것이다.
스텝 141에서 쉐이더 프로그램에 어떤 글로벌 공통 표현도 존재하지 않는다고 판정되면, 글로벌 공통 표현은 완료로 표시된다(스텝 143).
도 10에 도시한 바와 같이, 스텝 140에서 스레드가 프로그램을 실행하기 위한 제1 스레드가 아니라고 판정되면, 또는 스텝 142에서 관련 "헬퍼(helper)" 스레드가 발행되었으면, 스레드가 그것의 작업그룹에 대해 실행되는 제1 스레드인지 여부를 판정한다(스텝 144). 만약 그렇다면(그것에 의해 작업그룹 공통 표현이, 만약 있다면, 문제의 작업항목에 대해서 실행될 필요가 있다는 것을 나타낸다), 쉐이더 프로그램에 존재하는 문제의 작업그룹에 대한 공통 표현이 있는지 여부를 판정한다(스텝 145).
쉐이더 프로그램에 있어서 작업그룹에 대한 공통 표현이 있다고 판정되면, 쉐이더 프로그램에 있어서 작업그룹 공통 표현을 실행하기 위해서 작업항목에 대해서 제2 헬퍼 스레드가 발행된다(스텝 146). 그리고 나서, 그 스레드가 신호되는 이들 공통 표현의 처리를 완료해서 스레드가 후퇴했으면, 스레드는 문제의 작업그룹에 대한 쉐이더 프로그램에 있어서 작업그룹 공통 표현을 실행한다.
한편, 스텝 145에서 쉐이더 프로그램에 존재하는 어떤 작업그룹 공통 표현도 없다고 판정되면, 작업그룹에 대한 작업그룹 공통 표현이 완료라고 표시된다(스텝 147).
스레드가 작업그룹 내의 제1 스레드가 아니라고 판정되면, 또는 스텝 146에서 작업그룹 공통 표현을 실행하기 위한 헬퍼 스레드가 발행되었으면, 쉐이더 프로그램의 작업항목 메인 명령 시퀀스를 실행하기 위해서 작업항목에 대해서 스레드가 발행된다(스텝 148). 그 스레드는 쉐이더 프로그램에 있어서 작업항목 메인 명령 시퀀스의 시작부에서 쉐이더 프로그램에 진입하여, 가장 먼저 쉐이더 프로그램 내의 공통 표현들 중의 어느 것에도 의존하지 않는 메인 명령 시퀀스 명령들 80을 실행한다(스텝 149).
일단 스레드가 메인 명령 시퀀스 내의 비의존 명령들을 완료했으면, 글로벌 공통 표현 명령들이 완료될 때까지 (필요하다면) 기다리고(스텝 150, 151)(예를 들면, 관련 헬퍼 스레드가 이들 명령을 완료하고), 그리고 나서 글로벌 일반 표현에 의존하는 작업항목당 메인 명령 시퀀스 명령들을 실행하도록 진행한다(스텝 152).
다시, 스레드가 글로벌 공통 표현에 의존하는 메인 명령 시퀀스 명령들을 완료했을 때, 작업그룹당 공통 표현에 의존하는 작업항목당 메인 명령 시퀀스 명령들을 실행하기 전에(스텝 155), 작업그룹 공통 표현이 완료될 때까지 (필요하다면) 기다린다(스텝 153 및 154).
그리고 나서, 스레드의 실행이 완료한다(스텝 156).
이것은 쉐이더 프로그램이 실행되는 각 작업항목에 대해서 반복된다.
이 프로세스에 있어서, 공통 표현 명령들을 실행하는 스레드들은 그들의 결과를 적절한 레지스터(46)에 저장함으로써, 이들 결과가 관련 명령 시퀀스(들)를 실행할 때 (그들 자체가 공통 명령들을 실행하지 않았던) 나중의 스레드들에 이용 가능하다. 공통 표현 결과를 메인 메모리에 저장하고 그 후에 나중의 스레드들에 대한 이들 결과를 재로딩하는 것과 같은, 다른 방식도 원한다면 가능할 것이다.
도 11은 도 9 및 10에 나타낸 실시예에 있어서 스레드들의 실행을 위한 해당 예시적인 타이밍도를 나타낸다.
도 11에 있어서, 다시 행은 실행 스레드들을 나타내고, 시간은 왼쪽에서 오른쪽으로 증가한다. W[x]는 작업그룹 수 x를 나타내고, MIS[x][y]는 정해진 작업항목에 대한 메인 명령 시퀀스를 나타내며(x는 작업그룹 수, y는 작업항목 수이다), (i)는 독립된 명령 시퀀스를 나타내고, (dep G)는 글로벌 공통 표현(글로벌 CT-CSE)에 의존하는 명령 시퀀스를 나타내며, (dep W)는 작업그룹 공통 표현(작업그룹 CT-CSE)에 의존하는 명령 시퀀스를 나타낸다.
도 11은, 멀티스레드(multithreaded) 실행유닛을 이용해서, 의존 작업량의 동시 실행을 허용하는 그래픽스 처리유닛에서의 스레드들의 실행 타이밍을 다시 나타낸다. 다시 도 11에 나타낸 실행 타이밍은 단지 예시적인 것이며, 스레드 스케줄링은 예를 들면 도 11에 나타낸 것들과 타이밍이 다르다는 것을 알 수 있을 것이다. (예를 들면, 도 11은 모든 4개의 스레드들이 동시에 그들의 실행을 시작할 수 있다고 가정한다.)
도 11a는 단일 작업항목으로 이루어진 단일 작업그룹으로 구성된 잡의 실행을 나타내고, 여기서 쉐이더 프로그램의 서로 다른 부분의 사이즈는 공통 표현 결과를 차단하고 기다리는 스레드들에 의한 어떤 스톨(stalls)도 없도록 한다.
이와 같이, 도 11a에 도시한 것처럼, 처리될 작업항목에 대해서는 실행을 위한 3개의 스레드들이 발행되는 데, 제1 스레드 160은 글로벌 공통 표현을 실행하기 위한 것이고, 제2 스레드 161은 작업그룹 공통 표현을 실행하기 위한 것이며, 제3 스레드 162는 작업항목당 명령들을 실행하기 위한 것이다.
도 11a에 도시한 것처럼, 글로벌 공통 표현을 실행하고 있는 스레드 160은, 이들 글로벌 명령을 실행하는 것을 완료할 때 그 이벤트를 신호할 것이다. 이에 상응하여, 작업그룹 공통 표현을 실행하고 있는 스레드 161은 이들 표현을 완료했을 때를 신호할 것이다. 제3 스레드 162는 메인 명령 시퀀스 명령들을 간단히 실행할 것이다.
도 11a에 나타낸 것처럼, 각 스레드는 동시에 그 관련 명령들의 세트를 실행하는 것을 시작하고, 이 경우에 스레드 차단에 의한 어떤 지연도 없기 때문에, 그들이 끝날 때까지 그들은 그들의 명령을 계속해서 간단히 실행한다.
도 11b는 단일 작업항목(및 작업그룹)이 있는 스레드들에 대한 실행의 타이밍을 다시 나타내지만, 이 경우에 이들 표현을 완료하기 위해서 발행되는 스레드 160에 의한 글로벌 공통 표현의 완료가 비의존 작업그룹 공통 표현과 비의존 작업항목당 공통 표현의 완료보다 오래 걸린다. 이와 같이, 도 11b에 도시한 것처럼, 글로벌 공통 표현을 실행하고 있는 스레드 160가 이들 명령을 완료할 때까지 작업그룹 공통 표현 명령들을 실행하고 있는 스레드 161과 작업항목당 명령들을 실행하고 있는 스레드 162가 모두 멈추게 된다.
스레드 160이 완료하면(즉, 글로벌 공통 표현이 완료되었다는 것을 신호했으면), 도 11b에 도시한 바와 같이, 스레드 160 및 162는 글로벌 공통 표현에 의존하는 관련 명령들로 그들의 실행을 계속한다.
다시, 예시의 목적을 위해서, 작업그룹 공통 표현 명령들을 실행하고 있는 스레드 161가 이들 작업그룹 공통 표현의 실행을 완료하기 전에 작업항목당 명령을 실행하고 있는 스레드 162가 글로벌 공통 표현에 의존하는 작업항목당, 메인 명령 시퀀스 명령들을 완료하는 것으로 가정한다. 이와 같이, 스레드 162는, 도 11b에 도시한 것처럼, 스레드 161이 작업그룹 공통 표현 명령들을 완료할 때까지 정지하게 된다. 스레드가 161이 완료되면(작업그룹 공통 표현 명령 실행이 완료되었다는 것을 신호하면), 도 11b에 도시한 것처럼, 스레드 162는 나머지의 작업항목당 메인 명령 시퀀스 명령들을 실행한다.
상기로부터 알 수 있는 것처럼, 본 발명은, 적어도 그것의 바람직한 실시예에 있어서, 쉐이더 프로그램의 좀 더 효율적인 실행을 제공할 수 있다. 이것은, 적어도 본 발명의 바람직한 실시예에 있어서, 실행 스레드들이 쉐이더 프로그램의 명령들의 시퀀스 내부의 서로 다른 지점에서 쉐이더 프로그램의 실행을 시작하도록 허용하는 것에 의해, 특히 일부 스레드가 쉐이더 프로그램에 있어서 공통 표현을 실행하는 명령들 뒤에 쉐이더 프로그램의 실행을 시작하도록 허용하는 것에 의해 달성된다.

Claims (23)

  1. 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 프로그래머블 쉐이더 스테이지를 포함하는 그래픽스 처리 파이프라인의 작동방법으로서, 상기 방법은
    쉐이더 스테이지가, 쉐이더 프로그램을 실행할 때 수행되는 명령들의 시퀀스를 포함하는 상기 쉐이더 프로그램을 실행하여 쉐이딩 동작을 수행하는 경우에,
    실행을 위해서 상기 쉐이더 프로그램이 실행되는 상기 쉐이더 스테이지에 복수의 실행 스레드들을 발행하는 것과,
    상기 쉐이더 프로그램의 실행을 위해 상기 쉐이더 스테이지에 상기 실행 스레드들을 발행하는 것은, 상기 쉐이더 프로그램의 실행이 상기 실행 스레드들의 상이한 것들에 대해서 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령들로 시작될 수 있도록 구성되며,
    상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것을 포함하며,
    상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것은,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 제1 지점에서 시작하는 상기 실행 스레드들 중의 한 개 이상의 실행 스레드에 대하여 상기 쉐이더 프로그램을 실행하는 것과,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 상이한 지점에서 시작하는 상기 실행 스레드들 중의 또 다른 하나 또는 또 다른 것들에 대하여 상기 쉐이더 프로그램을 동시에 실행하는 것을 포함하는 것을 특징으로 하는, 작동방법.
  2. 제 1 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 실행 스레드들은, 상기 쉐이더 프로그램의 시작부에서 및 상기 쉐이더 프로그램 내의 공통 표현들을 계산하는 상기 쉐이더 프로그램 내의 적어도 몇몇 명령들 이후에 상기 쉐이더 프로그램의 실행을 시작할 수 있는, 작동방법.
  3. 제 1 항 또는 제 2 항에 있어서,
    실행 스레드들은, 상기 쉐이더 프로그램이 실행되고 있는 실행 스레드들의 세트의 서브 세트에 대해 공통되는 상기 쉐이더 프로그램 내의 표현들을 실행하는 명령들 이후에 상기 쉐이더 프로그램의 실행을 시작할 수 있는, 작동방법.
  4. 제 1 항 또는 제 2 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 스레드들의 세트의 모든 스레드들에 대하여 공통 결과를 생성하는 쉐이더 프로그램 표현들에 대한 명령들은, 상기 쉐이더 프로그램에 대한 명령들의 시퀀스에 있어서, 각 스레드에 대해서 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들보다 빠른 것을 특징으로 하는, 작동방법.
  5. 제 1 항 또는 제 2 항에 있어서,
    상기 쉐이더 프로그램은, 상기 쉐이더 프로그램이 실행되는 스레드들의 세트의 모든 스레드들에 대하여 공통 결과를 생성하는 쉐이더 프로그램 표현들을 실행하는 명령들과,
    각 스레드에 대해서 개별적으로 실행될 필요가 있는 표현을 실행하지만, 상기 쉐이더 프로그램 내의 공통 표현들을 실행하는 명령들의 결과들에는 의존하지 않는 명령들을 포함하고,
    상기 쉐이더 프로그램이 실행되는 실행 스레드들은, 상기 쉐이더 프로그램 내의 공통 표현들을 실행하는 상기 쉐이더 프로그램 내의 명령들 이후에 그러나 각 스레드에 대해서 개별적으로 실행될 필요가 있는 표현들을 실행하지만, 상기 쉐이더 프로그램 내의 공통 표현들을 실행하는 명령들의 결과들에는 의존하지 않는 명령들의 시작 이전에 상기 쉐이더 프로그램의 실행을 시작할 수 있는 것을 특징으로 하는, 작동방법.
  6. 제 1 항 또는 제 2 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 작업항목에 대하여 단일 스레드를 발행하는 것을 포함하는 것을 특징으로 하는, 작동방법.
  7. 제 1 항 또는 제 2 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 작업항목에 대하여 복수의 스레드를 발행하는 것을 포함하고, 각 스레드는 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령으로 상기 쉐이더 프로그램의 실행을 시작하는 것을 특징으로 하는, 작동방법.
  8. 제 1 항 또는 제 2 항에 있어서,
    한 개의 실행 스레드가 상기 쉐이더 프로그램을 완료할 때까지 상기 쉐이더 프로그램의 시작부에서 그들의 실행을 시작하기 위한 스레드들을 발행하는 것과,
    그 후에 상기 쉐이더 프로그램 내의 나중 시작점에서 상기 쉐이더 프로그램을 시작하기 위한 실행 스레드들을 발행하는 것을 포함하는 것을 특징으로 하는, 작동방법.
  9. 제 1 항 또는 제 2 항에 있어서,
    실행 스레드들에 의해 상기 쉐이더 프로그램 내의 특정 명령들 또는 명령들의 세트들의 완료를 추적하는 것과,
    스레드가 상기 쉐이더 프로그램 내의 특정 명령 또는 명령들의 세트를 완료할 때 실행을 위해 나중 시작점에서 상기 쉐이더 프로그램을 시작하는 스레드들을 해방하는 것을 포함하는 것을 특징으로 하는, 작동방법.
  10. 제 1 항 또는 제 2 항에 있어서,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내서 나중 지점에서 상기 쉐이더 프로그램의 실행을 시작하는 다른 스레드들이 사용하기 위한 레지스터들 내의 명령들의 실행에 의해 실행 스레드가 발생하는, 결과들을 저장하는 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 제1 시작점에서 상기 쉐이더 프로그램의 실행을 시작하는 적어도 한 개의 실행 스레드를 구비하는 것을 특징으로 하는, 작동방법.
  11. 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 그래픽스 처리 파이프라인의 쉐이더 스테이지에 대한 명령들을 생성하기 위한 프로그램을 컴파일하는 방법으로서,
    상기 방법은 쉐이더 스테이지에 의해 실행되는 쉐이더 프로그램에 대하여,
    상기 쉐이더 프로그램이 실행될 작업항목의 세트의 모든 작업항목에 대하여 같은 결과를 생성하는 쉐이더 프로그램 표현들에 대한 명령들을 식별하고, 각 작업항목에 대해서 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들 이전에 상기 식별된 명령들을 상기 쉐이더 프로그램의 실행 순서로 배치하는 것을 포함하는 것을 특징으로 하는, 컴파일 방법.
  12. 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 프로그래머블 쉐이더 스테이지를 포함하는 그래픽스 처리 파이프라인으로서,
    상기 그래픽스 처리 파이프라인은,
    쉐이더 스테이지가, 쉐이더 프로그램을 실행할 때 수행되는 명령들의 시퀀스를 포함하는 상기 쉐이더 프로그램을 실행하여 쉐이딩 동작을 수행하는 경우에,
    실행을 위해서 상기 쉐이더 프로그램이 실행되는 상기 쉐이더 스테이지에 복수의 실행 스레드들을 발행하고,
    상기 쉐이더 프로그램의 실행을 위한 상기 쉐이더 스테이지에 상기 실행 스레드들을 발행하는 것은, 상기 실행 스레드들 중의 상이한 것들에 대하여 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령들로 상기 쉐이더 프로그램의 실행이 시작될 수 있도록 구성되고,
    상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하도록 구성되며,
    상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것은,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 제1 지점에서 시작하는 상기 실행 스레드들 중의 한 개 이상의 실행 스레드에 대하여 상기 쉐이더 프로그램을 실행하는 것과,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 상이한 지점에서 시작하는 상기 실행 스레드들 중의 또 다른 하나 또는 또 다른 것들에 대하여 상기 쉐이더 프로그램을 동시에 실행하는 것을 포함하는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  13. 제 12 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 실행 스레드들은, 상기 쉐이더 프로그램의 시작부에서 및 상기 쉐이더 프로그램 내의 공통 표현들을 계산하는 상기 쉐이더 프로그램 내의 적어도 몇몇 명령들 이후에 상기 쉐이더 프로그램의 실행을 시작할 수 있는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  14. 제 12 항 또는 제 13 항에 있어서,
    실행 스레드들은 상기 쉐이더 프로그램이 실행되는 실행 스레드들의 세트의 서브세트에 대하여 공통되는 상기 쉐이더 프로그램 내의 표현들을 실행하는 명령들 이후에 상기 쉐이더 프로그램의 실행을 시작할 수 있는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  15. 제 12 항 또는 제 13 항에 있어서,
    상기 쉐이더 프로그램이 실행되는 스레드들의 세트의 모든 스레드들에 대하여 공통 결과를 생성하는 모든 쉐이더 프로그램 표현들에 대한 명령들은, 상기 쉐이더 프로그램에 대한 명령들의 시퀀스에 있어서, 각 스레드에 대하여 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들보다 더 빠른 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  16. 제 12 항 또는 제 13 항에 있어서,
    상기 파이프라인은,
    상기 쉐이더 프로그램이 실행되는 스레드들의 세트의 모든 스레드들에 대하여 공통 결과를 생성하는 쉐이더 프로그램 표현들을 실행하는 명령들과,
    각 스레드에 대해서 개별적으로 실행될 필요가 있는 표현들을 실행하지만, 상기 쉐이더 프로그램 내의 공통 표현들을 실행하는 명령들의 결과들에는 의존하지 않는 명령들을 포함하는 쉐이더 프로그램에 대해서,
    쉐이더 프로그램 내의 공통 표현들을 실행하는 쉐이더 프로그램 내의 명령들 이후에 그러나 각 스레드에 대해서 개별적으로 수행될 필요가 있는 표현들을 실행하지만, 쉐이더 프로그램 내의 공통 표현들을 실행하는 명령들의 결과들에는 의존하지 않는 명령들의 시작부 이전에 실행 스레드들의 실행을 시작할 수 있도록 구성되는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  17. 제 12 항 또는 제 13 항에 있어서,
    상기 파이프라인은
    쉐이더 프로그램이 실행되는 작업항목에 대하여 단일 스레드를 발행하도록 구성되는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  18. 제 12 항 또는 제 13 항에 있어서,
    상기 파이프라인은,
    쉐이더 프로그램이 실행되는 작업항목에 대하여 복수의 스레드를 발행할 수 있도록 구성되고, 각 스레드는 쉐이더 프로그램에 대한 명령들의 시퀀스 내부의 상이한 명령으로 쉐이더 프로그램의 실행을 시작하는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  19. 제 12 항 또는 제 13 항에 있어서,
    상기 파이프라인은,
    한 개의 실행 스레드가 상기 쉐이더 프로그램을 완료할 때까지 상기 쉐이더 프로그램의 시작부에서 그들의 실행을 시작하기 위한 스레드들을 발행하고,
    그 후에 상기 쉐이더 프로그램 내의 나중 시작점에서 상기 쉐이더 프로그램을 시작하기 위한 실행 스레드들을 발행하도록 구성되는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  20. 제 12 항 또는 제 13 항에 있어서,
    상기 파이프라인은,
    실행 스레드들에 의해 상기 쉐이더 프로그램 내의 특정 명령들 및 명령들의 세트들의 완료를 추적하고,
    스레드가 상기 쉐이더 프로그램 내의 특정 명령 또는 명령들의 세트를 완료할 때 실행을 위해 나중 시작점에서 상기 쉐이더 프로그램을 시작하는 스레드들을 해방하도록 구성되는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  21. 제 12 항 또는 제 13 항에 있어서,
    상기 실행 스레드들에 대하여 상기 쉐이더 프로그램을 실행하는 것은,
    상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 나중 지점에서 상기 쉐이더 프로그램의 실행을 시작하는 다른 스레드들이 사용하기 위한 레지스터들 내의 명령들의 실행에 의해 실행 스레드가 발생하는, 결과들을 저장하는 상기 쉐이더 프로그램에 대한 명령들의 시퀀스 내의 제1 시작점에서 상기 쉐이더 프로그램의 실행을 시작하는 적어도 한 개의 실행 스레드를 포함하는 것을 특징으로 하는, 그래픽스 처리 파이프라인.
  22. 쉐이딩 동작을 수행하기 위한 명령들을 실행하는 그래픽스 처리 파이프라인의 쉐이더 스테이지에 대한 명령들을 생성하기 위한 프로그램을 컴파일하는 컴파일러로서,
    상기 컴파일러는, 쉐이더 스테이지에 의해 실행되는 쉐이더 프로그램에 대하여,
    상기 쉐이더 프로그램이 실행될 작업항목의 세트의 모든 작업항목에 대하여 같은 결과를 생성하는 쉐이더 프로그램 표현들에 대한 명령들을 식별하고, 각 작업항목에 대해서 개별적으로 실행될 필요가 있는 쉐이더 프로그램 표현들에 대한 명령들 이전에 상기 식별된 명령들을 상기 쉐이더 프로그램의 실행 순서로 배치하도록 구성되는 것을 특징으로 하는, 컴파일러.
  23. 프로그램이 데이터 프로세서상에서 실행될 때, 청구항 1 또는 2의 방법을 수행하기 위한 컴퓨터 소프트웨어 코드를 구비하는, 매체에 저장된, 컴퓨터 프로그램.
KR1020160091075A 2015-07-20 2016-07-19 그래픽스 처리 KR102631479B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB1512669.1A GB2540543B (en) 2015-07-20 2015-07-20 Graphics processing
GB1512669.1 2015-07-20

Publications (2)

Publication Number Publication Date
KR20170010721A KR20170010721A (ko) 2017-02-01
KR102631479B1 true KR102631479B1 (ko) 2024-01-31

Family

ID=54013262

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020160091075A KR102631479B1 (ko) 2015-07-20 2016-07-19 그래픽스 처리

Country Status (4)

Country Link
US (1) US10275848B2 (ko)
KR (1) KR102631479B1 (ko)
CN (1) CN106373083B (ko)
GB (1) GB2540543B (ko)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2514618B (en) * 2013-05-31 2020-11-11 Advanced Risc Mach Ltd Data processing systems
US10310856B2 (en) 2016-11-09 2019-06-04 Arm Limited Disabling thread execution when executing instructions in a data processing system
US10127626B1 (en) * 2017-07-21 2018-11-13 Arm Limited Method and apparatus improving the execution of instructions by execution threads in data processing systems
CN108121566A (zh) * 2017-12-06 2018-06-05 中国航空工业集团公司西安航空计算技术研究所 一种图形指令解析设计方法
US10360717B1 (en) * 2017-12-29 2019-07-23 Intel Corporation Method and apparatus for subdividing shader workloads in a graphics processor for efficient machine configuration
US11669830B2 (en) * 2019-10-15 2023-06-06 Jpmorgan Chase Bank, N.A. Systems and methods for distributed-ledger based settlement
US11126439B2 (en) * 2019-11-15 2021-09-21 Apple Inc. SIMD operand permutation with selection from among multiple registers
US10891708B1 (en) 2019-11-25 2021-01-12 Arm Limited Shader program execution in graphics processing
US11830101B2 (en) * 2020-07-17 2023-11-28 Arm Limited Graphics processors
CN113885877A (zh) * 2021-10-11 2022-01-04 北京超弦存储器研究院 编译的方法、装置、设备及介质
US11928754B2 (en) * 2022-04-07 2024-03-12 Qualcomm Incorporated GPU wave-to-wave optimization

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080198166A1 (en) * 2007-02-16 2008-08-21 Via Technologies, Inc. Multi-threads vertex shader, graphics processing unit, and flow control method
US20100122067A1 (en) * 2003-12-18 2010-05-13 Nvidia Corporation Across-thread out-of-order instruction dispatch in a multithreaded microprocessor
US20120096474A1 (en) * 2010-10-15 2012-04-19 Via Technologies, Inc. Systems and Methods for Performing Multi-Program General Purpose Shader Kickoff

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050071438A1 (en) * 2003-09-30 2005-03-31 Shih-Wei Liao Methods and apparatuses for compiler-creating helper threads for multi-threading
GB2448907B (en) * 2007-05-02 2011-07-27 Advanced Risc Mach Ltd Reducng information leakage between processes sharing a cache
US20090037918A1 (en) * 2007-07-31 2009-02-05 Advanced Micro Devices, Inc. Thread sequencing for multi-threaded processor with instruction cache
KR20130141446A (ko) * 2010-07-19 2013-12-26 어드밴스드 마이크로 디바이시즈, 인코포레이티드 복수의 프로세싱 유닛들에서 온-칩 메모리를 사용하는 데이터 프로세싱
US9513975B2 (en) * 2012-05-02 2016-12-06 Nvidia Corporation Technique for computational nested parallelism
US9928109B2 (en) * 2012-05-09 2018-03-27 Nvidia Corporation Method and system for processing nested stream events
US9189881B2 (en) * 2013-05-30 2015-11-17 Arm Limited Graphics processing
CN103995725B (zh) * 2014-04-24 2018-07-20 深圳中微电科技有限公司 在cpu上执行像素着色器的程序转换方法及装置
US10061591B2 (en) * 2014-06-27 2018-08-28 Samsung Electronics Company, Ltd. Redundancy elimination in single instruction multiple data/thread (SIMD/T) execution processing

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100122067A1 (en) * 2003-12-18 2010-05-13 Nvidia Corporation Across-thread out-of-order instruction dispatch in a multithreaded microprocessor
US20080198166A1 (en) * 2007-02-16 2008-08-21 Via Technologies, Inc. Multi-threads vertex shader, graphics processing unit, and flow control method
US20120096474A1 (en) * 2010-10-15 2012-04-19 Via Technologies, Inc. Systems and Methods for Performing Multi-Program General Purpose Shader Kickoff

Also Published As

Publication number Publication date
GB2540543B (en) 2020-03-11
KR20170010721A (ko) 2017-02-01
GB2540543A (en) 2017-01-25
CN106373083A (zh) 2017-02-01
US10275848B2 (en) 2019-04-30
CN106373083B (zh) 2021-07-06
GB201512669D0 (en) 2015-08-26
US20170024848A1 (en) 2017-01-26

Similar Documents

Publication Publication Date Title
KR102631479B1 (ko) 그래픽스 처리
US10176546B2 (en) Data processing systems
KR102617106B1 (ko) 데이터 처리 시스템
KR102641210B1 (ko) 데이터 처리 시스템
US9256466B2 (en) Data processing systems
US10726606B2 (en) Shader program selection in graphics processing systems
KR20170015232A (ko) 그래픽 처리 시스템
KR102636250B1 (ko) 그래픽 처리 시스템
US20180232935A1 (en) Graphics processing
US10877545B2 (en) Energy management in graphics processing units
KR20190142732A (ko) 데이터 처리 시스템
CN107851027B (zh) 图形处理单元的可编程执行单元、数据处理系统、操作方法
US10559055B2 (en) Graphics processing systems
US10606595B2 (en) Data processing systems
US11107264B2 (en) Graphics processing systems for determining blending operations
US10310856B2 (en) Disabling thread execution when executing instructions in a data processing system
US10891708B1 (en) Shader program execution in graphics processing
US10115222B2 (en) Data processing systems
KR102676410B1 (ko) 그래픽 처리 시스템
CN114971997A (zh) 数据处理系统

Legal Events

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