KR20170015232A - 그래픽 처리 시스템 - Google Patents

그래픽 처리 시스템 Download PDF

Info

Publication number
KR20170015232A
KR20170015232A KR1020160096554A KR20160096554A KR20170015232A KR 20170015232 A KR20170015232 A KR 20170015232A KR 1020160096554 A KR1020160096554 A KR 1020160096554A KR 20160096554 A KR20160096554 A KR 20160096554A KR 20170015232 A KR20170015232 A KR 20170015232A
Authority
KR
South Korea
Prior art keywords
thread
shader program
threads
group
thread group
Prior art date
Application number
KR1020160096554A
Other languages
English (en)
Other versions
KR102595713B1 (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 KR20170015232A publication Critical patent/KR20170015232A/ko
Application granted granted Critical
Publication of KR102595713B1 publication Critical patent/KR102595713B1/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/08Volume rendering
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading

Landscapes

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

Abstract

그래픽 처리 시스템에서, 래스터화기(51)는, 프래그먼트들 내부의 모든 샘플링 위치들이 프리미티브(50)에 의해 커버되지는 않는 렌더링되고 잇는 프리미티브에 대해 프래그먼트들(54, 55)의 쌍을 식별하도록 동작한다. 프래그먼트들(54, 55)이 프래그먼트 셰이더(27)에 도달하면, 프래그먼트 셰이더(27)에 의한 실행을 위채 대응하는 실행 스레드들(57, 58)이 스폰되고(56) 프래그먼트들(54, 55)을 처리한다. 그후, 스레드 그룹들(57, 58)의 헬퍼 스레드들을 사용하는 프래그먼트 셰이더 프로그램의 제 1 부분이 실행된다(59), 그후, 스레드 그룹들(57, 58)의 활성 스레드들이 한 개의 결합된 스레드 그룹(61) 내부에 병합되게 하도록 동작하는 프래그먼트 셰이더 프로그램 내부의 병합 명령(60)이 존재한다. 이 스레드 그룹 병합 이후에, 프래그먼트 셰이더 프로그램의 나머지 프로그램 단계들이 병합된 스레드 그룹에 대해 실행된다(62).

Description

그래픽 처리 시스템{GRAPHICS PROCESSING SYSTEMS}
본 발명은, 그래픽 처리 시스템에 관한 것으로, 특히, 한 개 이상의 프로그래머블 처리 스테이지("셰이더")를 포함하는 그래픽 처리 시스템의 동작에 관한 것이다.
그래픽 처리는 일반적으로, 파이프라인 방식으로 행해지고, 한 개 이상의 파이프라인 스테이지들이 최종 렌더 출력, 예를 들어 표시되는 프레임을 발생하기 위해 데이터에 대해 동작한다. 다수의 그래픽 처리 파이프라인은 보통 "셰이더"로 불리는 한 개 이상의 프로그래머블 처리 스테이지를 포함한다. 예를 들어, 그래픽 처리 파이프라인은, 기하 셰이더, 정점 셰이더 및 프래그먼트(픽셀) 셰이더의 한 개 이상, 일반적으로는 전체를 포함한다. 예를 셰이더는, 입력 데이터 값에 대해 셰이더 프로그램을 실행하여 그래픽 파이프라인의 나머지에 의해 처리되거나 및/또는 출력하기 위해 원하는 출력 데이터의 세트(예를 들면, 프래그먼트 셰이더의 경우에는 적절히 셰이드되고 렌더링된 프래그먼트 데이터)를 발생하는 프로그래머블 처리 스테이지이다. 그래픽 처리 파이프라인의 셰이더는 프로그래머블 처리회로를 공유하거나, 각각이 별개의 프로그래머블 처리 유닛이다/
따라서, 그래픽 처리 유닛(GPU) 셰이더 코어는, 렌더 타겟, 예를 들어 프레임 등의 발생할 그래픽 출력의 각각의 그래픽 항목에 대해 작은 프로그램들을 실행함으로써 그래픽 처리를 행하는 처리 유닛이다(이와 관련해서 "항목"은 보통 (예를 들어, 프래그먼트 셰이더의 경우에) 정점 또는 샘플링 위치이다)). 이것은 일반적으로, 통상의 렌더 출력, 예를 들어, 프레임이 독립적으로 각각 처리될 수 있는 다소 큰 수의 정점들과 프래그먼트들을 갖는 것을 특징으로 한다는 점에서, 높은 패러렐리즘을 가능하게 한다.
그래픽 셰이더 연산에서, 각각의 "항목"은 해당 그래픽 "항목"에 대해 해당 셰이더 프로그램을 실행하는 실행 스레드를 사용하여 처리된다.
셰이더 실행 효율을 향상시키는 공지된 방법은, 실행 스레드들을 스레드들의 "그룹"이나 "번들"로 그룹화하는 것으로(이때, 각각의 스레드는, 예를 들어 한 개의 정점 또는 한 개의 샘플링 위치에 해당한다), 이때, 한 개의 그룹의 스레드들은 한번에 한 개의 명령씩 록스텝(lockstep)으로 실행된다. 이에 따라, 그룹 내부의 모들 스레드들 사이에 명령 페치와 스케줄링 자원을 공유할 수 있다(이와 같은 스레드 그룹에 대해 사용된 다른 항목은 "워프" 및 "파면"을 포함한다. 간략을 위해, "스레드 그룹"이라는 용어를 사용하지만, 이것은 달리 언급하지 않는 한 모든 동등한 용어 및 배치를 포함하는 것이 의도된다).
프래그먼트 셰이더(렌더 출력의 프리미티브의 각각의 샘플링 위치에 대해 한번 실행되는 셰이더)의 경우에는, 스레드 그룹이 일반적으로 한 개 이상의 "쿼드(quad)"를 포함하는데, 이때 "쿼드"는 2x2의 그룹의 샘플 위치이다. 이와 같은 방식으로 샘플링 위치들을 쿼드로 구성하는 것은, 샘플링 포인트-델타 계산과 밉매핑(mipmapping)을 사용한 텍스처 룩업 등의 이와 같은 샘플링 포인트-델타들에 의존하는 연산 등의 프래그먼트 셰이더에서 행해진 일부의 연산에 유익하다.
본 출원은, 이와 같은 배치에서는, 프리미티브의 에지에서, 2x2 샘플링 위치 쿼드가 프리미티브의 에지에 걸치고, 샘플링 위치의 일부가 프리미티브의 내부에 위치하고 나머지 샘플링 위치가 외부에 위치한다. 이와 같은 경우에, 스레드들이 쿼드 내부의 모든 4개의 샘플링 위치에 대해 여전히 개시되지만, 실제로는, 프리미티브에 의해 커버된 샘플링 위치들만이 "활성" 스레드가 된다.
그러나, 프리미티브의 외부에 있는 샘플링 위치에 해당하는 스레드들(이것을 본 명세서에서는 간략을 위해 "비활성" 및/또는 "헬퍼" 스레드로 부른다)에 대해 여전히 일부의 프래그먼트 셰이딩 처리가 필요하다. 이것은, 예를 들면, 샘플링 위치-델타 계산 등의 프래그먼트 셰이딩 연산의 일부에 대한 입력으로서 이와 같은 비활성("헬퍼") 스레드에 대한 일부의 프래그먼트 셰이딩 결과가 필요하기 때문이다. (그후, 이와 같은 헬퍼 스레드에 의해 산출된 결과는 (다른 식으로 필요하지 않을 때) 프래그먼트 셰이더의 종료시에 폐기된다.)
도 1은 이와 같은 상황을 나타낸 것이다.
도 1은 생성할 그래픽 출력의 샘플링 위치들(102)의 어레이(101)를 개략적으로 나타낸 것으로, 각각의 2x2 그룹의 샘플링 위치들은 공통으로 처리되는 "쿼드"(103)로 구성된다.
프리미티브가 래스터화될 때, 래스터화기는 프리미티브에 의해 적어도 일부가 커버되는 이들 샘플링 위치 쿼드(그룹)를 식별하고, 각각의 적어도 일부 커버된 쿼드(샘플링 위치들의 그룹(세트))에 대한 렌더링을 위한 그래픽 프래그먼트를 발행한다. 그후, 각각의 이와 같은 프래그먼트는 스레드 그룹(워프)으로서 프래그먼트 셰이더에 의해 처리되고, 각각의 커버된 샘플링 위치는 그룹(워프) 내부의 "활성" 스테이지이고 커버되지 않은 샘플링 위치는 비활성("헬퍼") 스레드이다.
도 1은 샘플링 위치들의 어레이를 덮는 예시적인 프리미티브(104)를 나타낸 것이다. 도 1에서, 샘플링 위치 쿼드(105)가 프리미티브(103)를 위해 처리되도록 속하면, 2x2 쿼드(105) 내부의 샘플링 위치들의 3개는 "활성"(즉, 프리미티브 3 내부의 샘플링 위치를 나타낸다)이 되지만, 쿼드(104) 내부의 4번째 샘플링 위치(106)는 프리미티브(103)의 에지의 외부에 속하기 때문에 "비활성"이 된다. 따라서, 쿼드(104)에 대해 프래그먼트 셰이더 프로그램이 실행되면, 커버되지 않은 샘플링 위치(106)에 대한 스레드 그룹 내부의 스레드가 실행되고 "헬퍼" 스레드로 처리된다.
본 출원인은, 특히 그래픽 처리 파이프라인의 셰이더에 있어서, 스레드 그룹들의 처리에 대한 개량의 여지가 남아 있다고 판단하고 있다.
본 발명의 제 1 면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인의 작동방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고, 상기 작동방법은,
셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않는 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시와 함께, 렌더 출력을 발생하는 셰이더 프로그램을 셰이더 스테이지에게 발행하는 단계와,
그래픽 처리 파이프라인에 의해, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 셰이딩 스테이지에 의해 처리할 2개 이상의 스레드 그룹의 세트를 식별하는 단계와,
셰이딩 스테이지에 의해, 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계를 포함하고,
상기 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계는,
식별된 스레드 그룹이 스레드 그룹 병합 이벤트 표시에 도달하였을 때, 스레드 그룹들을 각각의 스레드 그룹들부터 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 병합하는 단계와,
병합된 스레드 그룹에 대한 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 단계를 포함하는, 그래픽 처리 파이프라인의 작동방법이 제공된다.
본 발명의 제 2 면에 따르면, 데이터 처리 시스템으로서,
명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인을 구비하고, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 데이터 처리 시스템은,
셰이딩 스테이지에 대한 프로그램들을 컴파일하여 셰이더 스테이지에 의해 실행하기 위한 명령들을 발생하는 컴파일러를 더 구비하고,
상기 컴파일러는, 셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않는 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시와 함께, 렌더 출력을 발생하는 셰이더 프로그램을 셰이더 스테이지에게 발행하도록 구성되고,
상기 그래픽 처리 파이프라인은, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 셰이딩 스테이지에 의해 처리할 2개 이상의 스레드 그룹의 각각의 세트들을 식별하도록 구성되고,
상기 셰이딩 스테이지는, 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하도록 구성되고,
상기 식별된 스레드 그룹에 대한 셰이더 프로그램의 실행은,
병합가능한 스레드 그룹들의 각각의 식별된 세트의 스레드 그룹들이 스레드 그룹 병합 이벤트 표시에 도달하였을 때, 스레드 그룹들을 각각의 스레드 그룹들로부터 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 병합하는 것과,
병합된 스레드 그룹에 대한 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 것을 포함하는, 데이터 처리 시스템이 제공된다.
본 발명은, 실행 스레드들이 스레드 그룹("워프")으로 그룹화되는 그래픽 처리 파이프라인에 있어서 셰이더 프로그램의 실행에 관한 것이다. 본 발명에 있어서는, 일부의 "비활성""헬퍼") 스레드들을 갖는 스레드 그룹들이 식별된 후, "병합 이벤트" 표시를 사용하여, 셰이더 실행중에 스레드 그룹들의 활성 스레드들을 포함하는 실행을 위해 한 개의 스레드 그룹으로의 이들 스레드 그룹들의 병합을 기동한다. 이하에서 더욱 상세히 설명하는 것과 같이, 이와 같은 구성은, 스레드 그룹들이 일부의 "활성 스레드들"(예를 들어, 커버된 샘플링 위치에 관한 스레드들) 만을 갖는 상황에서 필요한 전반적인 처리를 줄이는 효과를 갖는다.
본 출원인은, 이와 관련하여, 전술한 것과 같이, 예를 들어, 프래그먼트 셰이더 프로그램을 실행할 때, 예를 들어, 샘플링 위치-델타형 계산에 대한 입력을 발생할 목적으로, 비활성(커버되지 않은) "헬퍼 스레드들"에 대한 프로그램을 실행하는 것이 필요할 수 있지만, 이들 계산은 프래그먼트 셰이더 프로그램의 개시 근처에서만 발생한다(및/또는 발생하도록 구성될 수 있다)는 것을 인식하였다. 이것은, 비활성의 "헬퍼" 스레드들이 필요로 하는 계산이 행해지면, 이 스레드들이 잠재적으로 종결될 수 있다는 것을 의미한다. 이와 같은 "헬퍼 스레드들"의 조기의 종결은 그 자체가 전력을 절감하는데 도움이 된다.
그러나, 본 출원인은, "헬퍼 스레드"가 이와 같이 종결되더라도, 이것이 그 자체가 스레드 그룹이 전체적으로 종결될 수 있게 하지는 않는다는 것을 더 인식하였다(즉, "헬퍼 스레드"가 계산을 행하지 않더라도 헬퍼 스레드가 여전히 스레드 그룹 실행 레인을 차지하게 되므로, 더 이상 처리될 필요가 없더라도, 불필요하게 실행 사이클을 차지하게 된다). 이것은 특히 다수의 작은 프리미티브들과 긴 셰이더 프로그램을 갖는 워크로드(workload)(이것은 예를 들어 현재 게임에서 자주 볼 수 있는 워크로드이다)에 대해 낭비적이 될 수 있다.
본 발명은, 셰이더 프로그램 내부의 스레드 그룹 병합 이벤트 기회를 식별하고 표시한 후, 비활성의 "헬퍼" 스레드를 갖는 스레드 그룹들을 원래의 "드물게" 활성인 스레드 그룹들의 "활성" 스레드를 포함하는 한 개의 스레드 그룹으로 병합함으로써 이것을 해소한다. 따라서, 이것은 실행 사이클을 차지하는 원래의 스레드 그룹들의 비활성의 "헬퍼" 스레드들을 효율적으로 피한다.
본 발명에서 고려되는 스레드 그룹들을 임의의 적절한 원하는 크기를 가질 수 있다. 바람직한 실시예에서, 각각의 스레드 그룹은 4개의 스레드를 포함한다(즉, 4의 워프 폭이 존재한다). 이와 같은 경우에, 각각의 스레드 그룹(워프)은 바람직하게는 2x2 샘플링 위치 "쿼드"에 해당한다. 그러나, 필요한 경우에는, 더 폭이 넓은 스레드 그룹들(워프들)의 사용 등과 같은 다른 배치도 가능하다.
그래픽 처리 파이프라인의 프로그래머블 셰이딩 스테이지는 그래픽 처리 파이프라인의 임의의 적절한 원하는 프로그래머블 셰이딩 스테이지("셰이더")를 포함할 수 있다. 그러나, 본 발명이 프래그먼트 셰이딩 연산에 특별한 응용을 갖게 된다는 것이 예상되므로, 바람직한 실시예에서는, 프로그래머블 셰이딩 스테이지가 프로그래머블 프래그먼트 셰이딩 스테이지(프래그먼트 셰이더)로서 동작한다(동작하고 있다). 프로그래머블 셰이딩 스테이지는 단독으로 프래그먼트 셰이더로 동작해도 되지만, 이와 관련하여, 프로그래머블 셰이딩 스테이지는 일반적으로 프래그먼트 셰이더 이외의 셰이더를 실행할 수 있으므로(바람직하게는 실행가능하므로), 예를 들어, 서로 다른 시간에, (프래그먼트 셰이딩 연산을 행하는) 프래그먼트 셰이더로서 기능하고 다른 형태(종류)의 셰이더로서 기능하도록 적절히 프로그래밍된 그래픽 처리 파이프라인의 한 개 이상의 프로그래머블 스테이지들이 존재할 수 있다는 것을 알 수 있다.
따라서, (프로그래머블) 셰이더 스테이지에 발행되는 셰이더 프로그램은, 프로그래머블 셰이딩 스테이지에 의해 실행되는 적절한 원하는 셰이더 프로그램일 수 있지만, 바람직한 실시예에서는 프래그먼트 셰이더 프로그램(프래그먼트 셰이딩 연산을 실행하는 프로그램)이다(그리고, 프로그래머블 셰이딩 스테이지에 의해 실행되는 적절한 원하는 프래그먼트 셰이더 프로그램을 포함할 수 있다).
셰이더 프로그램에 포함되는 스레드 그룹 병합 이벤트 표시는 스레드 그룹들을 병합할 기회를 표시할 수 있는(그리고 이 기회를 식별하기 위해 셰이더에 의해 사용될 수 있는) 적절한 원하는 형태를 취할 수 있다.
바람직한 일 실시예에서, 스레드 그룹 병합 표시는 셰이더 프로그램 내부의 한 개의 명령으로서 또는 이 명령의 일부로서 제공된다. 예를 들어, 스레드 그룹 병합 표시는 셰이더 프로그램 내부에 포함되는 구체적인 명령("병합" 명령)으로서 제공될 수도 있다. 또한, 셰이더 프로그램 내부의 명령의 변형자(modifier)를 사용하여 또는 이 명령에게 스레드 그룹 병합 이벤트 기회를 표시하는 것도 가능하다.
다른 실시예에서는, 스레드 그룹 병합 이벤트 표시가 셰이더 프로그램 내부의 한 개의 명령으로서 또는 이 명령의 일부로서 포함되지 않고, 그 대신에 셰이더 프로그램 코드 그 자체로부터 분리되어 명기된 컷오프 지점(cutoff point) 등과 같이, 셰이더 프로그램 내부의 스레드 그룹 병합 이벤트 지점을 표시할 수 있는 다른 방법으로 표시된다. 이와 같은 경우에, 병합 이벤트 지점은, 예를 들어, 셰이더 프로그램을 실행하면서, 실행된 셰이더 프로그램의 특정한 수의 명령들, 및/또는 도달하는 특정한 프로그램 카운터 값으로서 표시될 수도 있다.
스레드 그룹 병합 이벤트 표시는 셰이더 프로그램 내부에 또는 이 셰이더 프로그램과 관련하여 임의의 적절한 원하는 방식으로, 그리고 전체 데이터 처리 시스템의 임의의 적절한 원하는 구성요소에 의해 제공될 수 있다.
특히 바람직한 실시예에서, 스레드 그룹 병합 이벤트 표시는 그래픽 처리 파이프라인의 컴파일러(셰이더 컴파일러)에 의해 제공된다. 따라서, 컴파일로는 바람직하게는, 예를 들어, 스레드 그룹 병합 이벤트 명령을, 예를 들어, 프래그먼트, 셰이더 프로그램 내부의 적절한 지점에 삽입하거나, 셰이더 프로그램 내부의 명령에 스레드 그룹 병합 이벤트 변형자를 추가하거나, 이와 달리 스레드 그룹 병합 이벤트 표시에 대한 컷오프 지점의 표시를 발생한다. 컴파일러가 스레드 그룹 병합 이벤트 표시를 제공하게 하는 것은, 컴파일러가 셰이더 프로그램을 평가하여 셰이더 프로그램 실행에 스레드 그룹 병합 이벤트 표시를 포함시키는 것이 가능한지 여부를 판정할 수 있다는 이점을 갖는다.
특히 바람직한 실시예에서는, 컴파일러는, 예를 들어, 그래픽 처리를 요구하는 호스트 프로세서에 상의 어플리케이션에 의해 제공되는 셰이더 프로그램 코드를 분석하고, 셰이더 프로그램 실행의 일부 지점에서의 스레드 그룹 병합 이벤트가 가능한지 여부를 판정하고, 가능한 경우에는, 셰이더 프로그램 내부의 적절한 지점에(예를 들어, 이 지점에 위치한 셰이더 프로그램 내부에 특정한 명령을 삽입함으로써) 스레드 그룹 병합 이벤트 표시를 제공하여, 스레드 그룹 병합 이벤트 기회를 표시한다.
특히 바람직한 실시예에서, 컴파일러는, (이것이 가능한 경우에) 셰이더 프로그램 내부의 연산들을 재배열하여(re-order), 예를 들면, 셰이더 프로그램 실행에 스레드 그룹 병합 이벤트를 포함시킬 기회를 제공하거나, 및/또는 셰이더 프로그램의 실행에 스레드 그룹 병합 이벤트 기회의 더욱 효율적인 포함 및 사용을 허용하도록 동작할 수도 있다.
이와 관련하여, 컴파일러는, 바람직하게는, 텍스처 룩업 등의 비활성 스레드에 대한 결과를 요구하는 셰이더 프로그램 연산들을 스레드 그룹 병합 이벤트 표시 지점 앞에 배치하도록 동작한다. 따라서, 컴파일러는 바람직하게는, 스레드 그룹 내부의 비활성 (헬퍼) 스레드들에 대해 실행될 필요가 없는 산술 연산 등의 셰이더 프로그램 연산들을 셰이더 프로그램 실행의 스레드 그룹 병합 이벤트 지점 뒤에 배치한다.
컴파일러는, 예를 들어, 바람직한 실시예에서는, 그래픽 처리 파이프라인을 포함하는 전체 데이터 처리 시스템의 호스트 프로세서 상에서 실행된다(그후 그래픽 처리 파이프라인은 호스트 프로세서와 관련되는 그래픽 프로세서 등의 다른 프로세서 상에 놓인다(이에 따라, 컴파일러와 컴파일된 코드가 전체 데이터 그래픽 처리 시스템 내부의 별개의 프로세서 상에서 실행된다)). 그러나, 컴파일된 코드와 동일한 프로세서 상에서 실행되는 컴파일러, 또는 별개의 시스템 상에 프리컴파일되고 컴파일된 형태로 배포되는 프로그램 등과 같이 (완전히) 별개의 프로세서 상에서 실행되고 있는 컴파일러 등과 같이, 다른 배치도 가능하다.
실행할 셰이더 프로그램 내부의 스레드 그룹 병합 이벤트 기회를 식별 및 제공하는 본 발명의 방법에서의 동작은, 그래픽 처리 파이프라인에 의해 실행될 각각의 모든 셰이더 프로그램에 대해 고려될 수 있다(그리고 일 실시예에서는 고려된다). 또한, 특정한 카테고리 또는 종류의 셰이더 프로그램에 대해서만 스레드 그룹 병합 이벤트 기회를 식별 및 제공하는 것을 시도하고, (예를 들면, 셰이더 프로그램의 종류가 유용한 스레드 그룹 병합 이벤트 기회를 제공할 것 같지 않은) 다른 카테고리 또는 종류의 셰이더 프로그램에 대해서는 시도하지 않는 것도 가능하다.
바람직한 실시예에서는, 스레드 그룹 병합 이벤트 기회를 식별 및 제공하는 본 발명의 방법에서의 동작은 실행할 프래그먼트 셰이더 프로그램에 대해(바람직하게는 그래픽 처리 파이프라인에 의해 실행될 각각의 모든 프래그먼트 셰이더 프로그램에 대해) 행해진다.
(그러나, 예를 들어, 적절한 병합 이벤트 지점이 해당 셰이더 프로그램 내부에서 존재하지 않거나 유용하지 않을 수 있는 것으로 컴파일러가 판정하는 경우에) 각각의 모든, 예를 들어, 프래그먼트, 셰이더 프로그램이 스레드 그룹 병합 이벤트 표시와 그 내부에 포함된 지점을 가져야만 하는 것이 필요하지 않다.)
또한, 필요한 경우에는, 셰이더 프로그램 내부에 복수의 스레드 그룹 병합 이벤트 지점을 포함시키는 것도 가능하다. 예를 들어, 셰이더 프로그램의 벌크가 IF 블록에 포함되어, IF 블록의 중간에 있는 한 개의 병합 지점과 두 번째 병합 지점을 셰이더 프로그램 실행의 IF 블록의 말단 이후에 놓는 것이 적절할 때, 이것이 유용할 수도 있다. 이와 같은 경우에, 바람직하게는, 스레드 그룹 내부의 모든 활성인 스레드들은 병합 이벤트가 발생하기 전에 적어도 한 개의 병합 지점들에 적중(hit)하여야 한다.
본 발명은 컴파일러 그 자체로도 확장된다.
따라서, 본 발명의 또 다른 일면에 따르면, 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 컴파일러로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 컴파일러는, 셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하고,
비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하도록 구성된 컴파일러가 제공된다.
본 발명의 또 다른 일면에 따르면, 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 방법은, 셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하는 단계와,
비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하는 단계를 포함하는, 컴파일 방법이 제공된다.
또한, 본 발명은, 셰이더 스테이지에 의해 실행되고 있는 셰이더 프로그램에 대한 스레드 그룹 병합 표시에 응답하여 스레드 그룹들을 병합할 수 있는 그래픽 처리 파이프라인의 셰이더 스테이지로도 확장된다.
따라서, 본 발명의 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이더 스테이지로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 셰이더 스테이지는,
2개 이상의 스레드 그룹들이 셰이더 프로그램과 관련되어 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시에 응답하여, 셰이더 프로그램의 명령을 실행할 때,
셰이더 프로그램이 실행되고 있으며 한 개의 스레드 그룹으로 병합될 수 있는 2개 이상의 스레드 그룹들이 존재하는지 여부를 판정하고,
한 개의 스레드 그룹으로 병합되는 2개 이상의 스레드 그룹들이 존재할 때, 스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 스레드 그룹들을 병합하고,
병합된 스레드 그룹에 대한 병합 이벤트 표시 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하도록 구성된 셰이더 스테이지가 제공된다.
본 발명의 또 다른 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이더 스테이지의 작동방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 방법은,2개 이상의 스레드 그룹들이 셰이더 프로그램과 관련되어 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시에 응답하여, 셰이더 프로그램의 명령을 실행할 때, 셰이더 스테이지가,
셰이더 프로그램이 실행되고 있으며 한 개의 스레드 그룹으로 병합될 수 있는 2개 이상의 스레드 그룹들이 존재하는지 여부를 판정하고,
한 개의 스레드 그룹으로 병합되는 2개 이상의 스레드 그룹들이 존재할 때, 스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 스레드 그룹들을 병합하고,
병합된 스레드 그룹에 대한 병합 이벤트 표시 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 단계를 포함하는 셰이더 스테이지의 작동방법이 제공된다.
본 발명이 속한 기술분야의 당업자에게 자명한 것과 같이, 필요한 경우에는, 본 발명의 이들 국면은 전술한 본 발명의 바람직한 옵션의 특징의 어느 한 개 이상 또는 전체를 포함할 수 있고 바람직하게는 포함한다. 따라서, 예를 들어, 셰이더 프로그램은 바람직하게는 프래그먼트 셰이더 프로그램이며, 따라서, 셰이더 스테이지는 바람직하게는 그래픽 처리 파이프라인의 프래그먼트 셰이더 스테이지이다(프래그먼트 셰이더 스테이지로서 동작한다).
스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 2개 이상의 스레드 그룹들의 세트(세트들)의 식별은, 그래픽 처리 파이프라인의 구성요소에 의해 적절하게 원하는 방법으로 행해질 수 있다. 이것은, 예를 들면, 실행되고 있는 셰이더 프로그램과 셰이더 스테이지에 의존한다.
바람직한 실시예에서, 적어도 셰이더 프로그램이 프래그먼트 셰이더 프로그램인 경우에(따라서, 프로그래머블 셰이딩 스테이지가 프래그먼트 셰이딩 스테이지(프래그먼트 셰이더)로서 동작하는 경우에), 그래픽 처리 파이프라인의 래스터화기가, 예를 들어, 바람직하게는, 렌더링하기 위해, 프리미티브를 래스터화하여 프래그먼트들, 예를 들면 샘플링 위치의 쿼드들(또는 다른 그룹화)을 생성할 때, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 2개 이상의 스레드 그룹의 세트 또는 세트들을 식별한다.
전술한 것과 같이, 그래픽 처리 파이프라인의 래스터화기는, 발생되고 있는 렌더 출력의 샘플링 위치들에 대해 렌더링할 프리미티브를 테스트하고, 해당 프리미티브에 의해 커버되는(또는 해당 프리미티브에 의해 커버되는 적어도 한 개의 샘플링 위치를 포함하는) 각각의 샘플링 위치(또는 샘플링 위치들의 각각의 세트(예를 들면, 각각의 2x2 쿼드의 샘플링 위치))에 대해 렌더링할 프래그먼트를 발생한다.
그후, 프리미티브를 렌더링하기 위해 래스터화기에 의해 발생되는 프래그먼트들은 (프래그먼트 셰이딩 스테이지를 포함하는) 그래픽 처리 파이프라인의 나머지로 전송되어 처리된다. 따라서, 각각의 프래그먼트는 샘플링 위치들의 세트에 대응하고 이 세트를 렌더링하는데 사용된다(샘플링 위치들의 각각의 세트는, 프래그먼트들이 개별적인 샘플링 위치들 또는 복수의 샘플링 위치들의 세트들, 예를 들면 쿼드들을 표시하는지 여부에 의존하여 한 개의 샘플링 위치 또는 복수의 샘플링 위치를 포함한다).
그후, 프래그먼트 셰이딩 스테이지에서, 각각의 프래그먼트(즉, 프래그먼트가 표시하는 샘플링 위치들의 세트)는 각각의 스레드 그룹(워프)으로서 처리되고, 스레드 그룹 내부의 스레드 그룹에 대한 각각의 스레드(따라서 실행 레인)는 프래그먼트가 표시하는 샘플링 위치들의 세트 내부의 주어진 샘플링 위치에 해당한다. 따라서, 프래그먼트에 대한 샘플링 위치들의 세트 내부의 커버된 샘플링 위치들은 스레드 그룹의 활성 스레드들이고, 커버되지 않은 샘플링 위치들은 스레드 그룹(워프)의 비활성("헬퍼") 스레드들이 된다.
(잠재적으로) 병합될 스레드 그룹들의 세트 내부의 모든 스레드 그룹들은, 동일한 셰이더 프로그램을 실행해야 하고, 바람직하게는 실행한다. 이 요구조건을 만족하는 한, 스레드 그룹들의 세트 내부의 스레드 그룹들이 특정한 방식으로 다른 식으로 관련되어 (잠재적으로) 병합될 필요가 없다.
그러나, 필요한 경우에는, 다른 요구조건을 만족할 수도 있다. 예를 들어, 병합할 스레드 그룹들은 동일한 묘화 호출(draw call)에 속해야 할 수도 있다(바람직한 실시예에서는 동일한 묘화 호출에 속한다), 마찬가지로, (잠재적으로) 병합할 스레드 그룹들의 세트에 있는 스레드 그룹들은 동일한 그래픽 프리미티브와 관련되어야 할 수도 있다. 그러나, 이것은 필수적인 것은 아니고, 바람직한 실시예에서는, (잠재적으로) 병합할 스레드 그룹들의 세트에 있는 스레드 그룹들이 다른 프리미티브들과 관련될 수 있다. 서로 다른 프리미티브에 있는 스레드 그룹들이 병합되도록 허용하는 것은, 특히 평균 프리미티브 크기가 1 샘플링 위치 쿼드 이하인 경우에 유리할 수 있다.
(잠재적으로) 병합할 스레드 그룹들의 세트에 포함된 스레드 그룹들은 각각 적어도 한 개의 비활성 스레드(예를 들어, 커버되지 않은 샘플링 포인트)를 가져야 하지만, 이와 달리 필요에 따라 선택될 수 있다.
바람직한 일 실시예에서는, 한 개의 스레드 그룹으로 분할되는 스레드 그룹들의 세트(및 각각의 세트)는 단지 2개의 스레드 그룹을 포함한다(즉, 한 개의 스레드 그룹으로 병합되는 스레드 그룹들의 쌍이 식별된다). 그러나, 필요한 경우에는, 한 개의 스레드 그룹으로 병합되는 3개 이상의 스레드 그룹들(워프들)의 세트를 식별하는 것도 가능하다.
(잠재적으로) 병합할 스레드 그룹들은, 그들 사이의 합계가, 한 개의 스레드 그룹이 포함할 수 있는 활성 스레드들의 최대수 이하가 되어야 하고, 바람직하게는 최대수가 된다(이때 스레드 그룹들에 대한 모든 활성 스레드들이 한 개의 스레드 그룹으로 병합될 수 있도록 하기 때문이다). 바람직한 실시예에 있어서, 결합하여 "전체의" 병합된 한 개의 스레드 그룹을 제공하는 스레드 그룹들은 바람직하게는 병합 후보로서 식별된다.
바람직한 실시예에서, 중첩하지 않는 활성 스레드들을 갖는 스레드 그룹들(즉, 활성 스레드들이 다른 스레드 그룹(워프) 레인에 존재하는 스레드 그룹들)은 한 개의 스레드 그룹으로 병합될 수 있는 스레드 그룹인 것으로 식별된다.
바람직한 일 실시예에서는, 중첩하지 않는 활성 스레드들을 갖는 스레드 그룹들(즉, 활성 스레드들이 다른 스레드 그룹(워프) 레인에 존재하는 스레드 그룹들)만이 한 개의 스레드 그룹으로 병합될 수 있는 스레드 그룹들인 것으로 식별된다.
그러나, 바람직한 일 실시예에서는, (예를 들어, 스레드 그룹이 수평으로 또는 수직으로 대응하는 2x2 쿼드를 플립(flip)함으로써) 스레드 그룹들에 대한 스레드 그룹 레인들에 대한 스레드들(예를 들면, 샘플링 위치들)의 할당을 재매핑(re-map)하여, 그들의 초기 구성에서 중첩하는 활성 스레드들(레인들)을 갖는 스레드 그룹들의 중첩을 제거하여(제거하려고 시도하여), 이와 같은 스레드 그룹들이 그후 (잠재적으로) 병합되도록 하는 것이 가능하다(예를 들어, 바람직하게는 래스터화기가 이것을 행할 수 있다).
따라서, 특히 바람직한 실시예에서는, 예를 들어, 래스터화기가, 스레드 그룹 실행(워프) 레인들에 대해 스레드 그룹이 표시하는, 예를 들면, 샘플링 위치들의 연관을 재매핑하여, 예를 들면, 바람직하게는, 서로 다른 스레드 그룹들 사이의 활성 스레드 실행(워프) 레인 중첩을 제거할 수 있다.
이와 같은 경우에, 바람직한 일 실시예에서는, 재매핑된 스레드 그룹에 대한 재매핑(재배향)이 추적되거나 다른 식으로 어떤 방식으로 기록됨으로써, 예를 들어, 프래그먼트 셰이딩 연산이, "재매핑된" 스레드 그룹에 대해 행해진 셰이딩 연산이 올바르게 계산될 수 있도록 여전히 보장할 수 있도록 하고, 예를 들어, 재매핑된 스레드 그룹에 대한 최종 결과를 출력으로 커미트(commit)하려고 할 때, 이들 최종 결과가 필요에 따라 "매핑되지 않도록" 할 수 있다.
바람직한 실시예에 있어서, 병합될 수 있는 스레드 그룹들의 세트들을 식별하는 처리는, 예를 들어, 프래그먼트들이 생성되어 래스터화기에 의해 렌더링될 때, 프리미티브들이 래스터화되고 있을 때, 및 또는 해당 렌더 출력이 발생되고 있을 때, 반복된다. 따라서, 바람직하게는, 한 개의 스레드 그룹으로 병합되는 스레드 그룹들의 복수의 쌍(또는 다른 세트)이 식별된다. 가장 바람직하게는, 예를 들어, 래스터화기가 프리미티브들을 래스터화하여 렌더링하도록 동작할 때, 각각의 한 개의 스레드 그룹으로 병합되는 스레드 그룹들의 쌍들(또는 다른 그룹들)을 식별하도록 동작한다.
각각의 한 개의 스레드 그룹으로 병합될 수 있는 식별된 스레드 그룹들은 바람직하게는 그래픽 처리 파이프라인의 셰이더 스테이지에 표시되어, "병합" 후보로 식별된(관련된) 스레드 그룹들이 셰이더 프로그램 실행의 스레드 그룹 병합 이벤트 표시 지점에 도달할 때, 이들 스레드 그룹들을 셰이더 스테이지가 식별할 수 있다. 이것은 적절한 원하는 방법으로 행해질 수 있다. 예를 들어, 바람직하게는, 래스터화기가 스레드 그룹들을 프래그먼트 셰이더에 발행할 때, 래스터화기가 병합될 수 있는 이들 스레드 그룹들을 프래그먼트 셰이더 스테이지에 전송할 수 있다.
이것을 행할 수 잇는 한가지 방법에서는, 래스터화기가 그것의 출력에 부분 스레드 그룹들의 (예를 들어, 작은) 대기행렬(queue)을 유지한다. 래스터화기가 새로운 부분 스레드 그룹을 생성할 때, 래스터화기는 이 새로운 부분 스레드 그룹이 병합될 수 있는 이전의 스레드 그룹을 찾기 위한 시도로 이것을 대기행렬 내부의 부분 스레드 그룹들과 대조한다(비교한다), 성공적이면(즉, 적절한 이전의 스레드 그룹이 대기행렬에서 발견되면), 2개의 스레드 그룹이 함께 프래그먼트 셰이더로 발행될 수 있다. 그렇지 않은 경우에는, 새로운 부분 스레드 그룹이 대기행렬 내부에 삽입된다. 이와 같은 대기행렬이 가득 찰 수 있는데, 이와 같은 경우에는 병합되지 않은 부분 스레드 그룹들이 프래그먼트 셰이더로 전달될 수도 있다.
또한, 본 발명은, 한 개의 스레드 그룹으로 병합되는 스레드 그룹들을 식별하는 그래픽 처리 파이프라인의 래스터화기의 동작으로 확장된다.
따라서, 본 발명의 또 다른 일면에 따르면, 그래픽 처리 파이프라인의 래스터화기의 작동방법으로서, 래스터화기는 렌더링될 그래픽 프리미티브들을 렌더링용 그래픽 프래그먼트들로 래스터화하고, 각각의 그래픽 프래그먼트는 발생할 렌더 출력의 복수의 샘플링 위치들의 세트를 표시하고,
상기 방법은, 래스터화기에 의해,
프리미티브에 의해 커버되지 않은 샘플링 위치들을 포함하는 프리미티브에 대한 프래그먼트들을 식별하고, 이들 프래그먼트들 중에서 어느 것이 프래그먼트들의 모든 커버된 샘플링 포인트를 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있는지 여부를 판정하는 단계와,
커버되지 않은 샘플링 위치들을 포함하는 2개 이상의 프래그먼트들이 프래그먼트들의 모든 커버된 샘플링 포인트들을 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있는 것으로 판정된 경우에, 커버되지 않은 샘플링 위치들을 포함하는 2개 이상의 프래그먼트들이 프래그먼트들의 모든 커버된 샘플링 포인트들을 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있다는 것을 그래픽 처리 파이프라인의 프래그먼트 셰이딩 스테이지에게 전달하는 단계를 포함하는 래스터화기의 작동방법이 제공된다.
본 발명의 또 다른 일면에 따르면, 그래픽 처리 파이프라인의 래스터화기로서, 래스터화기는 렌더링될 그래픽 프리미티브들을 렌더링용 그래픽 프래그먼트들로 래스터화하고, 각각의 그래픽 프래그먼트는 발생할 렌더 출력의 복수의 샘플링 위치들의 세트를 표시하고,
상기 래스터화기는,
프리미티브에 의해 커버되지 않은 샘플링 위치들을 포함하는 프리미티브에 대한 프래그먼트들을 식별하고, 이들 프래그먼트들 중에서 어느 것이 프래그먼트들의 모든 커버된 샘플링 포인트를 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있는지 여부를 판정하고,
커버되지 않은 샘플링 위치들을 포함하는 2개 이상의 프래그먼트들이 프래그먼트들의 모든 커버된 샘플링 포인트들을 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있는 것으로 판정된 경우에, 커버되지 않은 샘플링 위치들을 포함하는 2개 이상의 프래그먼트들이 프래그먼트들의 모든 커버된 샘플링 포인트들을 표시하는 한 개의 프래그먼트를 형성하도록 병합될 수 있다는 것을 그래픽 처리 파이프라인의 프래그먼트 셰이딩 스테이지에게 전달하도록 구성된 래스터화기가 제공된다.
본 기술분야의 당업자에게 있어서 자명한 것과 같이, 본 발명의 이들 국면은, 필요에 따라, 본 명세서에서 설명하는 본 발명의 바람직한 옵션의 특징들의 한 개 이상 또는 전체를 포함할 수 있으며 바람직하게는 포함한다.
바람직한 실시예에서, 한 개의 스레드 그룹으로 병합될 수 있는 것으로 식별된 스레드 그룹들의 세트(바람직하게는 각각의 세트)의 스레드 그룹들은 셰이딩 스테이지에 연속적으로 발행된다(이것은 필수적인 것은 아니고 다른 구성이 가능할 수도 있다).
마찬가지로, 바람직한 실시예에서, 한 개의 스레드 그룹으로 서로 잠재적으로 병합할 스레드 드룹들은 바람직하게는, 그래픽 처리 파이프라인 내부의 스레드 그룹들의 처리에 대한 제약에 적합하고 이 제약과 일치하는 방식으로 실행하기 위해 셰이더 스테이지로 발행된다. 따라서, 예를 들어, 스레드 그룹이 사용할 수 있는 복수의 다른 레지스터 및/또는 메모리 뱅크가 존재하는 경우에는, 서로 잠재적으로 병합할 스레드 그룹들이 바람직하게는 동일한 메모리 뱅크 및/또는 레지스터들의 세트 등을 공유하는 방식으로 실행하기 위해 셰이더 스테이지에 발행된다.
본 출원인은, (예를 들어, 스레드 그룹(예를 들어, 쿼드) 내부의 모든 스레드들이 활성이거나, 스레드 그룹이 병합될 수 있는 다른 적절한 스레드 그룹이 존재하지 않기 때문에) 실행할 모든 스레드 그룹들이 다른 스레드 그룹 또는 그룹들과 (잠재적으로) 병합될 수 있는 것은 아니라는 것을 더 인식하였다.
따라서, 바람직한 실시예에서는, 셰이더 스테이지에 발행할 스레드 그룹이 다른 스레드 그룹과 (잠재적으로) 병합될 수 없는 것으로 (예를 들어, 래스터화기에 의해) 식별되는 경우에, 스레드 그룹은 바람직하게는 병합될 수 없는 것으로(한개의 스레드 그룹으로 처리되는 것으로) 표시된다. 이와 같은 표시는, 예를 들어, 스레드 그룹이 다른 스레드 그룹과 병합될 수 있다는 표시를 단순히 생략하는 것을 포함할 수도 있다.
스레드 그룹들이 예를 들어 프래그먼트 셰이딩 스테이지에 발행되면, 셰이딩 스테이지는 스레드 그룹들에 대한 셰이더 프로그램을 실행한다. 그후, 한 개의 스레드 그룹으로 병합되는 식별된 스레드 그룹들이 스레드 그룹 병합 이벤트 표시에 도달하면, 이들 스레드 그룹들이 스레드 그룹들의 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹에 병합된다.
이것은 필요에 따라 구현되지만, 바람직한 실시예에서는, 병합될 스레드 그룹들의 세트의 첫 번째 스레드 그룹이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점에 도달할 때(예를 들어 스레드 그룹 병합 지시에 도달할 때), 이 스레드 그룹이 병합할 다른 스레드 그룹 또는 그룹들도 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점에 도달할 때까지 이 스레드 그룹에 대한 셰이더 프로그램 실행이 정지된다. 그후, 병합할 모든(예를 들면, 2개의) 스레드 그룹들이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점에 도달하면, 스레드 그룹들이 스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 병합된다.
스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹으로의 스레드 그룹들의 병합은 필요에 따라 행해질 수 있다. 바람직하게는, 각각의 워프 그룹으로부터의 활성 스레드들이 병합된 한 개의 스레드 그룹(워프)의 각각의 스레드 그룹(워프) 레인들에 매핑된다. 바람직한 실시예에서는, 병합할 스레드 그룹들의 그룹의 스레드 그룹들 중에서 한 개가 스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹으로서 유지되고, 그후 병합할 스레드 그룹들의 세트 내부의 다른 스레드 그룹 또는 그룹들이 종결된다.
스레드 그룹 병합 이벤트 이후에, 병합되는 스레드 그룹들이 (바람직하게는) 한 개의 (활성) 프로그램 카운터를 공유하는 한 개의 공유된 스레드 그룹(워프)으로서 진행한다.
셰이더 프로그램의 실행시, 바람직하게는 아직 종결되지 않은 비활성 스레드는 스레드 그룹들이 병합될 때 종결된다(바람직한 실시예에서는, 스레드 그룹 내부의 비활성 "헬퍼" 스레드들이 필요로 하는 연산이 행해지면, 이들 스레드가 종결된다).
관련된 스레드 그룹들이 한 개의 스레드 그룹으로 병합되면, 셰이더 프로그램 내부의 추가적인 명령들이 병합된 스레드 그룹을 위해 실행된다. 바람직한 실시예에서는, 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 나머지 명령들의 실행이 병합된 스레드 그룹을 위해 (적절히) 완료된다.
전술한 것과 같이, 다른 스레드 그룹들과 병합될 수 없는 스레드 그룹이 존재할 수도 있다. 바람직한 실시예에서는, 이와 같은 "병합 불가능" 스레드 그룹이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 이벤트 표시 지점에 도달하면, 셰이더 그룹 병합 이벤트 표시가 무시되고(효과를 나타내지 않고), 셰이더 프로그램이 단순히 단독으로 스레드 그룹에 대해 계속 실행된다(즉, 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 명령들은 단독으로 스레드 그룹에 대해 실행된다), 즉, 다른 스레드 그룹과 병합이 가능한 것으로 식별되지 않은 스레드 그룹에 대해서는, 스레드 그룹 병합 이벤트 표시가 바람직하게는 스레드 그룹에 대한 셰이더 프로그램의 실행에 대해 아무런 효과를 나타내지 않는다.
스레드 그룹에 대해 셰이딩 스테이지에 의해 실행되는 셰이더 프로그램은 일반적으로 각각의 레지스터들에 대해 데이터를 판독 및 기록하는 명령들의 시퀀스를 수행한다. 바람직한 실시예에서, 스레드 그룹들에 대한 셰이더 프로그램을 실행시에 데이터가 판독 및 기록되는 레지스터들은 특별한 방식으로 구성되어, 후술하는 것과 같이, 스레드 그룹 병합 연산을 용이하게 하도록 돕는다.
따라서, 특히 바람직한 실시예에서는, (셰이더 프로그램이 실행되고 있는 동안) 셰이더 프로그램에 사용하기 위해 할당되는 레지스터들은 2개의 서브셋, 즉 바람직하게는 스레드 그룹에 대한 셰이더 프로그램의 실행의 개시로부터, 한 개의 스레드 그룹으로 병합할 스레드 그룹의 세트 내부의 스레드 그룹들에 의해 물리적으로 공유되는 "공통" 레지스터들의 세트와, 세트 내부의 각각의 스레드 그룹에 대해 각각 로컬(배타적인)이고 병합하려는 스레드 그룹들의 세트 내부의 다른 스레드 그룹 또는 그룹들에 액세스 불가능한 레지스터들의 세트인 "전용" 레지스터들의 세트(즉, 이 세트의 각각의 스레드 그룹은 그것만이 액세스할 수 있는 그 자신의 "전용" 레지스터들의 세트를 갖는다)로 분할된다.
"공통" 및 "전용" 서브셋으로의 레지스터들의 분할은 임의의 적절한 원하는 방식으로 행해질 수 있다. 바람직한 일 실시예에서는, 레지스터 색인 컷오프를 사용하여 이와 같은 방식으로 레지스터들을 분할하며, 컷오프 아래의 모든 레지스터들은 "공통" 레지스터이고, 컷오프 위의 모든 레지스터들은 "전용" 레지스터이다(역도 성립한다), 레지스터 색인 컷오프는, 예를 들면, 바람직하게는, 컴파일러에 의해 명시된다. 필요한 경우에는, 레지스터들의 하드 코딩된 분할을 갖는 것이나, 또는 어떤 레지스터들이 어떤 서브셋에 속하는지를 표시하는 비트맵 등과 같이, 레지스터들을 "공통" 및 "전용" 서브셋들로 분할하기 위한 다른 구성이 사용되어도 되고 대신에 사용된다.
스레드 그룹에 대한 공통 및 전용 레지스터들은 바람직하게는 다음과 같이 사용되고 처리된다.
먼저, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점 앞에서는, 스레드 그룹이 이 스레드 그룹에 대한 전용 레지스터에 대해 그룹의 모든 스레드들(레인들)(즉, "실제"(활성) 및 "헬퍼"(비활성 스레드들 모두에 대해)를 자유롭게 판독 및 기록을 할 수 있는 것이 바람직하다.
따라서, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점 앞에서는, 스레드 그룹이 ("실제"(활성) 스레드들을 포함하는 레인들에 대한) 활성 스레드들에 대한 스레드 그룹들의 세트에 대한 "공통" 레지스터에만 기록할 수 있는 것이 바람직하다.
마찬가지로, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점 앞에서는, 스레드 그룹들에 의한 공통 레지스터들의 판독이 바람직하게는 제한된다. 예를 들면, 스레드 그룹들은 바람직하게는 공통 레지스터를 전혀 판독할 수 없거나, (스레드 그룹의 활성 스레드들에 대해) "실제" 스레드들을 포함하는 레인들에 대한 공통 레지스터만을 판독하거나, 및/또는 스레드 그룹이 "실제"(활성) 스레드들을 포함하는 레인 내부의 실제 값들만을 판독하고, "헬퍼"(비활성) 스레드들을 포함하는 레인들이 디폴트 값들(예를 들면, 모두 제로값)을 수신한다.
이것은 스레드 그룹 병합 이벤트 앞의 스레드 그룹들 사이의 통신을 방지하는데 도움이 된다.
스레드 그룹이 병합된 후(병합 이벤트가 행해진 후), 특히 바람직한 실시예에서는, 병합된 스레드 그룹에 대한 "전용" 레지스터들의 콘텐츠가 무효화된다(따라서, 병합된 스레드 그룹에 대한 공통 레지스터들만이 유효한 값을 갖는 것으로 생각된다).
따라서, 전용 레지스터 공간에 대한 액세스가 병합된 한 개의 스레드 그룹에 대해 함께 차단될 수도 있다. 그러나, 바람직한 실시예에서는, 병합된 한 개의 스레드 그룹에 대해 새로운 세트의 전용 레지스터들이 할당된다. 이것은, 필요에 따라, 예를 들어, 스레드 그룹들 중에서 한 개를 한 개의 병합된 스레드 그룹의 레지스터 공간 내부에 매핑하거나, 또는 병합 이벤트시에, 병합된 스레드 그룹에 대한 레지스터 공간 내부에 새로운 세트의 전용 레지스터들을 매핑하거나, 또는 두 개의 스레드 그룹들의 전용 레지스터들을 결합하여 병합한 한 개의 스레드 그룹에 대해 더 큰 전용 레지스터 공간을 제공함으로써 행해진다.
셰이더 프로그램이 복수의 스레드 그룹 병합 이벤트 지점들을 포함하는 경우에는, 최종 병합 지점 이후에 병합된 전용 레지스터들만이 이용가능하게 되어도 되고, 바람직하게는 이용가능하게 된다.
스레드 그룹들에 대한 공통 및 전용 레지스터들의 전술한 구성에 대응하여, 특히 바람직한 실시예에서는, 비활성("헬퍼") 스레드들의 사용을 요구하는 명령이 셰이더 프로그램 실행 내부의 병합 이벤트 지점 이전에 행해지고, 바람직하게는 해당 스레드 그룹에 대한 전용 레지스터들을 사용한다.
따라서, (픽셀-델타, 밉맵 텍스처 룩업 등의) 교차 샘플링 포인트 계산을 행하는 모든 명령은 바람직하게는 스레드 그룹 병합 이벤트 지점 이전에 발생하고, 그것의 입력으로서 전용 레지스터들을 사용하고, 및/또는 교차 샘플링 포인트 계산에 입력이 잠재적으로 될 수 있는 결과를 갖는 명령이 바람직하게는 병합 이벤트 지점 앞에서 발생하고 그것의 결과를 전용 레지스터에 기록한다.
따라서, 바람직한 실시예에서는, 스레드 그룹 병합 이벤트에 걸쳐 보존될 필요가 있는(즉, 병합 이벤트 후의 병합된 한 개의 스레드 그룹에 대해 이용가능하게 될) 병합 이벤트 지점 앞에서부터의 데이터 항목이 (병합 이벤트 이전의) 공통 레지스터(들)에 기억된다.
이것은, 스레드 그룹 병합 이벤트 이후에, 스레드 그룹들의 전용 레지스터들의 콘텐츠가 더 이상 필요하지 않으므로, 이들 전용 레지스터들은 그후에 무효로 되거나, 및/또는 병합된 스레드 그룹에 대한 전용 레지스터들로서 재사용될 수 있다는 것으로 안전하게 가정할 수 있다는 것을 의미한다.
이것을 달성하기 위해, 셰이더 프로그램 연산(코드)은 바람직하게는, 셰이더 프로그램 코드를 컴파일하는 컴파일러에 의해 구성된다.
셰이더 프로그램의 실행 중에 (잠재적으로) 병합될 스레드 그룹들에 대한 레지스터들의 전술한 분할 및 처리는, 병합 연산을 위해 레지스터들 사이에 데이터를 실제로 물리적으로 이동할 필요가 없이 스레드 그룹들의 병합이 용이하게 행해질 수 있도록 한다.
스택하기 위해 스레드 그룹의 레지스터들의 일부를 스필(spill)할 필요가 있는 경우에는(이것은, 예를 들어 매우 큰 데이터 작업 세트들을 사용하여 프래그먼트 셰이더를 실행할 때 발생할 수 있다), 레지스터들에 대해 전술한 방식으로 2개의 스택, 즉 한 개의 "전용" 및 한 개의 "공통" 스택을 마찬가지로 사용할 수도 있다. 그러나, 이것은 필수적인 것은 아니며, 바람직한 실시예에서는, 이와 같은 경우에, 한 개의 스택이 사용되지만, 병합 이벤트시에 무효화된다. 이 연산을 용이하게 하기 위해, 병합 이벤트시에 스택이 비워지도록 셰이더 프로그램이 (예를 들어, 컴파일러에 의해) 구성되는 것이 바람직하다(스레드 그룹 병합 이벤트 지점으로서 다른 방식으로 유용할지도 모르는 셰이더 프로그램 내부의 지점들 중에서 어느 한 개에서 이것을 보장할 수 없는 경우에는, 스레드 그룹 병합 이벤트 지점을 갖지 않는 셰이더 프로그램이 바람직하게 생성된다).
전술한 내용은 복수의 스레드 그룹들이 셰이더 프로그램 연산중에 한 개의 스레드 그룹으로 병합되는 동작을 설명한 것이다. 본 출원인은, 이와 반대의 동작, 즉 한 개의 스레드 그룹을 복수의 스레드 그룹들로 "병합 해제(demerge)"하는 것도 유용할 수 있다는 것을 인식하였다.
예를 들면, 복수의(예를 들면, 4개의) 샘플링 포인트들이 발생하려는 렌더 출력 내부의 각각의 샘플링 위치에 대해 처리되는, 샘플 주파수 셰이딩 등의 일부의 그래픽 처리 연산이 존재한다. 이와 같은 경우에, 주어진 샘플링 위치에 대한 샘플링 포인트들의 각각의 세트는 한 개의 스레드 그룹(워프)으로서 처리될 수 있다(즉, 처리하려는 렌더 출력의 각각의 샘플링 위치에 대해 한 개의 스레드 그룹이 존재하게 된다). 그러나, 본 출원인은, 이들 연산에서, 행해질 필요가 잇는 샘플링 포인트당 계산도 존재하며, 주어진 샘플링 위치에 대한 각각의 샘플링 포인트에 대해 동일하게 행해질 필요가 있으므로, 실제로, 샘플링 위치당 행해질 수 있는 일부의 계산이 존재할 수도 있다는 것을 인식하였다. 이들 샘플링 위치당 계산은, 각각의 샘플링 위치에 대해 전체의 스레드 그룹을 필요로 하지 않으며, 한 개의 스레드 그룹(레인)이 주어진 샘플링 위치에 대한 계산을 행할 수도 있다.
이와 같은 경우에, 본 출원인은, 예를 들어, 복수의 샘플링 위치들에 대해 한 개의 스레드 그룹(워프)이 샘플링 위치당 계산을 행할 수도 있으며, 그후 복수의 개별적인 스레드 그룹들을 사용하여 샘플링 위치들에 대한 샘플링 포인트당 계산을 행할 수 있다는 것을 인식하였다. 따라서, 샘플링 위치당 연산이 행해지도록 프래그먼트 셰이더 프로그램이 구성되거나 구성될 수 있는 경우에는, 샘플링 위치당 계산이 행해지는 동안, 주어진 세트의 샘플링 위치들에 대한 프래그먼트 셰이더 실행이 한 개의 스레드 그룹으로 개시할 수 있으며, 그후, 스레드 그룹이 복수의 스레드 그룹들로 분할("병합 해제")되어, 샘플링 포인트당 연산(계산)을 행할 수 있다.
따라서, 본 발명의 또 다른 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인의 작동방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고, 상기 작동방법은,
셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여 렌더 출력을 발생하는 셰이더 프로그램과 함께, 한 개의 스레드 그룹이 복수의 별개의 스레드 그룹들로 분할되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시를 셰이더 스테이지에게 발행하는 단계와,
셰이딩 스테이지에 의해, 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계를 포함하고,
상기 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계는,
셰이더 그룹이 스레드 그룹 분할 이벤트 표시에 도달할 때, 한 개의 스레드 그룹을 복수의 별개의 스레드 그룹들로 분할하는 단계와,
복수의 별개의 스레드 그룹들에 대한 분할 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 단계를 포함하는 그래픽 처리 파이프라인의 작동방법이 제공된다.
본 발명의 또 다른 일면에 따르면, 데이터 처리 시스템으로서,
명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인을 구비하고, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 데이터 처리 시스템은,
셰이딩 스테이지에 대한 프로그램들을 컴파일하여 셰이더 스테이지에 의해 실행하기 위한 명령들을 발생하는 컴파일러를 더 구비하고,
상기 컴파일러는, 셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여 렌더 출력을 발생하는 셰이더 프로그램과 함께, 스레드 그룹들이 복수의 별개의 스레드 그룹들로 분할되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시를 셰이더 스테이지에게 발행하도록 구성되고,
상기 셰이딩 스테이지는 스레드 그룹들에 대한 셰이더 프로그램을 실행하도록 구성되고,
상기 스레드 그룹에 대한 셰이더 프로그램의 실행은,
셰이더 그룹이 스레드 그룹 분할 이벤트 표시에 도달할 때, 한 개의 스레드 그룹을 복수의 별개의 스레드 그룹들로 분할하는 것과,
복수의 별개의 스레드 그룹들에 대한 분할 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 것을 포함하는, 데이터 처리 시스템이 제공된다.
본 발명의 이와 같은 국면들에서, 처리되고 있는 스레드 그룹은 셰이더 프로그램 실행 내부의 특정한 지점 이후에 복수의 별개의 스레드 그룹들로 분할된다. 이것은, 예를 들어, 샘플링 위치에 대한 모든 샘플링 포인트에 대해 동일하게 행해질 필요가 있는 샘플링 위치당 계산이 한 개의 스레드 그룹으로서 처리될 수 있도록 하며, 그후 한 개의 스레드 그룹이 복수의 별개의 스레드 그룹들로 분할되면 샘플링 포인트당 계산이 행해진다. 이와 같은 구성은, 예를 들면, 실제로 필요하지 않은 샘플링 포인트들에 대한 계산을 위해 (실행 사이클 등의) 처리 자원을 확장할 필요성을 없앤다.
본 기술분야의 당업자에게 있어서 자명한 것과 같이, 본 발명의 이들 국면은 필요에 따라 본 발명에서 설명한 바람직한 옵션의 특징들 중에서 한 개 이상 또는 전체를 포함할 수 있으며 바람직하게는 포함한다.
따라서, 예를 들어, 셰이더 프로그램은 바람직하게는 프래그먼트 셰이더 프로그램이고, 따라서, 셰이더 스테이지는 바람직하게는 그래픽 처리 파이프라인의 프래그먼트 셰이더 스테이지이다(로서 동작한다).
따라서, 예를 들면, 스레드 그룹들은 임의의 적절한 원하는 크기를 가질 수 있다. 바람직한 실시예에서 각각의 초기의 한 개의 스레드 그룹은 4개의 스레드를 포함한다(즉, 4의 워크 폭이 존재한다. 분할 이벤트 이후의 스레드 그룹들은 바람직하게는 초기의 한 개의 스레드 그룹과 동일한 수의 스레드를 포함한다(따라서, 예를 들면, 4개의 스레드).
마찬가지로, 셰이더 프로그램에 포함되는 스레드 그룹 분할 이벤트 표시는, 바람직하게는, 전술한 방식들 중에서 한 개로(따라서, 셰이더 프로그램 내부의 명령으로서 또는 명령의 일부로서, 셰이더 프로그램 내부의 명령의 변형을 사용하여, 또는 셰이더 프로그램 코드 자체와 별개로 명시된 컷오프 지점 등의 셰이더 프로그램 내부의 스레드 그룹 분할 이벤트 지점을 표시할 수 있는 다른 방식으로) 제공된다.
스레드 그룹 분할 이벤트 표시는 마찬가지로 바람직하게는 그래픽 처리 파이프라인의 컴파일로(셰이더 컴파일러)에 의해 제공된다.
특히 바람직한 실시예에서, 컴파일러는, 예를 들어, 그래픽 처리를 필요로 하는 호스트 프로세서 상의 어플리케이션에 의해 주어지는 셰이더 프로그램 코드를 분석하고, 셰이더 프로그램 실행 내부의 어떤 지점에서 스레드 그룹 분할 이벤트가 가능한지를 판정하고, 가능한 경우에는, 셰이더 프로그램 내부의 적절한 지점에 (예를 들어, 이 지점에 셰이더 프로그램 내부의 특정한 명령을 삽입함으로써) 스레드 그룹 분할 이벤트 표시를 제공하여 스레드 그룹 분할 이벤트 지점을 표시한다.
특히 바람직한 실시예에서, 컴파일러는, (이것이 가능한 경우에) 셰이더 프로그램 내부의 연산을 재배열함으로써, 예를 들어, 셰이더 프로그램 실행 내부에 스레드 그룹 분할 이벤트를 포함시킬 기회를 제공하거나, 및/또는 셰이더 프로그램의 실행 내부에 스레드 그룹 분할 이벤트의 더욱 효율적인 포함 및 이용을 허용하도록 더 동작가능하다.
이와 관련하여, 컴파일러는 바람직하게는 샘플링 위치당 계산을 행하는 셰이더 프로그램 연산을 스레드 그룹 분할 이벤트 표시 지점 앞에 배치하도록 동작한다. 따라서, 컴파일러는 바람직하게는 샘플링 포인트당 계산을 행하는 셰이더 프로그램 연산을 셰이더 프로그램 실행 내부의 스레드 그룹 분할 이벤트 뒤에 배치한다.
본 발명의 이들 국면은 그 자체가 컴파일러 연산으로 더 확장된다.
따라서, 본 발명의 또 다른 일면에 따르면, 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 컴파일러로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 컴파일러는, 셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
셰이더 프로그램이 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들과 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 모두를 포함하는지 판정하고,
셰이더 프로그램이 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들과 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 모두를 포함하는 것으로 판정된 경우에, 스레드 그룹이 복수의 별개의 스레드 그룹들로 분할되어야 하는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하도록 구성되고,
스레드 그룹 분할 지점은 셰이더 프로그램 내부의 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 뒤에 놓이고 셰이더 프로그램 내부의 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들 중에서 한 개 이상(바람직하게는 전체) 앞에 놓이는, 컴파일러가 제공된다.
본 발명의 또 다른 일면에 따르면, 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 방법은, 셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
셰이더 프로그램이 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들과 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 모두를 포함하는지 판정하는 단계와,
셰이더 프로그램이 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들과 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 모두를 포함하는 것으로 판정된 경우에, 스레드 그룹이 복수의 별개의 스레드 그룹들로 분할되어야 하는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하는 단계를 포함하고,
스레드 그룹 분할 지점은 셰이더 프로그램 내부의 실행할 스레드들의 그룹들에 대해 총괄적으로 행해질 수 있는 연산 뒤에 놓이고 셰이더 프로그램 내부의 실행할 스레드들에 대해 개별적으로 행해져야 하는 연산들 중에서 한 개 이상(바람직하게는 전체) 앞에 놓이는, 컴파일 방법이 제공된다.
따라서, 이들 국면은 셰이더 스테이지에 의해 실행되고 있는 셰이더 프로그램에 대한 스레드 그룹 분할 표시에 응답하여 스레드 그룹들을 분할할 수 있는 그래픽 처리 파이프라인의 셰이더 스테이지로도 확장된다.
따라서, 본 발명의 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이더 스테이지로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 셰이더 스테이지는,
스레드 그룹들이 셰이더 프로그램과 관련되어 복수의 별개의 스레드 그룹들로 분할되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시에 응답하여, 셰이더 프로그램의 명령을 실행할 때,
스레드 그룹을 복수의 별개의 스레드 그룹들로 분할하고,
복수의 별개의 스레드 그룹들에 대한 분할 이벤트 표시 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하도록 구성된 셰이더 스테이지가 제공된다.
본 발명의 또 다른 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이더 스테이지의 작동방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 방법은, 스레드 그룹들이 셰이더 프로그램과 관련되어 복수의 별개의 스레드 그룹들로 분할되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 분할 이벤트 표시에 응답하여, 셰이더 프로그램의 명령을 실행할 때, 셰이더 스테이지가,
스레드 그룹을 복수의 별개의 스레드 그룹들로 분할하는 단계와,
복수의 별개의 스레드 그룹들에 대한 분할 이벤트 표시 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 단계를 포함하는 셰이더 스테이지의 작동방법이 제공된다.
본 발명이 속한 기술분야의 당업자에게 자명한 것과 같이, 필요한 경우에는, 본 발명의 이들 국면은 전술한 본 발명의 바람직한 옵션의 특징의 어느 한 개 이상 또는 전체를 포함할 수 있고 바람직하게는 포함한다. 따라서, 예를 들어, 셰이더 프로그램은 바람직하게는 프래그먼트 셰이더 프로그램이며, 따라서, 셰이더 스테이지는 바람직하게는 그래픽 처리 파이프라인의 프래그먼트 셰이더 스테이지이다(프래그먼트 셰이더 스테이지로서 동작한다).
본 발명의 이들 국면 및 실시예들에서는, 스레드 그룹들이 셰이딩 스테이지로 발행되면, 셰이딩 스테이지가 스레드 그룹들에 대한 셰이더 프로그램을 실행한다. 그후, 한개의 (바람직하게는 각각의) 스레드 그룹이 스레드 그룹 분할 이벤트 표시에 도달할 때, 스레드 그룹이 복수의 별개의 스레드 그룹들로 분할된다. 필요에 따라, 1개보다 많은 수의 스레드 그룹 분할 이벤트 지점(및 표시)이 셰이더 프로그램에 포함될 수도 있다. 이와 같은 경우에, 분할된 스레드 그룹들이 셰이더 프로그램 실행 내부의 나중의 분할 지점에 도달할 때 분할된 스레드 그룹들이 다시 분할되어도 된다.
초기의 한 개의 스레드 그룹이 분할되는 스레드 그룹들의 수는 필요에 따라 선택될 수 있으며, 예를 들면, 바람직하게는, 셰이더가 지원하는 스레드 그룹들의 크기와 각각의 샘플링 위치에 대해 고려되는 샘플링 포인트들의 수에 의존한다.
따라서, 예를 들어, 바람직하게는, 초기의 한 개의 스레드 그룹은 초기의 한 개의 스레드 그룹들로부터의 스레드들(레인들) 중에서 한 개를 각각 표시하는 복수의 별개의 스레드 그룹들로 분할될 수도 있다. 이것은, 예를 들어, 각각의 샘플링 위치가 셰이더 내부의 스레드 그룹들이 포함할 수 있는 스레드들의 수에 대응하는 그것과 관련된 샘플링 포인트들의 수를 갖는 경우에 적절할 수 있다. 이와 같은 경우에, (바람직하게는 각각의) 초기 스레드 그룹은 초기의 스레드 그룹 내에 스레드들이 존재하였던 것과 같은 다수의 별개의 스레드 그룹들로 분할된다.
이와 달리 또는 이에 덧붙여, 서로 다른 샘플링 위치들로부터의 샘플링 포인트들이 동일한 스레드 그룹을 사용하여 처리될 수도 있다. 예를 들어, 초기의 한 개의 스레드 그룹이 표시하는 샘플링 위치들 각각에 대한 각각의 샘플링 포인트 위치에 대한 샘플링 포인트들은 초기의 한 개의 스레드 그룹이 분할된 후 각각의 스레드 그룹으로서 처리될 수도 있다. 이와 같은 경우에, 초기의 스레드 그룹은, 예를 들어, 바람직하게는 초기의 한 개의 스레드 그룹으로부터의 각각의 스레드들(레인들)에 대한 각각의 샘플링 포인트 위치들 중에서 한 개로부터의 샘플링 포인트들을 각각 표시하는 복수의 별개의 스레드 그룹들로 분할될 것이다. 따라서, 이와 같은 경우에는, (바람직하게는 각각의) 초기의 스레드 그룹은, 처리할 샘플링 위치마다 샘플링 포인트들이 존재하는 것과 같은 다수의 별개의 스레드 그룹들로 분할될 것이고, 바람직하게는 분할된다.
스레드 그룹 분할 이벤트 이후에, 셰이더 프로그램 내부의 추가적인 명령들이 분할된 스레드 그룹(복수의 별개의 스레드 그룹들)에 대해 실행된다. 바람직한 실시예에서, 분할 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 나머지 명령들의 실행이 복수의 별개의 스레드 그룹들에 대해 (적절히) 완료된다.
본 발명의 이들 국면 및 실시예들의 특히 바람직한 실시예에서는, 스레드 그룹에 대한 셰이더 프로그램을 실행할 때 데이터가 판독되고 기록되는 레지스터들은 특별한 방식으로 구성되는데, 이것과 마찬가지로 스레드 그룹 분할 동작을 용이하게 하도록 돕는다.
따라서, 특히 바람직한 실시예에서는, 셰이더 프로그램의 실행 중에 사용되는 레지스터들은 2개의 서브셋, 즉 바람직하게는 셰이더 프로그램의 실행 개시로부터, 초기의 한 개의 스레드 그룹과 한 개의 스레드 그룹으로부터 분할될 스레드 그룹들의 세트 내부의 스레드 그룹들에 의해 물리적으로 공유되는 "공통" 레지스터들의 세트와, 각각의 스레드 그룹에 대해 각각 로컬이고(배타적이고) 다른 스레드 그룹 또는 스레드 그룹들이 액세스 불가능한 레지스터들의 세트인 "전용" 레지스터들의 세트(즉, 각각의 스레드 그룹(초기의 한 개의 스레드 그룹과 한 개의 스레드 그룹이 분할되는 스레드 그룹들의 세트에 있는 스레드 그룹들)이 그것만이 액세스할 수 있는 그 자신의 "전용" 레지스터들의 세트를 갖게 된다)로 다시 분할된다.
이들 구성에서는, 셰이더 프로그램 실행 내부의 스레드 그룹 분할 지점 앞에서, 초기의 "한개의" 스레드 그룹이 바람직하게는 그것의 계산을 위해 스레드 그룹(들)에 대한 공통 레지스터들을 사용한다(따라서, 바람직하게는 스레드 그룹(들)에 대한 공통 레지스터에 대해 그룹의 모든 스레드들(레인들)을 자유롭게 판독 및 기록할 수 있다).
그후, 초기의 한 개의 스레드 그룹이 분할된 후(분할 이벤트가 행해진 후), 분할되었던 스레드 그룹에 대한 공통 레지스터들은 바람직하게는 판독 전용 레지스터(들)로 취급되고(이에 따라 샘플링 위치당 값들을 보존하고), 스레드 그룹 분할 이벤트 후에 행해지는 계산은 바람직하게는 해당 스레드 그룹에 대해 전용 레지스터들을 사용한다(바람직하게는 전용 레지스터들만을 사용한다).
이것을 달성하기 위해, 셰이더 프로그램 연산(코드)은 바람직하게는 셰이더 프로그램 코드를 컴파일하는 컴파일러로 구성된다. 따라서, 적절한 전용 및 공통 레지스터들이 셰이더 프로그램 실행이 개시되기 전에 스레드 그룹들에 대해 예약될 수 있다.
셰이더 프로그램의 실행 중에 분할될 스레드 그룹들에 대한 레지스터들의 전술한 분할 및 처리는, 분할 연산을 위해 레지스터들 사이에서 데이터를 실제로 물리적으로 이동할 필요가 없이 스레드 그룹의 분할이 용이하게 행해질 수 있도록 한다.
필요한 경우에는, 주어진 셰이더 프로그램 내부에 스레드 그룹 병합 이벤트 기회와 스레드 그룹 분할 이벤트 모두를 포함하는 것이 가능할 것이다. 그러나, 본 출원인은, 대부분의 환경에서는, 주어진 셰이더 프로그램 내부에 이들 이벤트들 중에서 두 개 전체가 아닌 한 개 또는 나머지를 포함시키는 것이 적절하다고 생각한다.
전술한 내용으로부터, 본 발명의 스레드 그룹 병합 및 스레드 그룹 분할 연산 모두에 있어서, 중요한 특징은, 스레드들과 스레드 그룹들이 "전용" 및 "공통" 레지스터들 내부에 사용하는 레지스터들의 배치라는 것을 알 수 있다. 셰이더 프로그램이 실행되고 있을 때 스레드 그룹들에 의해 사용되는 레지스터들의 이와 같은 배치는 당연히 신규하고 유리하다는 것을 알 수 있다.
따라서, 본 발명의 또 다른 일면에 따르면, 명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지들을 포함하는 그래픽 처리 파이프라인에서 처리 연산들을 행하기 위해 명령들을 실행할 때 스레드 그룹들에 의해 사용되는 레지스터들을 할당하는 방법으로서, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고, 상기 할당방법은,
셰이더 프로그램의 실행 중에 그래픽 처리 파이프라인의 프로그래머블 셰이딩 스테이지에 의해 셰이더 프로그램을 실행하려는 스레드 그룹에 사용하기 위해, 셰이더 프로그램이 실행하고자 하는 다른 스레드 그룹들과 공유하는 공통 레지스터 또는 레지스터들과, 스레드 그룹에 대해 로컬(배타적)이고 셰이더 프로그램을 실행하고자 하는 다른 스레드 그룹들이 액세스 불가능한 전용 레지스터 및 레지스터들을 제공하는 단계를 포함하는 레지스터 할당방법이 제공된다.
본 발명의 또 다른 일면에 따르면, 그래픽 처리 파이프라인으로서,
명령들을 실행하여 셰이딩 연산을 행하는 한 개 이상의 프로그래머블 셰이딩 스테이지들을 구비하고, 그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
상기 그래픽 처리 파이프라인은,
명령들을 실행하여 처리 연산들을 행할 때 스레드 그룹들에 의해 사용되는 복수의 레지스터들을 더 구비하고,
상기 복수의 레지스터들은, 사용시에, 셰이더 프로그램의 실행 중에, 그래픽 처리 파이프라인의 프로그래머블 셰이딩 스테이지에 의해 셰이더 프로그램을 실행하려는 스레드 그룹에 사용하기 위해, 셰이더 프로그램이 실행하고자 하는 다른 스레드 그룹들과 공유하는 공통 레지스터 또는 레지스터들과, 스레드 그룹에 대해 로컬(배타적)이고 셰이더 프로그램을 실행하고자 하는 다른 스레드 그룹들이 액세스 불가능한 전용 레지스터 및 레지스터들을 제공하도록 구성되는 그래픽 처리 파이프라인이 제공된다.
본 발명이 속한 기술분야의 당업자에게 자명한 것과 같이, 필요한 경우에는, 본 발명의 이들 국면은 전술한 본 발명의 바람직한 옵션의 특징의 어느 한 개 이상 또는 전체를 포함할 수 있고 바람직하게는 포함한다.
따라서, 예를 들어, 공통 및 전용 레지스트들로의 레지스터들의 분할은 바람직하게는 전술한 방법들 중에서 한 개오 행해진다.
따라서, 셰이더 프로그램 실행은, 바람직하게는, 특정한, 바람직하게는 선택된, 연산에 대한 스레드 그룹에 대해 공통 레지스터 또는 레지스터들을 사용하여, 바람직하게는, 다른, 바람직하게는 선택된, 연산에 대한 스레드 그룹에 대해 전용 레지스터 또는 레지스터들을 사용한다.
마찬가지로, 특히 바람직한 실시예에서는, 스레드 그룹에 대한 셰이더 프로그램 연산을 위한 공통 및 전용 레지스터들의 이용은 바람직하게는 도달한 셰이더 프로그램 내부의 지점에 근거하여 변경되거나 및/또는 선택된다.
그래픽 처리 파이프라인의 프래그먼트 셰이더는 필요에 따라 임의의 적절한 방법으로 구현될 수 있으며, 필요에 따라 원하는 적절한 프래그먼트 셰이딩 기능을 행할 수 있다. 이 프래그먼트 셰이더는, 예를 들면, 프리미티브 또는 프리미티브들을 렌더링하여, 예를 들어 표시할 프레임을 표시하는 렌더 출력값들의 세트를 발생한다. 그후, 이들 출력값들은 표시를 위한 프레임 버퍼와 같이, 기억 및 이용을 위해 외부 메모리로 보내진다.
프래그먼트 셰이더 이외에, 그래픽 처리 파이프라인의 프로그래머블 처리 스테이지(들)는, 필요에 따라, 정점 셰이더, 기하 셰이더 등의 다른 셰이더 스테이지들(셰이더들)로서 기능(동작)한다(그래픽 처리 파이프라인이 이들 다른 셰이더 스테이지들을 포함해도 된다).
그래픽 처리 파이프라인의 각각의 프로그래머블 처리 스테이지(실행 유닛)는 프로그래머블 처리회로 등의 적절한 프로그래머블 하드웨어 구성요소를 구비해도 된다. 각각의 프로그래머블 처리 스테이지가 별개의 회로 소자로서 처리 파이프라인의 다른 프로그래머블 스테이지들에 설치되거나, 프로그래머블 처리 스테이지들이 그들의 프로그래머블 처리회로(이것은 그후에 원하는 프로그래머블 처리 스테이지로서 기능하도록 다르게 프로그래밍된다)의 일부 또는 전체를 공유해도 된다.
프로그래머블 처리(셰이더) 스테이지들 이외에, 그래픽 처리 파이프라인은, 래스터화기, 조기 깊이(early depth)(또는 조기 및 스텐실) 테스터, 후기 깊이(late depth)(또는 깊이 및 스텐실) 테스트, 블렌더, 타일 버퍼, 기록(write out) 유닛 등과 같은, 그래픽 처리 파이프라인이 포함하는 적절한 다른 원하는 처리 스테이지를 포함해도 된다.
본 발명은, 표시용 프레임, 렌더-투(to)-텍스처 출력 등의, 그래픽 처리 파이프라인을 이용하여 발생하는 모든 형태의 출력을 위해 사용될 수 있다. 그래픽 처리로부터의 출력, 예를 들어, 프래그먼트 셰이딩된 데이터 값들은 바람직하게는, 표시용 프레임 버퍼 등의 기억 및 이용을 위한 외부, 예를 들어, 메인 메모리로 보내진다.
일부 실시예에서, 그래픽 처리 파이프라인은, 본 발명에서 설명한 데이터를 기억하고, 및/또는 본 발명에서 설명한 처리를 행하는 소프트웨어를 기억하는 한 개 이상의 메모리 및/또는 메모리 소자를 구비하거나, 및/또는 이 메모리 및/또는 메모리 소자와 통신한다. 또한, 그래픽 처리 파이프라인은 호스트 마이크로프로세서, 및/또는 그래픽 프로세서에 의해 발생된 데이터에 근거하여 화상을 표시하는 디스플레이와 통신해도 된다.
본 발명은 모든 적절한 형태 또는 구성의 그래픽 프로세서에 적용가능하다. 특히 본 발명은 타일 기반의 그래픽 프로세서와 그래픽 처리 시스템에 적용가능하다. 따라서, 본 실시예에서는, 그래픽 처리 시스템 및 그래픽 처리 파이프라인은 각각 타일 기반의 시스템 및 파이프라인이다.
특히 바람직한 실시예에서는, 예를 들어 표시장치용의 프레임 버퍼에 기록되는 렌더링된 프래그먼트 데이터를 생성하여 출력하는 단일의 그래픽 처리 플랫폼에 대해 본 발명의 다양한 기능이 행해진다.
본 발명은, 적절히 구성된 마이크로프로세서 기반의 시스템 등의 임의의 적절한 시스템으로 구현될 수 있다. 바람직한 실시예에서, 본 발명은 컴퓨터 및/또는 마이크로 프로세서 기반의 시스템으로 구현된다.
본 발명의 다양한 기능은 임의의 원하는 적절한 방식으로 행해질 수 있다. 예를 들면, 본 발명의 기능은 필요에 따라 하드웨어 또는 소프트웨어로 구현될 수 있다. 따라서, 예를 들어, 달리 언급하지 않는 한, 본 발명의 다양한 기능 구성요소, 스테이지 및 "수단"은, 원하는 방식으로 동작하도록 프로그래밍될 수 있는 적절한 전용 하드웨어 구성요소 및/또는 프로그래머블 하드웨어 구성요소 등과 같이, 다양한 기능을 행하도록 동작가능한 적절한 프로세서 또는 프로세서들, 제어기 또는 제어기들, 기능 유닛, 회로, 처리 로직, 마이크로프로세서 배치 등을 구비한다.
또한, 본 발명의 기술분야의 당업자에게 있어서 자명한 것과 같이, 본 발명의 다양한 기능 등은 특정한 프로세서 상에서 복제되거나, 병렬로 수행되어도 된다는 점에 주목하기 바란다. 마찬가지로, 다양한 처리 스테이지는, 필요에 따라 처리회로를 공유해도 된다.
전술한 특정한 기능을 행하는데 필요한 하드웨어 이외에, 데이터 처리 시스템 및 파이프라인은 데이터 처리 파이프라인이 포함하는 통상적인 기능 유닛들의 한 개 이상 또는 모두를 포함할 수 있다.
또한, 본 발명이 속한 기술분야의 당업자에게 자명한 것과 같이, 본 발명의 이들 국면 및 실시예는 필요에 까라 전술한 본 발명의 바람직한 옵션의 특징의 어느 한 개 이상 또는 전체를 포함할 수 있고 바람직하게는 포함한다.
본 발명에 따른 방법은, 소프트웨어, 예를 들면, 컴퓨터 프로그램을 적어도 일부 사용하여 구현되어도 된다. 따라서, 또 다른 일면에서 볼 때, 본 발명은 데이터 처리수단에 설치되었을 때 본 발명에서 설명한 방법을 행하도록 명시적으로 구성된 컴퓨터 소프트웨어를 제공하고, 컴퓨터 프로그램 구성요소는 프로그램 구성요소가 데이터 처리장치 상에서 실행될 때 전술한 본 발명의 방법을 행하는 소프트웨어 코드 부분들을 포함하고, 컴퓨터 프로그램은 이 프로그램이 데이터 처리 시스템 상에서 실행될 때 전술한 본 발명의 방법 또는 방법들의 모든 스텝들을 행하도록 구성된 코드수단을 포함한다. 데이터 프로세서는 마이크로프로세서 시스템, 프로그래머블 FPGA(field programmable gate array) 등이어도 된다.
또한, 본 발명은, 데이터 처리수단을 포함하는 그래픽 프로세서, 렌더러 또는 마이크로프로세서 시스템을 동작하도록 사용될 때, 상기 데이터 처리수단과 연계하여, 상기 프로세서, 렌더러 또는 시스템이 본 발명의 방법의 단계들을 행하도록 하는 소프트웨어를 포함하는 컴퓨터 소프트웨어 기록매체로 더 확장된다. 이와 같은 컴퓨터 소프트웨어 기록매체는, ROM 칩, CD ROM, RAM, 플래시 메모리 또는 디스크 등의 물리적인 기억매체일 수도 있으며, 또는 선로를 거친 전자 신호, 광학 신호, 위성을 등에 대한 무선 신호 등의 신호일 수도 있다.
더구나, 본 발명의 방법의 모든 단계들이 컴퓨터 소프트웨어에 의해 실행될 필요는 없다는 것이 명백하므로, 더 넓은 국면에서, 본 발명은, 본 발명에서 설명한 방법의 단계들 중에서 적어도 한 개를 행하는 컴퓨터 소프트웨어와 컴퓨터 소프트웨어 기록매체 상에 설치된 소프트웨어를 제공한다.
따라서, 본 발명은 컴퓨터 시스템에서 사용되는 컴퓨터 프로그램 제품으로서 적절히 구현되어도 된다. 이와 같은 구현은, 예를 들어 디스켓, CD-ROM, ROM, RAM, 플래시 메모리 또는 하드디스크 등의 컴퓨터 판독가능한 매체와 같은 유형의 비일시적인 매체 위에 고정된 일련의 컴퓨터 판독가능한 명령들을 포함해도 된다. 또한, 이와 같은 구현은, 모뎀이나 다른 인터페이스 장치를 거쳐, 광 또는 아날로그 통신 라인을 포함하는 유형의 매체를 거쳐, 또는 적외선 또는 다른 전송 기술을 포함하는 무선 기술을 사용하여 무형으로 컴퓨터 시스템에 송신가능한 일련의 컴퓨터 판독가능한 명령들을 포함할 수도 있다. 이들 일련의 컴퓨터 판독가능한 명령들은 본 발명에서 전술한 기능의 전체 또는 일부를 구현한다.
본 발명의 기술분야의 당업자에게 있어서, 이와 같은 컴퓨터 판독가능한 명령들이 다수의 컴퓨터 아키텍처 또는 운영체계와 사용되는 다수의 프로그래밍 언어로 기록될 수 있다는 것은 자명하다. 더구나, 이와 같은 명령은, 반도체, 자기 또는 광학을 포함하는 현재 및 미래의 메모리 기술을 사용하여, 또는 광, 적외선 또는 마이크로웨이브를 포함하는 현재 및 장래의 통신기술을 이용하여 전송되어 기억될 수도 있다. 이와 같은 컴퓨터 프로그램은, 예를 들어 수축 포장된 소프트웨어와 같이 첨부된 인쇄되거나 전자 문서와 함께 착탈가능한 매체로서 배포되거나, 예를 들어, 시스템 ROM이나 고정 디스크와 같이 컴퓨터 시스템에 미리 로드되거나, 예를 들어 인터넷이나 월드 와이드 웹 등의 네트워크를 거쳐 서버 또는 전자 게시판으로부터 배포될 수도 있다.
이하, 첨부도면을 참조하여 본 발명의 바람직한 실시예를 설명한다.
도 1은 샘플링 포인트들의 그리드와 중첩하는 프리미티브를 개략적으로 나타낸 것이다.
도 2는 예시적인 컴퓨터 그래픽 처리 시스템을 나타낸 것이다.
도 3은 본 발명의 방식으로 동작할 수 있는 그래픽 처리 파이프라인을 개략적으로 나타낸 것이다.
도 4는 그래픽 처리 파이프라인에 의해 실행하기 위한 셰이더 프로그램의 컴파일링을 개략적으로 나타낸 것이다.
도 5는 본 발명의 제 1 실시예를 개략적으로 나타낸 것이다.
도 6은 본 발명의 제 1 실시예에서의 레지스터들의 사용을 개략적으로 나타낸 것이다.
도 7은 본 발명의 제 1 실시예에서의 컴파일러의 동작을 개략적으로 나타낸 것이다.
도 8은 본 발명의 제 2 실시예를 개략적으로 나타낸 것이다.
도 9는 본 발명의 제 2 실시예에서의 레지스터들의 사용을 개략적으로 나타낸 것이다.
도 10은 본 발명의 제 2 실시예에서의 컴파일러의 동작을 개략적으로 나타낸 것이다.
첨부도면에서 적절히 유사한 구성요소들에 대해 동일한 참조번호를 사용한다.
이하, 표시용 컴퓨터 그래픽의 처리와 관련하여 본 발명의 다수의 바람직한 실시예를 설명한다.
도 2는 전형적인 컴퓨터 그래픽 처리 시스템을 나타낸 것이다.
호스트 프로세서(1) 상에서 실행되는 게임 등의 어플리케이션(2)은 관련된 그래픽 처리 유닛(그래픽 처리 파이프라인)(3)에 의해 그래픽 처리 연산이 행해지도록 요구한다. 이것을 위해, 어플리케이션은, 호스트 프로세서(1) 상에서 실행되고 있는 그래픽 처리 파이프라인(3)에 대한 드라이버(4)에 의해 해석되어 그래픽 프로세서(3)에 적절한 명령들을 발생함으로써 어플리케이션에 의해 필요한 그래픽 출력을 생성하는 API(Application Programming Interface) 호출을 발생한다. 이것을 용이하게 하기 위해, 호스트 컴퓨터(1) 상에서 실행되는 어플리케이션(20으로부터의 명령에 응답하여 "명령들"의 세트가 그래픽 프로세서(3)에 주어져 그래픽 출력을 한다(예를 들어, 표시할 프레임을 생성한다).
도 3은 본 실시예의 그래픽 처리 파이프라인을 더욱 상세히 나타낸 것이다.
도 3에 도시된 그래픽 처리 파이프라인(3)은 타일 기반의 렌더러이며, 당업계에서 알려진 것과 같이, 생성할 출력 프레임 등의 렌더 출력 데이터 어레이의 타일들을 생성한다.
(타일 기반의 렌더링에서는, 중간 모드 렌더링에서와 같이 한번에 전체 렌더 출력, 예를 들면, 프레임이 효율적으로 처리되는 것 대신에, 렌더 출력, 예를 들어, 표시할 프레임이 보통 "타일"들로 불리는 복수의 더 작은 서브영역으로 분할된다. 각각의 타일(서브영역)은 별개로(일반적으로는 차례로) 렌더링되고, 그후 렌더링된 타일들(서브영역들)이 재결합되어 완전한 렌더 출력, 예를 들어 표시할 프레임을 제공한다. 이와 같은 구성에서는, 렌더 출력이 일반적으로 규칙적인 크기를 갖고 형상을 갖는 서브영역들(타일들)로 분할되지만((이것은 보통, 예를 들면 정사각형이나 직사각형이다), 이것은 필수적인 것은 아니다.)
렌더 출력 데이터 어레이는, 당업게에서 알려진 것과 같이, 보통 화면이나 프린터 등의 표시장치에 표시하도록 의도된 출력이지만, 예를 들어, ("렌더 투 텍스처" 출력으로도 알려진) 추후의 렌더링 패스(rendering pass)에서 사용하도록 의도된 중간 데이터를 포함해도 된다.
(컴퓨터 그래픽 이미지를 표시하고자 할 때, 이것은 보통 먼저 일련의 프리미티브들(폴리곤들)로 정의되고, 그후 이들 프리미티브가 차례로 그래픽 렌더링을 위한 그래픽 프래그먼트들로 분할(래스터화)된다. 정규의 그래픽 렌더링 연산 중에, 렌더러는 프래그먼트들이 올바르게 표시될 수 있도록 각각의 프래그먼트와 관련된 (예를 들면), 칼라(적, 녹 및 청, RGB) 및 투명도(알파, a) 데이터를 변형한다. 프래그먼트들이 완전히 렌더러를 가로지르면, 그들의 관련된 데이터 값들이 메모리에 기억되어, 예를 들어, 표시를 위해 출력할 준비가 된다.)
도 3은 본 발명의 연산과 관련되는 그래픽 처리 파이프라인(3)의 주 구성요소들과 파이프라인 스테이지들을 나타낸 것이다. 본 발명의 당업자에게 자명한 것과 같이, 도 3에 도시하지 않은 그래픽 처리 파이프라인의 다른 구성요소들이 존재한다. 또한, 도 3은 단지 개략도이며, 예들 들면, 실제로는 도시된 기능 유닛 및 파이프라인 스테이지들은, 도 3에서는 별개의 스테이지로 개략적으로 도시하였지만, 상당한 하드웨어 회로를 공유한다. 또한, 도 3에 도시된 그래픽 처리 파이프라인의 스테이지들, 구성요소들 및 유닛들 각각은 필요에 따라 구현될 수 있으며, 따라서 필요한 동작 및 기능을 행하기 위한, 예를 들면, 적절한 회로 및/또는 처리 로직을 구비한다.
도 3에 도시된 것과 같이, 그래픽 처리 파이프라인(3)은, 정점 셰이더(20), 헐 셰이더(hull shader)(21), 테셀레이터(22), 도메인 셰이더(23), 기하 셰이더(24), 래스터화 스테이지(25), 조기 Z(깊이) 및 스텐실 테스트 스테이지(26), 프래그먼트 셰이딩 스테이지의 형태를 갖는 렌더러(27), 후기 Z(깊이) 및 스텐실 테스트 스테이지(28), 블렌딩 스테이지(29), 타일 버퍼(30)와, 다운샘플링 및 기록(다중샘플 분해(multisample resolve)) 스테이지(31)를 구비한다.
정점 셰이더(20)는, 예를 들어, 발생할 출력을 위해 정의된 정점들과 관련된 입력 데이터 값들을 받고, 이들 데이터 값들을 처리하여 그래픽 처리 파이프라인(3)의 후속 스테이지들에 의해 사용되는 대응하는 "정점 셰이딩된" 출력 데이터 값들의 세트를 발생한다. 정점 셰이딩은, 예를 들어, 렌더링할 이미지 내부의 조명 효과를 고려하여 입력 데이터를 수정한다.
헐 셰이더(21)는 패치 제어점들의 세트에 대해 연산을 행하여 패치 상수로 알려진 추가 데이터를 발생하고, 테셀레이션 스테이지(22)는 기하를 분할하여 헐의 고차 표현을 생성하고, 도메인 셰이더(23)는 (정점 셰이더와 유사하게) 테셀레이션 스테이지에 의해 출력된 정점들에 대해 연산을 행하고, 기하 셰이더(24)는 삼각형, 점 또는 점 등의 전체 프리미티브를 처리한다. 이들 스테이지는 정점 셰이더(21)와 함께, 그래픽 처리 파이프라인(3)에 주어진 명령들 및 정점 데이터에 응답하여, 변형 및 조명 연산과, 렌더링할 프리미티브를 설정하는 프리미티브 설정 등의 모든 필요한 프래그먼트 프론트엔트 연산을 효율적으로 행한다.
그래픽 처리 파이프라인(3)의 래스터화 스테이지(25)는 렌더 출력(즉, 표시할 화상)을 이루는 프리미티브들을 처리를 위한 개별적인 그래픽 프래그먼트들로 래스터화하도록 동작한다. 이것을 행하기 위해, 래스터화기(25)는 렌더링용 그래픽 프리미티브들을 수신하고, 프리미티브들을 샘플링 포인트들로 래스터화하고, 프리미티브들을 렌더링하기 위한 적절한 위치들을 갖는(적절한 샘플링 위치들을 표시하는) 그래픽 프래그먼트들을 발생한다.
그후, 래스터화기에 의해 발생된 프래그먼트들은 처리를 위해 파이프라인의 나머지로 앞으로 보내진다.
조기 Z/스텐실 스테이지(26)는 래스터화기(25)로부터 수신한 프래그먼트들에 대해 Z(깊이) 테스트를 행하여, 이 단계에서 프래그먼트들을 폐기(도태(cull))할 수 있는지를 확인한다. 이것을 행하기 위해, 래스터화기(25)로부터 발행되는 프래그먼트의(와 관련된) 깊이값들을 이미 렌더링된 프래그먼트들의 데이터 값들(이들 데이터 값들은 버퍼(30)의 일부인 깊이(Z) 버퍼에 기억되어 있다)과 비교하여, 새로운 프래그먼트들이 이미 렌더링된 프래그먼트들에 의해 가로지르는지(또는 아닌지) 판정한다. 이와 동시에, 조기 스텐실 테스트를 행한다.
그후, 프래그먼트 조기 Z 및 스텐실 테스트 스테이지(26)를 통과한 프래그먼트들은 프래그먼트 셰이딩 스테이지(27)로 보내진다. 프래그먼트 셰이딩 스테이지(27)는 조기 Z 및 스텐실 테스트를 통과한 프래그먼트들에 대해 적절한 프래그먼트 처리 연산을 행하여, 프래그먼트들을 처리하여 적절한 렌더링된 프래그먼트 데이터를 생성한다.
이와 같은 프래그먼트 처리는, 프래그먼트들에 대해 프래그먼트 셰이더 프로그램을 실행하는 것, 프래그먼트들에 대해 텍스처를 적용하는 것, 프래그먼트들에 대해 포깅(fogging) 또는 기타 연산을 적용하는 것 등을 행하여, 적절한 프래그먼트 데이터를 생성하는 것과 같은, 적절한 원하는 프래그먼트 셰이딩 처리를 포함한다. 본 실시예에서, 프래그먼트 셰이딩 스테이지(27)는 셰이더 파이프라인(프로그래머블 프래그먼트 셰이더)의 형태를 갖는다.
그후에, 특히, 셰이딩된 프래그먼트들에 대해 파이프라인 깊이 테스트의 한쪽을 행하여 렌더링된 프래그먼트가 최종 이미지에서 실제로 보이게 되는지 여부를 판정하는 "후기" 프래그먼트 Z 및 스텐실 테스트 스테이지(28)가 존재한다. 이 깊이 테스트는 버퍼(30) 내부의 Z 버퍼에 기억된 프래그먼트의 위치에 대한 Z 버퍼 값을 이용하여, 당업계에 알려진 것과 같이, 프래그먼트 셰이딩 스테이지(27)에서 발행되는 프래그먼트들의(와 관련된) 데이터 값들을 (깊이 버퍼에 기억된) 이미 렌더링된 프래그먼트들의 깊이값들과 비교함으로써, 새로운 프래그먼트들에 대한 프래그먼트 데이터가 이미 렌더링된 프래그먼트들의 프래그먼트 데이터를 교체해야 하는지 판정한다. 또한, 이와 같은 후기 프래그먼트 깊이 및 스텐실 테스트 스테이지(28)는 프래그먼트들에 대한 필요한 "후기" 알파 및/또는 스텐실 테스트도 행한다.
그후 후기 프래그먼트 테스트 스테이지(29)를 통과한 프래그먼트들은, 필요에 따라, 블렌더(29)에서 타일 버퍼(30)에 이미 기억된 프래그먼트들과의 필요한 블렌딩 연산을 겪는다. 디더(미도시) 등의 프래그먼트들에 필요한 나머지 다른 연산도 이 스테이지에서 행해진다.
마지막으로, (블렌드된) 출력 프래그먼트 데이터(값들)가 타일 버퍼(30)에 기록되고, 이 타일 버퍼로부터 이들 데이터가 프레임 버퍼로 출력되어 표시될 수 있다. 출력 프래그먼트에 대한 깊이값도 타일 버퍼(30) 내부의 Z 버퍼에 적절히 기록된다. (타일 버퍼는 칼라와 이 버퍼가 표시하는 각각의 샘플링 포인트에 대해(본질적으로는 처리되고 잇는 타일의 각각의 샘플링 포인트에 대해) 적절한 칼라를 기억하는 깊이 버퍼, 즉 Z 버퍼를 기억한다), 이들 버퍼는 전체 렌더 출력(예를 들면, 표시할 이미지)의 일부9타일)을 표시하는 프래그먼트 데이터의 어레이를 기억하고, 버퍼들 내부의 샘플링 값들의 각각의 세트는 전체 렌더 출력의 각각의 픽셀들에 대응한다(예를 들어, 각각의 2x2 세트의 샘플값은 4x 다중샘플링이 사용되고 있는 출력 픽셀에 대응한다).
타일 버퍼는 그래픽 처리 파이프라인(칩) 위에 배치된(파이프라인에 대해 로컬인) RAM의 일부로서 주어진다.
타일 버퍼(30)로부터의 데이터는 다운샘플링(다중샘플 분해) 기록 유닛(31)에 입력되고, 여기에서 표시장치(미도시)의 프레임 버퍼 등의 외부 메모리 출력 버퍼에 출력된다(라이트백된다). (표시장치는, 예를 들어, 컴퓨터 모니터 또는 프린터 등의 픽셀들의 어레이를 포함하는 디스플레이를 구비한다.)
렌더 출력의 타일이 처리되고 그것의 데이터가 메인 메모리(예를 들면, 메인 메모리(미도시) 내부의 프레임 버퍼)로 출력되어 기억되면, 전체 렌더 출력(예를 들어, 표시할 프레임(이미지))을 발생하기 위해 충분한 타일들이 처리될 때까지 다음 타일이 처리된다. 그후, 다음의 렌더 출력(예를 들어, 프레임)에 대해 처리가 반복된다.
그래픽 처리 파이프라인(30)의 다른 구성도 물론 가능하다.
전술한 설명은 도 2에 도시된 그래픽 처리 시스템의 동작의 특정한 특징을 설명하고 있다. 이하, 본 발명의 실시예에 따른 도 1에 도시된 그래픽 처리 시스템의 동작의 추가적인 특징을 설명한다.
도 3에서 알 수 있는 것과 같이, 그래픽 처리 파이프라인(3)은 다수의 프로그래머블 처리 또는 "셰이더" 스테이지, 즉 정점 셰이더(20), 헐 셰이더(21), 도메인 셰이더(23), 기하 셰이더(24) 및 프래그먼트 셰이더(27)를 구비한다. 이들 프로그래머블 셰이더 스테이지들은 한 개 이상의 입력 변수들을 갖고 출력 변수들의 세트를 발생하고 어플리케이션에 의해 주어지는 각각의 셰이더 프로그램들을 실행한다.
이것을 위해, 어플리케이션은 GLSL, HLSL, OpenCL 등의 고급 셰이더 프로그래밍 언어를 사용하여 구현된 셰이더 프로그램들을 제공한다. 그후, 이들 셰이더 프로그램들은 셰이더 언어 컴파일러에 의해 타겟 그래픽 처리 파이프라인(3)에 대한 이진 코드로 번역된다. 이것은, 당업계에서 공지된 것과 같이, 컴파일러 내부에서의 프로그램의 한 개 이상의 중간 표현의 생성을 포함해도 된다. (컴파일러는 예를 들면 드라이버(4)의 일부이어도 되고, 컴파일러가 실행하게 하는 특수한 API 호출이 존재한다. 따라서, 컴파일러 시행은 어플리케이션에 의해 발생된 API 호출에 대한 응답으로 드라이버에 의해 행해진 묘화 호출 준비의 일부인 것으로 볼 수 있다.)
도 4는 이것을 나타낸 것으로, 셰이더 프로그램이 어플리케이션(2)에 의해 드라이버(4)에게 고급 셰이더 프로그래밍 언어(40)로 주어지고, 드라이버는 셰이더 프로그램을 그래픽 처리 파이프라인(3)을 위한 이진 코드(42)로 컴파일(41)하는 것을 나타내고 있다.
전술한 것과 같이, 그래픽 처리 파이프라인 내부의 각각의 셰이더는 발생할 그래픽 출력 내부의 각각의 그래픽 항목에 대해 작은 프로그램들을 실행하여 그래픽 처리를 행하는 처리 유닛이다(이와 관련하여 "항목"은 보통 정점, 프래그먼트 또는 픽셀이다). 본 실시예들은, 셰이더에 의해 실행할 실행 스레드들이(이때 각각의 스레드는 한 개의 그래픽 항목에 대응한다) 한번에 한 개의 명령씩 록스텝으로 실행될 스레드들의 "그룹" 또는 "번들"로 구성되는 상황에 관한 것이다.
이하, 특히 그래픽 처리 파이프라인의 프래그먼트 셰이더(27)의 동작을 참조하여 본 발명의 실시예들을 설명한다.
프래그먼트 셰이더(27)에서는, 처리할 각각의 샘플링 위치(또는 포인트)에 대해 실행되고 있는 프래그먼트 셰이딩 프로그램이 한번 실행되고, 한 개의 실행 스레드가 각각의 샘플링 위치에 대해 스폰(spawn)된다. 일반적으로, 샘플링 위치들(따라서 그들의 대응하는 실행 스레드들)은 복수의 샘플링 위치들(따라서, 스레드들)의 그룹으로 구성되고 처리된다. 본 실시예에서는, 샘플링 위치들이 2x2 "쿼드"로 구성되므로, 프래그먼트 셰이더 내부에서 "쿼드"의 샘플링 위치들 중에서 한 개와 각각 대응하는 4개의 스레드들을 포함하는 스레드 그룹들로서 처리된다. 그후, 특정한 샘플링 위치 쿼드를 표시하는 스레드들의 그룹은 프래그먼트 셰이더를 거쳐 한번에 한 개의 명령씩 록스텝으로 실행된다.
도 5는 프래그먼트 셰이더(27)에 의해 실행되고 잇는 스레드 그룹들이 프래그먼트 셰이더 프로그램의 실행중에 병합되는 본 발명의 제 1 실시예를 나타낸 것이다. 이것은, 프래그먼트 셰이더 프로그램의 일부에 대해 실행될 필요가 없는 스레드들이 불필요하게 실행 레인들 및 사이클들을 차지하지 않는다는 효과를 나타낸다.
도 5에 도시된 것과 같이, 렌더링할 (각각의) 프리미티브(50)를 (프리미티브(50)를 렌더 출력을 표시하는 샘플링 포인트들의 어레이(52)에 대해 테스트함으로써) 래스터화하여(51) 각각의 2x2 샘플링 위치 "쿼드들"에 대응하는 적절한 프래그먼트들(53)을 생성한다.
래스터화기(51)는, 프래그먼트들 내부의 모든 샘플링 위치들이 프리미티브(50)에 의해 커버되지는 않는(따라서, 프래그먼트 셰이더 내부의 대응하는 스레드 그룹의 모든 스레드들이 활성이 되지는 않는) 프리미티브에 대한 프래그먼트들의 쌍을 식별하도록 더 동작한다.
본 실시예에서는, 래스터화기는 중첩되지 않은 커버된 샘플링 위치들을 갖는(즉, 중첩되지 않는 활성 스레드들을 갖는 스레드 그룹들을 발생하는(즉, 활성 스레드들이 다른 스레드 그룹(워프) 레인들에 존재하는)) 프래그먼트들의 쌍들을 식별한다. (그러나, 필요한 경우에는, 병합되는 3개 이상의 프래그먼트들(스레드 그룹들(워프들))의 세트를 식별할 수도 있다).
래스터화기는, (예를 들어, 스레드 그룹이 수평으로 또는 수직으로 대응하는 2x2 쿼드를 플립함으로써) 스레드 그룹들에 대한 스레드 그룹 레인들에 대한 샘플링 위치들의 할당을 재매핑하여, 그들의 초기 구성에서 중첩하는 커버된 샘플링 위치들(활성 스레드들(레인들)을 갖는 프래그먼트들(스레드 그룹들)에 대한 중첩을 제거하여(제거하려고 시도하여), 필요에 따라, 이와 같은 스레드 그룹들이 그후 (잠재적으로) 병합되도록 하는 것이 가능하다.
그후, 래스터화기는, 프래그먼트들을 프래그먼트 셰이더에게 발행할 때, 병합될 수 있는 식별된 프래그먼트 쌍들(스레드 그룹들)을 프래그먼트 셰이더에게 신호로 보내어, 식별된(관련된) 스레드 그룹들이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 이벤트 지점에 도달할 때, 프래그먼트 셰이더가 이들 스레드 그룹들을 "병합" 후보들로서 식별할 수 있다.
(프래그먼트 셰이더에 발행될 프래그먼트가 래스터화기에 의해 다른 프래그먼트와 (잠재적으로) 병합이 불가능한 것으로 식별되는 경우에는, 이 프래그먼트가 병합이 불가능한 것으로 표시된다(한개의 스레드 그룹으로 처리된다).
도 5에는 각각의 샘플링 위치 쿼드들에 대응하는 2개의 예시적인 "병합가능한" 프래그먼트들(54, 55)이 도시되어 있다. 이들 프래그먼트들(쿼드들)(54, 55) 모두에 대해, 샘플링 위치들의 전체가 프리미티브(50)에 의해 커버되지는 않고(따라서, 프래그먼트들은 "드문드문(sparse)"하다), 프래그먼트들에 대해 커버된 샘플링 위치들이 중첩하지 않는다는 것을 알 수 있다.
프래그먼트들(54, 55)이 프래그먼트 셰이더(27)에 도달하면, 대응하는 실행 스레드들이 프래그먼트 셰이더(27)에 의해 실행되기 위해 스폰되어(56) 프래그먼트들(54, 55)을 처리한다. 도 5에 도시된 것과 같이, 프래그먼트 54의 경우에는, 3개의 활성("실제") 스레드들과 한 개의 비활성인 "헬퍼" 스레드를 포함하는 스레드 그룹(57)이 스폰된다. 이에 따라, 프래그먼트 55에 대해서는, 3개의 헬퍼 스레드들과 한 개의 활성 스레드를 포함하는 스레드 그룹(58)이 스폰된다.
그후, 프래그먼트 셰이딩 스테이지가 스레드 그룹들에 대해 프래그먼트 셰이더 프로그램을 실행한다.
먼저, 스레드 그룹들(57, 58)의 헬퍼 스레드들을 사용하는 프래그먼트 셰이더 프로그램의 첫 번째 부분이 실행된다(59). 프래그먼트 셰이더 프로그램의 이 부분은 텍스처 룩업 등의 스레드 그룹들 내부의 비활성(헬퍼) 스레드들에 대한 결과를 요구하는 프래그먼트 셰이더 프로그램 연산을 행한다.
그후, 프래그먼트 셰이더 프로그램 내부에, 스레드 그룹들(57, 58)의 활성 스레드들이 한 개의 결합된 스레드 그룹(61)으로 병합되도록 동작하는 병합 명령(60)이 존재한다.
이것을 행하기 위해, 병합할 스레드 그룹들(57, 58)의 쌍의 첫 번째 스레드 그룹이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 명령에 도달할 때, 그것이 병합할 나머지 스레드 그룹도 셰이더 프로그램 실행 내부의 스레드 그룹 병합 명령에 도달할 때까지, 이 스레드 그룹에 대한 셰이더 프로그램 실행이 정지된다. 그후, 스레드 그룹들(57, 58)의 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹(61)으로 스레드 그룹들(57, 58)이 병합된다.
각각의 스레드 그룹으로부터의 활성 스레드들을 병합된 한 개의 스레드 그룹(61)의 각각의 레인들에 매핑함으로써, 스레드 그룹들(57, 58)이 이들 스레드 그룹들 각각으로부터의 활성 스레드들을 포함하는 한 개의 스레드 그룹(61)으로 병합된다. 그후, 병합된 스레드 그룹은 한 개의 (활성) 프로그램 카운터를 갖는 한 개의 공유된 스레드 그룹(61)으로서 처리된다.
이와 같은 스레드 그룹 병합기 이후에, 병합된 스레드 그룹(61)에 대해 프래그먼트 셰이더 프로그램의 나머지 프로그램 단계들이 실행된다(62). 이와 같은 프래그먼트 셰이더 프로그램의 부분은, 스레드 그룹의 비활성(헬퍼) 스레드들에 대해 실행될 필요가 없는 산출 연산 등의 연산을 실행한다.
("병합 불가능" 스레드 그룹이 셰이더 프로그램 실행 내부의 스레드 그룹 병합 명령에 도달하면, 셰이더 그룹 병합 이벤트 명령이 무시되고(효과를 나타내지 않고), 프래그먼트 셰이더 프로그램이 단순히 단독으로 스레드 그룹에 대해 계속 실행된다.)
이것은 래스터화기(51)에 의해 발행되는 각각의 프래그먼트에 대해 반복된다.
도 5는 프래그먼트 셰이더 프로그램의 실행을 나타낸 것이다. 도 5에 도시된 연산을 용이하게 하기 위해, 프래그먼트 셰이더 프로그램이 데이터를 판독 및 기록하는 레지스터들이 도 6a 및 도 6b에 도시된 것과 같이 구성되어 도 5에 도시된 것과 같은 스레드 그룹들의 병합을 용이하게 한다. 도 6a는 스레드 그룹들이 병합되기 전의 레지스터 배치를 나타낸 것이고, 도 6b는 스레드 그룹들이 병합된 후의 레지스터 배치를 나타낸 것이다.
도 6a 및 도 6b에 나타낸 것과 같이, 프래그먼트 셰이더 프로그램에 의해 사용된 레지스터들은 2개의 서브셋, 즉 한 개의 스레드 그룹으로 병합될 스레드 그룹들의 쌍에 있는 스레드 그룹들에 의해 물리적으로 공유되는 "공통" 레지스터들의 세트(70)와, 쌍에 있는 각각의 그룹에 각각 배타적이고 병합하려는 스레드 그룹들의 쌍에 있는 다른 스레드 그룹이 액세스 불가능한 "전용" 레지스터들의 각각의 세트(71, 72)로 분할된다.
본 실시예에서는, 레지스터 색인 컷오프를 사용하여 "공통" 및 "전용" 서브셋들로의 레지스터들의 분할이 행해지는데, 컷오프 아래의 모든 레지스터들은 "공통" 레지스터이고 컷오프 위의 모든 레지스터들은 "전용" 레지스터이다.\ 레지스터 색인 컷오프는 컴파일러에 의해 명시된다. 필요한 경우에는, 레지스터들의 하드 코딩된 분할을 갖는 것이나, 또는 어떤 레지스터들이 어떤 서브셋에 속하는지를 표시하는 비트맵 등과 같이, 레지스터들을 "공통" 및 "전용" 서브셋들로 분할하기 위한 다른 구성이 사용되어도 되고 대신에 사용된다.
스레드 그룹에 대한 공통 및 전용 레지스터들은 다음과 같이 사용되고 처리된다.
먼저, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 명령(60) 전에는, 스레드 그룹이 이 스레드 그룹에 대한(즉, "실제"(활성) 및 "헬퍼"(비활성) 스레드들에 대한) 전용 레지스터들에 대해 그룹의 모든 스레드들(레인들)에 대한 판독 및 기록을 자유롭게 행할 수 있다.
따라서, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 명령 이전에는, 스레드 그룹이 그것의 활성 스레드들에 대한("실제"(활성) 스레드들을 포함하는 레인들에 대한) 스레드 그룹들의 세트에 대해 "공통" 레지스터들만을 기록할 수 있고, 스레드 그룹들은 "실제" 스레드들을 포함하는 그들의 레인들에 대해서는(스레드 그룹들의 활성 스레드들에 대해서는) 공통 레지스터들만을 판독할 수 있다.
스레드 그룹들이 병합된 후(병합 명령이 행해진 후), 병합되었던 스레드 그룹들에 대한 "전용" 레지스터들의 콘텐츠가 무효화되고(따라서, 병합되었던 스레드 그룹들에 대한 공통 레지스터들만이 유효한 값들을 갖는 것으로 생각되고), (도 6b에 도시된 것과 같이) 병합된 한 개의 스레드 그룹에 대해 새로운 세트의 전용 레지스터들이 할당된다. 본 실시예에서는, 스레드 그룹들 중의 한 개(57)의 전용 레지스터(71)를 한 개의 병합된 스레드 그룹(61)의 레지스터 공간 내부에 매핑함으로써 후자가 행해지지만, 필요한 경우에는 다른 구성도 가능하다.
스레드 그룹들(57, 58)에 대한 프래그먼트 셰이더 프로그램을 실행할 때, 비활성("헬퍼") 스레드들의 사용을 요구하는 연산은 셰이더 프로그램 실행 내부의 병합 이벤트 지점 앞에서 행해지고, 해당 스레드 그룹에 대한 전용 레지스터들을 사용한다.
따라서, 스레드 그룹 병합 이벤트에 걸쳐 보존할 필요가 있는(즉, 병합 이벤트 이후에 병합된 한 개의 스레드 그룹에 대해 사용가능하게 될 필요가 있는) 병합 이벤트 지점 앞의 데이터 항목은 (병합 이벤트 전의) 공통 레지스터(들)에 기억된다.
이것을 달성하기 위해 프래그먼트 셰이더 프로그램 연산(코드)은 프래그먼트 셰이더 프로그램 코드를 컴파일하는 컴파일러에 의해 구성된다. 컴파일러는, 프래그먼트 셰이더 프로그램을 컴파일할 때 프래그먼트 셰이더 프로그램 내부의 적절한 지점에 병합 명령(60)을 더 포함한다. 도 7은 이와 관련된 컴파일러의 연산을 예시한 것이다.
도 7에 도시된 것과 같이, 컴파일러는, 고급 소스 언어로 된 프래그먼트 셰이더 프로그램을 수신하고(80), 파싱(parse)하고(81), 이 프로그램을 처리한다(82). 그후, 이 컴파일러는 비활성(헬퍼) 스레드들을 사용하는 프로그램 연산들을 식별하고(83) 활성 스레드들만을 필요로 하는 프로그램 연산을 식별하고(84), 컴파일된 프래그먼트 셰이더 프로그램 내에서 이들 연산들을 적절히 그룹화한다(비활성(헬퍼) 스레드들을 사용하는 프로그램 연산들은 활성 스레드들만을 요구하는 프로그램 연산들의 앞에 위치한다).
그후, 컴파일러는 프래그먼트 셰이더 프로그램 내부의 적절한 지점에(즉, 프래그먼트 셰이더 프로그램 내부의 비활성(헬퍼 스레드들)의 사용을 요구하는 모든 연산 뒤와 활성 스레드들만을 요구하는 프로그램 연산들 앞에) 스레드 그룹 병합 명령을 삽입한다.
그후, 이와 같이 배치된 프래그먼트 셰이더 프로그램은 그래픽 처리 파이프라인에 대한 적절한 이진 코드(87)로 인코딩되고(86), 그래픽 처리 파이프라인으로 전송되어 실행된다.
본 실시예에서는, 스레드 그룹 병합 이벤트가 프래그먼트 셰이더 프로그램 내부의 명령으로서 또는 명령의 일부로서 프래그먼트 셰이더 프로그램 내부에 설치된다. 그러나, 프래그먼트 셰이더 프로그램 내부의 명령의 변형자를 사용하여 스레드 그룹 병합 이벤트를 표시하는 것, 또는 프로그램 셰이더 프로그램 코드 그 자체로부터 분리되어 명기된 컷오프 지점 등과 같이, 다른 구성도 가능하다.
도 8 내지 도 10은 프래그먼트 셰이더 프로그램 실행중에 스레드 그룹들이 복수의 별개의 스레드 그룹들로 분할되는(병합 해제되는) 본 발명의 제 2 실시예를 나타낸 것이다.
이것은, 발생할 렌더 출력 내부의 각각의 샘플링 위치에 대해 복수의(예를 들면, 4개)의 샘플링 포인트가 처리되지만, 행할 필요가 있는 샘플링 포인트당 계산이 존재하여, 주어진 샘플링 위치에 대한 각각의 샘플링 포인트에 대해 동일하게 행할 필요가 있는 일부 계산이 존재할 수 있는, 샘플링 주파수 셰이딩 등의 그래픽 처리 연산에서 유용할 수 있다.
도 8은 프래그먼트 셰이더 프로그램의 실행중에 프래그먼트 셰이더(27)에 의해 실행되고 잇는 스레드 그룹들이 분할되는(병합 해제되는) 본 발명의 제 2 실시예에서의 연산을 개략적으로 나타낸 것이다.
도 8에 도시한 것과 같이, 렌더링할 (각각의) 프리미티브가 (렌더 출력을 표시하는 샘플링 포인트들(52)의 어레이에 대해 프리미티브(50)를 테스트함으로써) 마찬가지로 래스터화하여(52) 각각의 2x2 샘플링 위치 "쿼드"에 대응하는 적절한 프래그먼트들(53)을 생성한다.
그러나, 도 8에 도시된 것과 같이, 이 경우에는, 렌더 출력의 각각의 샘플링 위치가 그것과 관련된(프래그먼트 셰이더에 의해 처리될) 2개의 샘플링 포인트(90)를 갖는다.
래스터화기는, 어레이(52)의 이들 샘플링 위치들과, 프리미티브(50)에 의해 커버되는 각각의 샘플링 위치에 대한 각각의 샘플링 포인트들을 식별하고, 커버된 샘플링 포인트를 포함하는 각각의 2x2 샘플링 위치에 대한 프래그먼트를 생성한다.
도 8에는 부분적으로 커버된 샘플링 위치 쿼드에 대응하는 예시적인 프래그먼트(91)가 도시되어 있다.
프래그먼트(91)가 프래그먼트 셰이더(27)에 도달하면, 대응하는 실행 스레드들이 플래그먼트 셰이더(27)에 의한 실행을 위해 스폰되어(56) 프래그먼트(91)가 표시하는 샘플링 위치들을 처리한다. 도 8에 도시된 것과 같이, 프래그먼트(91)의 경우에는, 프래그먼트(91)가 표시하는 샘플링 위치에 대응하여, 3개의 활성("실제") 스레드들과 한 개의 비활성 "헬퍼" 스레드를 포함하는 스레드 그룹(92)이 스폰된다.
그후, 프래그먼트 셰이딩 스테이지는 스레드 그룹(92)에 대한 프래그먼트 셰이더 프로그램을 실행한다.
먼저, 샘플링 위치당 계산(즉, 샘플링 위치로 표시된 렌더 출력 영역 내부의 위치에 의존하지 않는 계산)을 행하는 프래그먼트 셰이더 프로그램의 제 1 부분이 실행된다(93).
그후. 프래그먼트(91)(따라서 스레드 그룹(92)이 표시하는 샘플링 위치들에 대한 샘플링 포인트들의 한 개의 세트를 각각 표시하는 2개의 분리된 스레드 그룹(95, 96)으로 스레드 그룹(92)을 분할하도록 동작하는 분할 명령(94)이 프래그먼트 셰이더 프로그램 내부에 존재한다.
이와 같은 스레드 그룹 분할 이후에, 두 개의 스레드 그룹들(95, 96)에 대해 프래그먼트 셰이더 프로그램의 나머지 프로그램 단계들이 실행된다(97). 프래그먼트 셰이더 프로그램의 이 부분은 샘플링 포인트당 계산(즉, 고려되고 잇는 샘플링 위치로 표시되는 렌더 출력 영역 내부의 위치(포인트)에 의존하는 계산)을 행하는 연산을 실행한다.
래스터화기(51)에 의해 발행되는 각각의 프래그먼트에 대해 이것을 반복한다.
이때, 이와 관련하여, 도 8에 도시된 스레드 그룹들 92, 95 및 96은 (쿼드의 샘프링 위치들과 이에 대응하는 샘플링 포인트의 어떤 것이 프리미티브(50)에 의해 커버되는지에 따라) 활성 및 비활성 스레드들을 모두 포함하지만, 본 실시예에서는, 각각의 스레드 그룹(즉, 초기의 한 개의 스레드 그룹과 스레드 그룹 분할 이벤트 후의 복수의 분리된 스레드 그룹들 모두)이 활성 스레드들을 완전히 포함하는 경우에 있을 수 있다(실제로 보통 이와 같은 경우에 해당한다)는 점에 주목하기 바란다(즉, 모든 스레드 그룹(워프) 레인들이 항상 활성이 된다).
도 8은 본 실시예에서의 프래그먼트 셰이더 프로그램의 실행을 나타낸 것이다. 도 8에 도시된 연산을 용이하게 하기 위해, 프래그먼트 셰이더 프로그램이 데이터를 판독 및 기록하는 레지스터들은 도 8에 도시된 것과 같은 스레드 그룹들의 분할을 용이하게 하기 위해 도 9a 및 도 9b에 도시된 것과 같이 배치된다. 도 9a는 스레드 그룹이 분할되기 전의 레지스터 배치를 나타낸 것이고, 도 9b는 스레드 그룹이 분할된 후의 레지스터 배치를 나타낸 것이다.
도 9a 및 도 9b에 도시된 것과 같이, 프래그먼트 셰이더 프로그램에 의해 사용된 레지스터들은 마찬가지로 2개의 서브셋, 즉 (스레드 그룹이 분할된 전후 모두에) 스레드 그룹에 의해 물리적으로 공유되는 "공통" 레지스터들의 세트(70)와, 각각의 스레드 그룹에 대해 각각 배타적이고 분할된 스레드 그룹들의 쌍에 있는 다른 스레드 그룹이 액세스 불가능한 "전용" 레지스터들의 각각의 세트(71, 72)로 분할된다. 이들 레지스터들은 셰이더 프로그램 실행의 개시시에 스레드 그룹들에 의해 사용하기 위해 할당(예약)된다.
본 실시예에서는, 셰이더 프로그램 실행 내주의 스레드 그룹 분할 지점(94) 앞에서, 초기의 "한개의" 스레드 그룹(92)은 그것의 샘플링 위치당 계산을 위해 스레드 드룹들에 대한 공통 레지스터들(70)을 사용한다(따라서, 스레드 그룹들에 대한 공통 레지스터들에 대해 그룹의 모든 스레드들(레인들)에 대해 판독 및 기록 모두를 자유롭게 할 수 있다).
그후, 초기의 한 개의 스레드 그룹(92)이 분할된 후(분할 이벤트(94)가 행해진 후), 스레드 그룹들에 대한 공통 레지스터들(70)이 판독 전용 레지스터(들)로 취급되고(이에 따라 계산된 샘플링 위치당 값들을 보존하고), 스레드 그룹 분할 이벤트(94) 후에 행해진 계산이 해당 스레드 그룹(95, 96)에 대한 전용 레지스터들(71, 72)을 사용한다.
이것을 달성하기 위해, 프래그먼트 셰이더 프로그램 연산(코드)이 마찬가지로 프래그먼트 셰이더 프로그램 코드를 컴파일하는 컴파일러로 구성된다. 또한, 컴파일러는 프래그먼트 셰이더 프로그램을 컴파일할 때 프래그먼트 셰이더 프로그램 내부의 적절한 지점에 분할 명령(94)을 더 포함한다. 도 10은 이와 관련한 컴파일러의 동작을 나타낸 것이다.
도 10에 도시된 것과 같이, 컴파일러는 고급 소스 언어(80)로 된 프래그먼트 셰이더 프로그램을 수신하고, 파싱하고(81), 이 프로그램을 처리한다(82). 그후, 컴파일러는 프래그먼트 셰이더 프로그램 실행 내부의 어떤 지점에서의 스레드 그룹 분할 이벤트가 가능한지 판정하고, 가능한 경우에는, "샘플링 위치당"에 해당하는 프로그램 연산들을 식별하고(110), "샘플링 포인트당"에 해당하는 프로그램 연산들을 식별하고(111), 이들 연산을 컴파일된 프래그먼트 셰이더 프로그램 내부에서 적절히 그룹화한다("샘플링당 위치"에 해당하는 프로그램 연산들(110)은 (샘플링 위치 내에서) "샘플링당 포인트"에 해당하는 프로그램 연산들(111) 앞에 놓인다).
그후, 컴파일러는 프래그먼트 셰이더 프로그램 내부의 적절한 지점에(즉, "샘플링당 위치"에 해당하는 모든 연산(110) 뒤와 (샘플링 위치 내부의) "샘플링당 포인트"에 해당하는 프로그램 연산의 앞에) 스레드 그룹 분할 명령을 삽입한다(112).
그후, 이와 같이 배치된 프래그먼트 셰이더 프로그램이 그래픽 처리 파이프라인을 위해 적절한 이진 코드(87)로 인코딩되어(86), 그래픽 처리 파이프라인으로 전송되어 실행된다.
본 실시예에서는, 스레드 그룹 분할 이벤트가 프래그먼트 셰이더 프로그램 내부의 명령으로서 또는 명령의 일부로서 프래그먼트 셰이더 프로그램 내부에 마찬가지로 설치된다. 그러나, 프래그먼트 셰이더 프로그램 내부의 명령의 변형자를 사용하여 스레드 그룹 분할 이벤트를 표시하는 것, 또는 프로그램 셰이더 프로그램 코드 그 자체로부터 분리되어 명기된 컷오프 지점 등과 같이, 다른 구성도 가능하다. 또한, 필요한 경우에는 전술한 2개의 실시예를 조합하는 것도 가능한데, 즉 실행 중에 병합 및 분할 지점 모두를 포함하는 프래그먼트 셰이더 프로그램을 갖는 것도 가능하며, 이때 프래그먼트 셰이더 프로그램이 실행하고자 하는 연산이 이것을 용이하게 한다.
전술한 내용으로부터, 본 발명은, 적어도 그것의 바람직한 실시예에서, 그래픽 처리 시스템에서 셰이더 프로그램을 실행하는 더욱 효율적인 메카니즘을 제공한다. 이것은, 적어도 본 발명의 바람직한 실시예에서는, 셰이더 프로그램을 실행하고 있는 스레드 그룹들을 병합 및/또는 분할할 수 있는 기회를 식별하고 포함시킴으로써 달성되어 셰이더 프로그램의 더욱 효율적인 실행을 촉진시킨다.

Claims (21)

  1. 명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인의 작동방법으로서,
    그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
    상기 작동방법은,
    셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않는 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시와 함께, 렌더 출력을 발생하는 셰이더 프로그램을 셰이더 스테이지에게 발행하는 단계와,
    그래픽 처리 파이프라인에 의해, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 셰이딩 스테이지에 의해 처리할 2개 이상의 스레드 그룹의 세트를 식별하는 단계와,
    셰이딩 스테이지에 의해, 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계를 포함하고,
    상기 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하는 단계는,
    식별된 스레드 그룹이 스레드 그룹 병합 이벤트 표시에 도달하였을 때, 스레드 그룹들을 각각의 스레드 그룹들부터 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 병합하는 단계와,
    병합된 스레드 그룹에 대한 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 단계를 포함하는, 그래픽 처리 파이프라인의 작동방법.
  2. 제 1항에 있어서,
    셰이더 스테이지에 의해 실행할 셰이더 프로그램을 위해, 그래픽 처리 파이프파인에 대한 셰이더 컴파일러를 구비하고,
    비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하는 단계와,
    비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하는 단계를 포함하는 그래픽 처리 파이프라인의 작동방법.
  3. 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 방법으로서,
    그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
    상기 방법은,
    셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
    비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하는 단계와,
    비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하는 단계를 포함하는, 컴파일 방법.
  4. 제 1항 또는 제 2항에 있어서,
    컴파일러가, 비활성 스레드들에 대한 결과를 요구하는 셰이더 프로그램 연산들을 스레드 그룹 병합 이벤트 지점 앞에 배치하고, 스레드 그룹 내부의 비활성 스레드들에 대해 실행될 필요가 없는 셰이더 프로그램 연산들을 셰이더 프로그램 실행의 스레드 그룹 병합 이벤트 지점 뒤에 배치하는 그래픽 처리 파이프라인의 작동방법.
  5. 제 1항 또는 제 2항에 있어서,
    중첩하지 않는 활성 스레드들을 갖는 스레드 그룹들은 한 개의 스레드 그룹으로 병합될 수 있는 스레드 그룹들로서 식별되는 그래픽 처리 파이프라인의 작동방법.
  6. 제 1항 또는 제 2항에 있어서,
    스레드 그룹들에 대한 스레드 그룹 레인들에 대한 샘플링 위치들의 할당을 재매핑하여, 스레드 그룹들이 그후 병합될 수 있도록 하는 단계를 더 포함하는 그래픽 처리 파이프라인의 작동방법.
  7. 제 1항 또는 제 2항에 있어서,
    스레드 그룹들에 대한 셰이더 프로그램의 실행 중에 사용하기 위해, 셰이더 프로그램을 실행시에 한 개의 스레드 그룹으로 병합될 스레드 그룹들의 세트에 대해, 한 개의 스레드 그룹으로 병합될 스레드 그룹들의 세트 내부의 스레드 그룹들에 의해 물리적으로 공유되는 공통 레지스터들의 세트와, 세트 내부의 각각의 스레드 그룹에 대해 각각 배타적이고 병합될 스레드 그룹들의 세트 내부의 다른 스레드 그룹 또는 스레드 그룹들이 액세스 불가능한 레지스터들의 세트인 전용 레지스터들의 세트를 제공하는 단계를 더 포함하는 그래픽 처리 파이프라인의 작동방법.
  8. 제 7항에 있어서,
    스레드 그룹들이, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점 앞에서, 그들의 각각의 활성 스레드들만에 대한 스레드 그룹들의 세트에 대한 공통 레지스터들에 기록하는 단계를 더 포함하는 그래픽 처리 파이프라인의 작동방법.
  9. 제 7항에 있어서,
    셰이더 프로그램 실행 내부의 병합 이벤트 지점 앞의 활성 스레드들의 이용을 요구하는 셰이더 프로그램 연산들을 행하는 단계와, 해당 스레드 그룹에 대해 전용 레지스터들을 사용하는 단계를 더 포함하는 그래픽 처리 파이프라인의 작동방법..
  10. 제 7항에 있어서,
    스레드 그룹 병합 이벤트에 걸쳐 보존될 필요가 있는 스레드 그룹 병합 이벤트 지점 앞에서부터의 데이터 항목을 스레드 그룹들의 세트에 대한 공통 레지스터들에 기억하는 단계를 더 포함하는 그래픽 처리 파이프라인의 작동방법.
  11. 데이터 처리 시스템으로서,
    명령들을 실행하여 셰이딩 연산을 행하는 프로그래머블 셰이딩 스테이지를 포함하는 그래픽 처리 파이프라인을 구비하고,
    그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
    상기 데이터 처리 시스템은,
    셰이딩 스테이지에 대한 프로그램들을 컴파일하여 셰이더 스테이지에 의해 실행하기 위한 명령들을 발생하는 컴파일러를 더 구비하고,
    상기 컴파일러는, 셰이더 스테이지에 의해 실행되어 실행 스레드들을 처리하여, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않는 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시와 함께, 렌더 출력을 발생하는 셰이더 프로그램을 셰이더 스테이지에게 발행하도록 구성되고,
    상기 그래픽 처리 파이프라인은, 스레드 그룹 내부의 모든 스레드들이 활성이 되지는 않으며 한 개의 스레드 그룹으로 병합되는 셰이딩 스테이지에 의해 처리할 2개 이상의 스레드 그룹의 각각의 세트들을 식별하도록 구성되고,
    상기 셰이딩 스테이지는, 식별된 스레드 그룹에 대한 셰이더 프로그램을 실행하도록 구성되고,
    상기 식별된 스레드 그룹에 대한 셰이더 프로그램의 실행은,
    병합가능한 스레드 그룹들의 각각의 식별된 세트의 스레드 그룹들이 스레드 그룹 병합 이벤트 표시에 도달하였을 때, 스레드 그룹들을 각각의 스레드 그룹들로부터 활성 스레드들을 포함하는 한 개의 스레드 그룹으로 병합하는 것과,
    병합된 스레드 그룹에 대한 병합 이벤트 표시 지점 이후의 셰이더 프로그램 내부의 추가적인 명령들을 실행하는 것을 포함하는, 데이터 처리 시스템.
  12. 제 11항에 있어서,
    컴파일러는,
    비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하고,
    비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하도록 구성된 데이터 처리 시스템.
  13. 프로그램을 컴파일하여, 명령을 실행하여 셰이딩 연산을 행하는 그래픽 처리 파이프라인의 셰이딩 스테이지에 대한 명령들을 생성하는 컴파일러로서,
    그룹의 스레드들이 한번에 한 개의 명령씩 록스텝으로 실행되는 스레드 그룹들로 실행 스레드들이 그룹화되고,
    상기 컴파일러는, 셰이더 스테이지에 의해 실행될 셰이더 프로그램에 대해,
    비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램의 실행 내부에 지점이 존재하는지 여부를 판정하고,
    비활성 스레드들을 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점이 존재하는 것으로 판정되는 경우에, 비활성 스레드들을 각각 갖는 2개 이상의 스레드 그룹들이 병합되는 셰이더 프로그램 실행 내부의 지점을 표시하는 스레드 그룹 병합 이벤트 표시를 셰이더 프로그램에 포함시키거나 셰이더 프로그램을 설치하도록 구성된 컴파일러.
  14. 제 11항 또는 제 12항에 있어서,
    상기 컴파일러는, 비활성 스레드들에 대한 결과를 요구하는 셰이더 프로그램 연산들을 스레드 그룹 병합 이벤트 지점 앞에 배치하고, 스레드 그룹 내부의 비활성 스레드들에 대해 실행될 필요가 없는 셰이더 프로그램 연산들을 셰이더 프로그램 실행의 스레드 그룹 병합 이벤트 지점 뒤에 배치하는 데이터 처리 시스템.
  15. 제 11항 또는 제 12항에 있어서,
    중첩하지 않는 활성 스레드들을 갖는 스레드 그룹들은 한 개의 스레드 그룹으로 병합될 수 있는 스레드 그룹들로서 식별되는 데이터 처리 시스템.
  16. 제 11항 또는 제 12항에 있어서,
    그래픽 처리 파이프라인은, 스레드 그룹들에 대한 스레드 그룹 레인들에 대한 샘플링 위치들의 할당을 재매핑하여, 스레드 그룹들이 그후 병합될 수 있도록 할 수 있는 데이터 처리 시스템.
  17. 제 11항 또는 제 12항에 있어서,
    스레드 그룹들에 대한 셰이더 프로그램의 실행 중에 사용하기 위해, 셰이더 프로그램을 실행시에 한 개의 스레드 그룹으로 병합될 스레드 그룹들의 세트에 대해, 한 개의 스레드 그룹으로 병합될 스레드 그룹들의 세트 내부의 스레드 그룹들에 의해 물리적으로 공유되는 공통 레지스터들의 세트와, 세트 내부의 각각의 스레드 그룹에 대해 각각 배타적이고 병합될 스레드 그룹들의 세트 내부의 다른 스레드 그룹 또는 스레드 그룹들이 액세스 불가능한 레지스터들의 세트인 전용 레지스터들의 세트를 더 포함하는 데이터 처리 시스템.
  18. 제 17항에 있어서,
    셰이딩 스테이지는, 스레드 그룹들에 대해, 셰이더 프로그램 실행 내부의 스레드 그룹 병합 지점 앞에서, 그들의 각각의 활성 스레드들만에 대한 스레드 그룹들의 세트에 대한 공통 레지스터들에 기록하도록 구성된 데이터 처리 시스템.
  19. 제 17항에 있어서,
    셰이딩 스테이지는, 셰이더 프로그램 실행 내부의 병합 이벤트 지점 앞의 활성 스레드들의 이용을 요구하는 셰이더 프로그램 연산들을 행하고, 해당 스레드 그룹에 대해 전용 레지스터들을 사용하도록 구성된 데이터 처리 시스템.
  20. 제 17항에 있어서,
    셰이딩 스테이지는, 스레드 그룹 병합 이벤트에 걸쳐 보존될 필요가 있는 스레드 그룹 병합 이벤트 지점 앞에서부터의 데이터 항목을 스레드 그룹들의 세트에 대한 공통 레지스터들에 기억하도록 구성된 데이터 처리 시스템.
  21. 프로그램이 데이터 처리수단 위에서 실행될 때, 청구항 1 또는 2에 기재된 방법을 행하기 위한 컴퓨터 소프트웨어 코드를 포함하는, 매체에 기억된 컴퓨터 프로그램.
KR1020160096554A 2015-07-30 2016-07-29 그래픽 처리 시스템 KR102595713B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB1513425.7 2015-07-30
GB1513425.7A GB2540937B (en) 2015-07-30 2015-07-30 Graphics processing systems

Publications (2)

Publication Number Publication Date
KR20170015232A true KR20170015232A (ko) 2017-02-08
KR102595713B1 KR102595713B1 (ko) 2023-10-31

Family

ID=54062892

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020160096554A KR102595713B1 (ko) 2015-07-30 2016-07-29 그래픽 처리 시스템

Country Status (4)

Country Link
US (1) US10152763B2 (ko)
KR (1) KR102595713B1 (ko)
CN (1) CN106408505B (ko)
GB (1) GB2540937B (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11036559B2 (en) 2018-11-06 2021-06-15 Samsung Electronics Co., Ltd. Graphics processor and graphics processing method based on subdivided states

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10460513B2 (en) 2016-09-22 2019-10-29 Advanced Micro Devices, Inc. Combined world-space pipeline shader stages
US10310856B2 (en) 2016-11-09 2019-06-04 Arm Limited Disabling thread execution when executing instructions in a data processing system
US10719902B2 (en) * 2017-04-17 2020-07-21 Intel Corporation Thread serialization, distributed parallel programming, and runtime extensions of parallel computing platform
US11557017B2 (en) * 2017-05-18 2023-01-17 Google Llc Parallelized pipeline for vector graphics and image processing
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
GB2566761B (en) * 2017-09-20 2020-01-22 Advanced Risc Mach Ltd Discarding of threads processed by a warp processing unit
DE102019101720A1 (de) * 2018-01-26 2019-08-01 Nvidia Corporation Techniken zur Darstellung und Verarbeitung von Geometrie innerhalb einer erweiterten Grafikverarbeitungspipeline
US10636112B2 (en) * 2018-03-28 2020-04-28 Intel Corporation Graphics processor register data re-use mechanism
GB2575689B (en) * 2018-07-20 2021-04-28 Advanced Risc Mach Ltd Using textures in graphics processing systems
US10698689B2 (en) 2018-09-01 2020-06-30 Intel Corporation Recompiling GPU code based on spill/fill instructions and number of stall cycles
GB2579114B (en) * 2019-05-31 2021-04-21 Imagination Tech Ltd Controlling rendering operations
US10983794B2 (en) 2019-06-17 2021-04-20 Intel Corporation Register sharing mechanism
US11294672B2 (en) 2019-08-22 2022-04-05 Apple Inc. Routing circuitry for permutation of single-instruction multiple-data operands
US11126439B2 (en) * 2019-11-15 2021-09-21 Apple Inc. SIMD operand permutation with selection from among multiple registers
US11798218B2 (en) 2020-08-03 2023-10-24 Samsung Electronics Co., Ltd. Methods and apparatus for pixel packing
US11748933B2 (en) * 2020-08-03 2023-09-05 Samsung Electronics Co., Ltd. Method for performing shader occupancy for small primitives
US11508111B1 (en) * 2021-04-19 2022-11-22 Meta Platforms Technologies, Llc Augmented reality shader programs

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070143582A1 (en) * 2005-12-16 2007-06-21 Nvidia Corporation System and method for grouping execution threads
KR20150030274A (ko) * 2012-09-28 2015-03-19 인텔 코포레이션 사용자-레벨 스레딩을 위한 즉각적 컨텍스트 전환을 가능하게 하는 새로운 명령어 및 고효율적인 마이크로-아키텍처
US20150095914A1 (en) * 2013-10-01 2015-04-02 Qualcomm Incorporated Gpu divergence barrier
KR20150066573A (ko) * 2012-12-21 2015-06-16 인텔 코포레이션 멀티스레딩 컴퓨터 시스템에서의 고성능 및 공정성을 제공하기 위한 메커니즘

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5353418A (en) * 1989-05-26 1994-10-04 Massachusetts Institute Of Technology System storing thread descriptor identifying one of plural threads of computation in storage only when all data for operating on thread is ready and independently of resultant imperative processing of thread
US20030172190A1 (en) * 2001-07-02 2003-09-11 Globespanvirata Incorporated Communications system using rings architecture
GB0226874D0 (en) * 2002-11-18 2002-12-24 Advanced Risc Mach Ltd Switching between secure and non-secure processing modes
KR100941104B1 (ko) * 2002-11-18 2010-02-10 에이알엠 리미티드 데이터 처리 장치, 데이터 처리 방법 및 컴퓨터 프로그램을 기억한 컴퓨터 판독가능한 기억매체
US7836276B2 (en) * 2005-12-02 2010-11-16 Nvidia Corporation System and method for processing thread groups in a SIMD architecture
US8700877B2 (en) * 2009-09-25 2014-04-15 Nvidia Corporation Address mapping for a parallel thread processor
US8732713B2 (en) * 2010-09-29 2014-05-20 Nvidia Corporation Thread group scheduler for computing on a parallel thread processor
US8499305B2 (en) * 2010-10-15 2013-07-30 Via Technologies, Inc. Systems and methods for performing multi-program general purpose shader kickoff
US9830156B2 (en) * 2011-08-12 2017-11-28 Nvidia Corporation Temporal SIMT execution optimization through elimination of redundant operations
US9329877B2 (en) * 2012-03-18 2016-05-03 Microsoft Technology Licensing, Llc Static verification of parallel program code
US8982124B2 (en) * 2012-09-29 2015-03-17 Intel Corporation Load balancing and merging of tessellation thread workloads
US9747107B2 (en) * 2012-11-05 2017-08-29 Nvidia Corporation System and method for compiling or runtime executing a fork-join data parallel program with function calls on a single-instruction-multiple-thread processor
US20140143755A1 (en) * 2012-11-20 2014-05-22 Nvidia Corporation System and method for inserting synchronization statements into a program file to mitigate race conditions
US20140257769A1 (en) * 2013-03-06 2014-09-11 Nvidia Corporation Parallel algorithm for molecular dynamics simulation
KR102102166B1 (ko) * 2013-04-22 2020-04-21 삼성전자 주식회사 심드 구조 기반의 쓰레드 분기 관리 장치 및 방법
KR20150019349A (ko) * 2013-08-13 2015-02-25 삼성전자주식회사 다중 쓰레드 실행 프로세서 및 이의 동작 방법
US9665958B2 (en) * 2013-08-26 2017-05-30 Nvidia Corporation System, method, and computer program product for redistributing a multi-sample processing workload between threads
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 (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070143582A1 (en) * 2005-12-16 2007-06-21 Nvidia Corporation System and method for grouping execution threads
KR20150030274A (ko) * 2012-09-28 2015-03-19 인텔 코포레이션 사용자-레벨 스레딩을 위한 즉각적 컨텍스트 전환을 가능하게 하는 새로운 명령어 및 고효율적인 마이크로-아키텍처
KR20150066573A (ko) * 2012-12-21 2015-06-16 인텔 코포레이션 멀티스레딩 컴퓨터 시스템에서의 고성능 및 공정성을 제공하기 위한 메커니즘
US20150095914A1 (en) * 2013-10-01 2015-04-02 Qualcomm Incorporated Gpu divergence barrier

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11036559B2 (en) 2018-11-06 2021-06-15 Samsung Electronics Co., Ltd. Graphics processor and graphics processing method based on subdivided states

Also Published As

Publication number Publication date
CN106408505B (zh) 2021-09-10
US20170032488A1 (en) 2017-02-02
GB201513425D0 (en) 2015-09-16
KR102595713B1 (ko) 2023-10-31
GB2540937B (en) 2019-04-03
GB2540937A (en) 2017-02-08
CN106408505A (zh) 2017-02-15
US10152763B2 (en) 2018-12-11

Similar Documents

Publication Publication Date Title
KR102595713B1 (ko) 그래픽 처리 시스템
CN105321199B (zh) 图形处理流水线及其操作方法与介质
JP6403436B2 (ja) データ処理システム
JP5053857B2 (ja) 3次元グラフィックス処理装置および方法
US9256466B2 (en) Data processing systems
US9535700B2 (en) Data processing systems
CN106373083B (zh) 图形处理
KR102641210B1 (ko) 데이터 처리 시스템
US10922086B2 (en) Reduction operations in data processors that include a plurality of execution lanes operable to execute programs for threads of a thread group in parallel
US10839600B2 (en) Graphics processing systems
US10943385B2 (en) Using textures in graphics processing systems
US20170032489A1 (en) Graphics processing systems
CN107851027B (zh) 图形处理单元的可编程执行单元、数据处理系统、操作方法
US10606595B2 (en) Data processing systems
US10310856B2 (en) Disabling thread execution when executing instructions in a data processing system
US10115222B2 (en) Data processing systems
US11972503B2 (en) Graphics processing
CN118052692A (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
GRNT Written decision to grant