KR101707289B1 - 그래픽 병렬 처리 유닛에 대한 버퍼 관리 - Google Patents
그래픽 병렬 처리 유닛에 대한 버퍼 관리 Download PDFInfo
- Publication number
- KR101707289B1 KR101707289B1 KR1020147023719A KR20147023719A KR101707289B1 KR 101707289 B1 KR101707289 B1 KR 101707289B1 KR 1020147023719 A KR1020147023719 A KR 1020147023719A KR 20147023719 A KR20147023719 A KR 20147023719A KR 101707289 B1 KR101707289 B1 KR 101707289B1
- Authority
- KR
- South Korea
- Prior art keywords
- thread
- buffer
- data
- programmable computing
- executing
- Prior art date
Links
- 239000000872 buffer Substances 0.000 title claims abstract description 293
- 238000000034 method Methods 0.000 claims abstract description 71
- 238000003860 storage Methods 0.000 claims description 30
- 230000006870 function Effects 0.000 description 29
- 238000007726 management method Methods 0.000 description 24
- 230000003321 amplification Effects 0.000 description 13
- 238000003199 nucleic acid amplification method Methods 0.000 description 13
- 238000004891 communication Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 6
- 239000008186 active pharmaceutical agent Substances 0.000 description 5
- 239000011159 matrix material Substances 0.000 description 5
- 238000013500 data storage Methods 0.000 description 4
- 239000012530 fluid Substances 0.000 description 4
- 239000012634 fragment Substances 0.000 description 4
- 238000009987 spinning Methods 0.000 description 4
- 239000002699 waste material Substances 0.000 description 4
- 230000006399 behavior Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 244000145841 kine Species 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000001052 transient effect Effects 0.000 description 2
- 241000699670 Mus sp. Species 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 239000000969 carrier Substances 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000001934 delay Effects 0.000 description 1
- 238000012432 intermediate storage Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G09—EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
- G09G—ARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
- G09G5/00—Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators
- G09G5/001—Arbitration of resources in a display system, e.g. control of access to frame buffer by video controller and/or main processor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/60—Memory management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
- G06F15/16—Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
- G06F15/163—Interprocessor communication
- G06F15/167—Interprocessor communication using a common memory, e.g. mailbox
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06G—ANALOGUE COMPUTERS
- G06G5/00—Devices in which the computing operation is performed by means of fluid-pressure elements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
-
- G—PHYSICS
- G09—EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
- G09G—ARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
- G09G5/00—Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators
- G09G5/36—Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators characterised by the display of a graphic pattern, e.g. using an all-points-addressable [APA] memory
-
- G—PHYSICS
- G09—EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
- G09G—ARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
- G09G2360/00—Aspects of the architecture of display systems
- G09G2360/10—Display system comprising arrangements, such as a coprocessor, specific for motion video images
-
- G—PHYSICS
- G09—EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
- G09G—ARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
- G09G2360/00—Aspects of the architecture of display systems
- G09G2360/12—Frame memory handling
- G09G2360/121—Frame memory handling using a cache memory
-
- G—PHYSICS
- G09—EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
- G09G—ARRANGEMENTS OR CIRCUITS FOR CONTROL OF INDICATING DEVICES USING STATIC MEANS TO PRESENT VARIABLE INFORMATION
- G09G5/00—Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators
- G09G5/36—Control arrangements or circuits for visual indicators common to cathode-ray tube indicators and other visual indicators characterised by the display of a graphic pattern, e.g. using an all-points-addressable [APA] memory
- G09G5/363—Graphics controllers
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Multimedia (AREA)
- Computer Graphics (AREA)
- Mathematical Physics (AREA)
- Advance Control (AREA)
- Image Generation (AREA)
- Image Processing (AREA)
- Multi Processors (AREA)
Abstract
기법들은, 병행하여 그리고 또한 파이프라인 방식으로 그래픽 데이터 처리 동작들을 실행하는 방법에 관한 것이다. 제 1 스레드는 예를 들어 GPU (26) 의 쉐이더 프로세서의 제 1 유닛 (28A) 상에서 실행되고, 제 2 스레드는 제 2 유닛 (28N) 상에서 병행하여 실행된다. 제 1 스레드의 실행에 의해 생성된 데이터는 그 후에 제 2 스레드를 실행하는 제 2 유닛에 의해 소비된다. GPU 를 포함하는 IC (16) 내의 관리 유닛 (18) 은, 그와 같이 생성된 데이터를 IC 외부의 글로벌 메모리에서의 버퍼 (22A 내지 22N) 에 저장하라는 요청을 제 1 유닛으로부터 수신하고, 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 위치를 결정하며, 버퍼는 그 일 예가 링 버퍼인 FIFO 버퍼를 포함한다. 제 1 스레드의 실행에 의해 생성된 상기 데이터를 취출하라는 요청을 제 2 유닛으로부터 수신할 때, 관리 유닛은 제 1 스레드의 데이터가 제 2 스레드에 의한 소비를 위한 취출을 위해 이용가능한지 여부를 결정한다.
Description
본 출원은 2012년 1월 27일자로 출원된 미국 가출원 제61/591,733호의 이익을 주장하고, 그 전체 내용은 여기에 참조로 전체가 포함된다.
기술분야
본 개시물은 메모리 액세스 관리에 관한 것으로, 더욱 상세하게는 그래픽 처리 유닛 (GPU) 들에서의 메모리 액세스 관리에 관한 것이다.
그래픽 처리 유닛 (graphics processing unit; GPU) 들은 그래픽 처리 이외의 목적을 위해 사용되고 있다. 예를 들어, 논-그래픽 (non-graphics) 관련 애플리케이션들은 GPU 의 대량 병렬성 (massive parallelism) 을 이용함으로써 증가된 속도로 실행할 수도 있다. 이는, 부가적인 논-그래픽 관련 처리 기능성을 제공하고 범용 GPU (general purpose GPU; GPGPU) 들이라고 지칭되는 GPU들을 발생시켰다. 예를 들어, GPGPU 는 하나 이상의 쉐이더 코어들 (shader cores) 을 포함하고, 이 쉐이더 코어들은 그래픽 관련 애플리케이션들뿐만 아니라 논-그래픽 관련 애플리케이션들과 같은 애플리케이션을 실행하도록 구성된다.
일반적으로, 본 개시물은, 글로벌 메모리에 있고 그래픽 처리 유닛 (graphics processing unit; GPU) 에 대한 데이터를 GPU 에 저장하는 버퍼를 관리하는 기법들에 관한 것이다. 예를 들어, GPU 를 포함하는 집적 회로 (integrated circuit; IC) 칩은 파이프라인 관리 유닛을 포함한다. 파이프라인 관리 유닛은 글로벌 메모리에서의 하나 이상의 버퍼들의 상태 정보를 유지하도록 구성될 수도 있다. GPU 상에서 실행하는 애플리케이션이 글로벌 메모리에서의 버퍼들에 액세스할 때, 글로벌 메모리에서의 버퍼들의 상태 정보는 IC 칩 내부에서 입수가능할 수도 있다. 이러한 방법으로, GPU 는 글로벌 메모리에서의 버퍼들의 상태 정보를 결정하기 위해 오프-칩 메모리 액세스를 수행할 필요가 없다.
하나의 예에서, 본 개시물은 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법을 설명한다. 이 방법은, 그래픽 처리 유닛 (GPU) 의 쉐이더 프로세서의 제 1 프로그래머블 연산 유닛 (programmable compute unit) 상에서 제 1 스레드를 실행하는 단계, 및 GPU 의 쉐이더 프로세서의 제 2 프로그래머블 연산 유닛 상에서 제 2 스레드를 실행하는 단계를 포함한다. 이 방법은 또한, GPU 를 포함하는 집적 회로 (IC) 내의 관리 유닛에 의해, 제 1 스레드의 실행에 의해 생성된 데이터를 IC 외부의 글로벌 메모리에서의 버퍼에 저장하라는 요청을 제 1 프로그래머블 연산 유닛으로부터 수신하는 단계를 포함한다. 이 예에서, 제 1 스레드의 실행에 의해 생성된 데이터는, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의해 소비되어야 한다. 또한, 이 예에서, 버퍼는 선입 선출 (first-in-first-out; FIFO) 버퍼와 링 버퍼 중 하나의 버퍼를 포함한다. 이 방법은 또한, 관리 유닛에 의해, 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정하는 단계, 및 IC 에 의해, 제 1 스레드의 실행에 의해 생성된 데이터를, 버퍼 내의 결정된 위치에 저장하는 단계를 포함한다.
하나의 예에서, 본 개시물은 장치를 설명한다. 이 장치는 버퍼를 포함하는 글로벌 메모리를 포함한다. 이 예에서, 버퍼는 선입 선출 (FIFO) 버퍼와 링 버퍼 중 하나의 버퍼를 포함한다. 이 장치는 또한, 그래픽 처리 유닛 (GPU) 및 관리 유닛을 포함하는 집적 회로 (IC) 를 포함한다. GPU 는, 제 1 스레드를 실행하도록 구성된 제 1 프로그래머블 연산 유닛, 및 제 2 스레드를 실행하도록 구성된 제 2 프로그래머블 연산 유닛을 포함한다. 관리 유닛은, 제 1 스레드의 실행에 의해 생성된 데이터를 글로벌 메모리에서의 버퍼에 저장하라는 요청을 제 1 프로그래머블 연산 유닛으로부터 수신하도록 구성된다. 이 예에서, 제 1 스레드의 실행에 의해 생성된 데이터는, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의해 소비되어야 한다. 관리 유닛은 또한, 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정하도록 구성된다. 이 예에서, IC 는, 제 1 스레드의 실행에 의해 생성된 데이터를, 버퍼 내의 결정된 위치에 저장하도록 구성된다.
하나의 예에서, 본 개시물은 장치를 설명한다. 이 장치는 글로벌 메모리 및 집적 회로 (IC) 를 포함한다. 글로벌 메모리는 버퍼를 포함한다. 이 예에서, 버퍼는 선입 선출 (FIFO) 버퍼와 링 버퍼 중 하나의 버퍼를 포함한다. IC 는 제 1 스레드를 실행하는 수단, 및 제 2 스레드를 실행하는 수단을 포함하는 그래픽 처리 유닛 (GPU) 을 포함한다. IC 는 또한, 제 1 스레드의 실행에 의해 생성된 데이터를 글로벌 메모리에서의 버퍼에 저장하라는 요청을, 제 1 스레드를 실행하는 수단으로부터 수신하는 수단을 포함한다. 이 예에서, 제 1 스레드의 실행에 의해 생성된 데이터는, 제 2 스레드를 실행하는 수단에 의해 소비되어야 한다. IC 는 또한, 제 1 스레드를 실행하는 수단에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정하는 수단, 및 제 1 스레드의 실행에 의해 생성된 데이터를, 버퍼 내의 결정된 위치에 저장하는 수단을 포함한다.
하나의 예에서, 본 개시물은 명령들을 저장한 컴퓨터 판독가능 저장 매체를 설명하고, 이 명령들은, 실행될 때, 하나 이상의 프로세서들로 하여금, 그래픽 처리 유닛 (GPU) 의 쉐이더 프로세서의 제 1 프로그래머블 연산 유닛 상에서 제 1 스레드를 실행하게 하고, GPU 의 쉐이더 프로세서의 제 2 프로그래머블 연산 유닛 상에서 제 2 스레드를 실행하게 한다. 이 명령들은 또한, 하나 이상의 프로세서들로 하여금, GPU 를 포함하는 집적 회로 (IC) 내의 관리 유닛에 의해, 제 1 스레드의 실행에 의해 생성된 데이터를 IC 외부의 글로벌 메모리에서의 버퍼에 저장하라는 요청을 제 1 프로그래머블 연산 유닛으로부터 수신하게 한다. 이 예에서, 제 1 스레드의 실행에 의해 생성된 데이터는, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의해 소비되어야 한다. 또한, 이 예에서, 버퍼는 선입 선출 (FIFO) 버퍼와 링 버퍼 중 하나의 버퍼를 포함한다. 이 명령들은 또한, 하나 이상의 프로세서들로 하여금, 관리 유닛에 의해, 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정하게 하고, IC 에 의해, 제 1 스레드의 실행에 의해 생성된 데이터를, 버퍼 내의 결정된 위치에 저장하게 한다.
하나 이상의 예들의 세부사항들은 첨부된 도면들 및 하기의 설명에서 설명된다. 다른 특징들, 목적들 및 이점들은 이 설명 및 도면들로부터 그리고 청구범위로부터 자명해질 것이다.
도 1 은 본 개시물에 설명된 하나 이상의 예들에 따른 디바이스의 일 예를 예시한 블록도이다.
도 2 는 그래픽 처리 유닛 (GPU) 및 글로벌 메모리를 더욱 상세히 예시한 블록도이다.
도 3 은 본 개시물에 설명된 하나 이상의 예들에 따른 일 예시적인 기법을 예시한 플로차트이다.
도 4 는 본 개시물에 설명된 하나 이상의 예들에 따른 다른 예시적인 기법을 예시한 플로차트이다.
도 5 는 도 1 의 디바이스를 더욱 상세히 예시한 블록도이다.
도 2 는 그래픽 처리 유닛 (GPU) 및 글로벌 메모리를 더욱 상세히 예시한 블록도이다.
도 3 은 본 개시물에 설명된 하나 이상의 예들에 따른 일 예시적인 기법을 예시한 플로차트이다.
도 4 는 본 개시물에 설명된 하나 이상의 예들에 따른 다른 예시적인 기법을 예시한 플로차트이다.
도 5 는 도 1 의 디바이스를 더욱 상세히 예시한 블록도이다.
그래픽 처리 유닛 (graphics processing unit; GPU) 은 하나 이상의 애플리케이션들을 실행하도록 구성된 쉐이더 프로세서 (shader processor) 를 포함할 수도 있다. 이들 애플리케이션들의 예로는 쉐이더 프로그램들, 예컨대, 버텍스 쉐이더들, 헐 쉐이더들 (hull shaders), 프래그먼트 쉐이더들, 지오메트리 쉐이더들, 및 그래픽 처리에 관련된 다른 애플리케이션들을 포함한다. 또한, 일부 애플리케이션 개발자들은 GPU 의 대량 병렬성을 이용하고 GPU 상에서 논-그래픽 관련 애플리케이션들을 실행하는 것이 유리하다고 여길 수도 있다. 예를 들어, GPU 에 의해 제공된 처리 병렬성은, 병렬 행렬 연산들이 그래픽 처리에 관련되지 않은 때라도, 이 병렬 행렬 연산들을 실행하기에 적합할 수도 있다. 논-그래픽 관련 애플리케이션들의 다른 예로는 병렬 동작들의 빠른 실행이 유리할 수도 있는 선형 대수학 또는 유체 역학에 관련된 기법들을 포함한다. 논-그래픽 관련 애플리케이션들은 또한 쉐이더 프로세서 상에서 실행할 수도 있다.
이러한 논-그래픽 관련 애플리케이션들을 실행하는 것이 가능한 GPU 는 범용 GPU (GPGPU) 로서 간주될 수도 있다. 예를 들어, GPU 가 논-그래픽 관련 애플리케이션들을 실행하고 있는 경우, GPU 는 GPGPU 로서 기능하고 있다. 대부분의 모든 GPU들은 GPGPU 로서 기능하도록 구성될 수도 있다.
예시의 목적을 위해, 본 개시물은 GPGPU 로서 기능하는 GPU 에 대한 기법들을 설명한다. 그러나, 이 기법들은 GPU 가 GPGPU 로서 기능하고 있는 (즉, 논-그래픽 관련 애플리케이션들을 실행하고 있는) 경우들로 제한되지 않으며, 이 기법들은 또한 GPU 가 그래픽 관련 애플리케이션들을 실행하고 있는 경우들에 적용할 수도 있다. 또한, 본 개시물에 설명된 기법들은 중앙 처리 유닛 (CPU), 가속기, 또는 임의의 다른 커스텀 디바이스와 같은 임의의 타입의 처리 유닛에 의해 구현될 수도 있다. 이 기법들이 GPU 에 대해 설명되지만, 이 기법들은 다른 타입의 처리 유닛들로 확장가능하다는 것을 이해해야 한다.
GPU 내의 쉐이더 프로세서는 복수의 쉐이더 코어들 (이들 코어들이 그래픽과 논-그래픽 관련 애플리케이션들 양쪽 모두에 대한 명령들을 실행할 수 있음을 나타내기 위해 프로그래머블 연산 유닛 (programmable compute unit) 들이라고도 지칭됨) 을 포함할 수도 있다. 프로그래머블 연산 유닛들 각각은, 프로그래머블 연산 유닛에 의해 실행될 명령들뿐만 아니라, 명령들의 실행에 의해 생성된 데이터, 예컨대, 스레드들의 실행 동안 생성된 중간 결과들이 예비된 로컬 메모리를 포함할 수도 있다. 프로그래머블 연산 유닛의 로컬 메모리는 다른 프로그래머블 연산 유닛들에 의해 액세스불가능할 수도 있다. 일부 경우들에서, GPU 상에서 실행되어야 한는 상이한 애플리케이션들은, 상이한 프로그래머블 연산 유닛들에 의해 실행될 수도 있다.
본 개시물에 설명된 기법들에서, 그래픽 관련 애플리케이션들은 쉐이더들이라고 지칭되고, 논-그래픽 관련 애플리케이션들은 커널들이라고 지칭된다. 예를 들어, 쉐이더들 (즉, 그래픽 관련 애플리케이션들) 의 예로는 버텍스 쉐이더, 프래그먼트 쉐이더, 및 지오메트리 쉐이더를 포함하지만 이들로 제한되지 않는다. 커널들 (즉, 논-그래픽 관련 애플리케이션들) 의 예로는 행렬 연산들, 유체 역학, 이미지 처리 동작들, 비디오 처리 동작들 등을 수행하기 위한 애플리케이션들을 포함한다.
또한, 커널들은 GPU 에 의해 실행되는 애플리케이션들로만 반드시 제한될 필요는 없고, 또한 GPU 의 고정 기능 유닛들 (fixed-function units) (즉, 논-프로그래머블 유닛들) 을 포함한다. 예시의 목적만을 위해, 본 개시물에 설명된 기법들은 GPU 상에서 실행되는 애플리케이션들인 커널들에 대해 설명된다. 예를 들어, 이 기법들은 GPU 가 GPGPU 로서 기능하도록 GPU 의 쉐이더 프로세서 상에서 실행하는 논-그래픽 관련 애플리케이션들에 대해 설명된다.
커널은 복수의 워크 그룹들, 태스크들, 또는 스레드들을 포함할 수도 있다 (이들 모두는 본 개시물에서 동의어로 사용된다). 예를 들어, 스레드는 커널의 다른 스레드들로부터 독립적으로 실행될 수 있는 커널의 명령들의 세트일 수도 있다. 일부 예들에서, 커널을 실행하기 위해, 프로그래머블 연산 유닛들 중 하나 이상은 각각 커널의 하나 이상의 스레드들을 실행할 수도 있다. 제 1 프로그래머블 연산 유닛은 커널의 제 1 스레드를 실행할 수도 있고, 제 2 프로그래머블 연산 유닛은 동일한 커널의 제 2 스레드를 실행할 수도 있다. 일부 예들에서, 하나의 프로그래머블 연산 유닛은 하나의 커널의 하나 이상의 스레드들을 실행할 수도 있는 한편, 다른 프로그래머블 연산 유닛은 다른 커널의 하나 이상의 스레드들을 실행한다. 다른 예들에서, 이 둘의 조합이 가능할 수도 있다 (즉, 일부 프로그래머블 연산 유닛들은 동일한 커널의 상이한 스레드들을 실행하고 있는 한편, 일부 다른 프로그래머블 연산 유닛들은 상이한 커널들의 스레드들을 실행하고 있다).
일반적으로, GPU 는 단일 프로그램 다중 데이터 (single program multiple data; SPMD) 프로그래밍 모델을 구현하도록 구성될 수도 있다. SPMD 프로그래밍 모델에서, GPU 는 (예를 들어, 스레드들로서) 다수의 프로그래머블 연산 유닛들 상에서 커널을 실행할 수도 있고, 여기서 각각의 프로그래머블 연산 유닛은 그 자신의 데이터에 대한 기능들을 수행한다. 또한, SPMD 프로그래밍 모델에서, 프로그래머블 연산 유닛들은, 프로그래머블 연산 유닛들에 의해 실행되는 현재 명령을 나타내는 각각의 프로그램 카운터들을 포함한다.
GPU들이 처리에 대한 대량 병렬성을 제공하지만, GPU들은 파이프라인 방식으로 커널들을 실행하기에 아주 적합하지 않을 수도 있다. 파이프라인 방식으로 커널들을 실행한다는 것은, 하나의 커널에 의해 생성된 데이터가 다른 커널에 의해 소비되도록 커널들을 실행한다는 것을 의미한다. 다른 예로서, 파이프라인 방식으로 커널들을 실행한다는 것은, 데이터를 생성하는 커널의 한 스레드를 실행하되 그 데이터는 동일한 커널의 다른 스레드에 의해 소비된다는 것을 의미한다. 본 개시물에서, 데이터를 생성하는 스레드는 생성자 스레드 (producer thread) 라고 지칭될 수도 있고, 데이터를 수신하는 스레드는 소비자 스레드 (consumer thread) 라고 지칭될 수도 있다.
일부 예들에서, 생성자 스레드 및 소비자 스레드는 동일한 커널의 스레드들일 수도 있다. 일부 예들에서, 생성자 스레드 및 소비자 스레드는 상이한 커널들의 스레드들일 수도 있다. 이들 예들에서, 생성자 스레드를 포함하는 커널은, 생성자 커널이라고 지칭될 수도 있고, 소비자 스레드를 포함하는 커널은, 소비자 커널이라고 지칭될 수도 있다.
예를 들어, 파이프라인 방식으로 커널들을 실행한다는 것은, 제 2 스레드 (예를 들어, 동일한 커널 또는 상이한 커널의 소비자 스레드) 에 의해 소비되는 데이터를 제 1 스레드 (예를 들어, 커널의 생성자 스레드) 가 생성한다고 생각될 수도 있다. (제 1 스레드에 대한 소비자였던) 이 제 2 스레드는, 제 3 스레드에 대한 생성자 스레드일 수도 있다 (예를 들어, 제 2 스레드는, 제 3 스레드에 의해 소비되는 데이터를 생성한다). 제 3 스레드는, 제 1 및 제 2 스레드들을 포함하는 커널과는 상이한 커널에 대한 스레드일 수도 있고 또는 제 1 및 제 2 스레드들을 포함하는 커널들 중 하나의 커널에 대한 스레드일 수도 있다. 이 예에서, 제 1, 제 2, 및 제 3 스레드들은 처리 파이프라인을 형성한다고 생각될 수도 있다.
파이프라인 방식으로 커널들을 실행한다는 것은, 커널들 또는 스레드들이 연속으로 (예를 들어, 잇따라) 실행되는 것을 요구하는 것으로 해석되어서는 안된다. 예를 들어, 위의 예에서, GPU 가 제 1, 제 2, 및 제 3 스레드들 중 2개 이상을 병행하여 (예를 들어, 동시에) 실행하는 것이 가능할 수도 있다. 그러나, GPU 가 또한 스레드들을 연속으로 실행하는 것이 가능할 수도 있고, 여전히 파이프라인 방식으로 커널들을 실행하는 것으로 간주될 수도 있다.
커널의 생성자 스레드를 실행하는 프로그래머블 연산 유닛은, 생성된 데이터를 글로벌 메모리에 출력할 필요가 있을 수도 있고 (즉, GPU 를 포함하는 집적 회로 (integrated circuit; IC) 외부의 오프-칩의 시스템 메모리), 여기서 글로벌 메모리는, 예를 들어, 시스템 버스를 통해 액세스가능할 수도 있다. 동일한 커널 또는 상이한 커널의 소비자 스레드를 실행하는 다른 프로그래머블 연산 유닛은, 생성된 데이터를 글로벌 메모리로부터 수신할 필요가 있을 수도 있다. 더욱 상세히 설명되는 바와 같이, 기존의 GPU들에 대해, 글로벌 메모리의 관리는 연산, 시간 및/또는 파워 (power) 비효율적이어서, 파이프라인 방식으로 커널들을 실행할 때 열악한 성능을 초래할 수도 있다.
본 개시물은 글로벌 메모리의 연산, 시간 및 파워 효율적 관리를 위한 기법들을 설명한다. 더욱 상세히 설명되는 바와 같이, GPU 를 포함하는 집적 회로 (IC) 는 파이프라인 관리 유닛 (pipeline management unit; PMU) 을 포함할 수도 있다. 대안적으로, GPU 는 PMU 를 포함할 수도 있다. PMU 는 소비되어야 하는 생성된 데이터를 저장하는 글로벌 메모리의 상태 정보를 관리하도록 구성될 수도 있다. 예를 들어, 프로세서 또는 GPU 그 자체는 프로그래머블 연산 유닛들에 의해 생성된 데이터가 글로벌 메모리에 저장되어야 하는 글로벌 메모리 내의 위치들을 예비해 둘 수도 있다. 글로벌 메모리 내의 이들 예비된 위치들은 복수의 버퍼들로서 간주될 수도 있다. 일부 예들에서, 복수의 버퍼들은 링 버퍼 또는 선입 선출 (first-in-first-out; FIFO) 버퍼를 형성할 수도 있다. 링 버퍼는 FIFO 버퍼의 하나의 예로서 간주될 수도 있다.
PMU 는, 오프-칩의 글로벌 메모리에서의 버퍼들의 상태 정보를 나타내는 정보를 IC 또는 GPU 내부에 (예를 들어, 온-칩의 내부 캐시 메모리에) 저장할 수도 있다. 하나의 예로서, PMU 는 글로벌 메모리에서의 버퍼들의 시작 어드레스와 끝 어드레스를 나타내는 정보를 저장할 수도 있다. 다른 예로서, PMU 는 생성된 데이터가 저장되어야 하는 복수의 버퍼들 내의 버퍼의 어드레스뿐만 아니라, 소비될 데이터가 판독되어야 하는 복수의 버퍼들 내의 버퍼의 어드레스들을 저장할 수도 있다. 또 다른 예로서, PMU 는, 데이터를 필요로 하는 소비자 커널의 스레드를 실행하고 있는 프로그래머블 연산 유닛이, 데이터를 필요로 하지 않는 소비자 커널의 다른 스레드들을 실행하는 것을 진행할 수 있도록, 생성자 커널이 데이터의 생성을 완료하였는지 여부를 나타내는 정보를 저장할 수도 있다.
본 개시물에 설명된 기법들에서, PMU 는 생성자 스레드에 의해 생성된 데이터를 버퍼에 저장하라는 요청을 수신할 수도 있고, 소비자 스레드에 대한 소비를 위해 생성자 스레드에 의해 생성된 데이터를 버퍼로부터 취출하라는 요청을 수신할 수도 있다. PMU 는, 버퍼들의 저장된 상태 정보에 기초하여 생성자 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정하고, 버퍼들의 저장된 상태 정보에 기초하여 소비자 커널에 의해 소비될 데이터가 취출되어야 하는 버퍼 내의 위치를 결정할 수도 있다.
GPU 를 포함하는 IC 내부에 또는 GPU 그 자체의 내부에 저장된 정보로 글로벌 메모리의 상태 정보를 관리함으로써, 본 개시물에 설명된 기법들은 GPU 가 글로벌 메모리에 액세스할 필요가 있는 횟수를 최소화시킬 수도 있다. 예를 들어, PMU 는 GPU 를 포함하는 IC 외부의 정보에 액세스함으로써 데이터가 저장 또는 취출되어야 하는 어드레스들을 결정할 필요가 없을 수도 있다. GPU 가 글로벌 메모리에 액세스할 필요가 있는 횟수를 최소화시키는 것은 파워 소비를 감소시키고, 시스템 버스 대역폭 로드 및 상주 레이턴시를 감소시킬 수도 있다.
또한, 아래에 더욱 상세히 설명되는 바와 같이, 기존의 GPU들에서는, 커널들이 글로벌 메모리를 관리하는 명령들을 포함할 필요가 있다. GPU 는 이러한 글로벌 메모리 관리 명령들을 실행하는 클록 사이클들을 낭비할 수도 있어서, 연산 비효율적일 수도 있다. 글로벌 메모리의 상태 정보를 관리하는 PMU 에 의하면, 커널들은 글로벌 메모리 관리 명령들을 포함할 필요가 없을 수도 있어서, 커널 명령들이 보다 덜 복잡해질 뿐만 아니라 실행될 필요가 있는 커널 명령들이 보다 적어진다. 이러한 방식으로, 본 개시물에 설명된 기법들은 연산 효율들을 촉진시킬 수도 있다.
도 1 은 본 개시물에 설명된 하나 이상의 예들에 따른 디바이스의 일 예를 예시한 블록도이다. 예를 들어, 도 1 은 디바이스 (10) 를 예시한다. 디바이스 (10) 의 예로는 비디오 디바이스들, 예컨대, 미디어 플레이어들, 셋톱 박스들, 무선 핸드셋들, 예컨대, 모바일 텔레비전들, 개인 휴대 정보 단말기 (personal digital assistant; PDA) 들, 데스크톱 컴퓨터들, 랩톱 컴퓨터들, 게이밍 콘솔들, 비디오 회의 유닛들, 태블릿 컴퓨팅 디바이스들 등을 포함하지만 이들로 제한되지 않는다. 디바이스 (10) 는 도 1 에 예시된 것들 이외의 컴포넌트들을 포함할 수도 있다.
예시된 바와 같이, 디바이스 (10) 는 집적 회로 (IC; 12) 및 글로벌 메모리 (20) 를 포함한다. 글로벌 메모리 (20) 는 디바이스 (10) 에 대한 메모리로서 간주될 수도 있다. 글로벌 메모리 (20) 는 하나 이상의 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 글로벌 메모리 (20) 의 예로는 랜덤 액세스 메모리 (RAM), 전기적으로 소거가능한 프로그래머블 판독 전용 메모리 (EEPROM), 플래시 메모리, 또는 명령들 및/또는 데이터 구조들의 형태로 원하는 프로그램 코드를 운반 또는 저장하는데 사용될 수 있고 컴퓨터 또는 프로세서에 의해 액세스될 수 있는 임의의 다른 매체를 포함하지만, 이들로 제한되지 않는다.
일부 양태들에서, 글로벌 메모리 (20) 는, 프로세서 (14) 및/또는 GPU (16) 로 하여금, 본 개시물에서의 프로세서 (14) 및 GPU (16) 에 기인한 기능들을 수행하게 하는 명령들을 포함할 수도 있다. 따라서, 글로벌 메모리 (20) 는, 실행될 때, 하나 이상의 프로세서들 (예를 들어, 프로세서 (14) 및 GPU (16)) 로 하여금 다양한 기능들을 수행하게 하는 명령들을 저장한 컴퓨터 판독가능 저장 매체일 수도 있다.
글로벌 메모리 (20) 는, 일부 예들에서, 비일시적 저장 매체로서 간주될 수도 있다. 용어 "비일시적" 은, 저장 매체가 반송파 또는 전파 신호에 임베딩되지 않는다는 것을 나타낼 수도 있다. 그러나, 용어 "비일시적" 은 글로벌 메모리 (20) 가 비이동식이거나 또는 그의 콘텐츠들이 정적이라는 것을 의미하는 것으로 해석되어서는 안된다. 하나의 예로서, 글로벌 메모리 (20) 는 디바이스 (10) 로부터 제거되어, 다른 디바이스로 이동될 수도 있다. 다른 예로서, 글로벌 메모리 (20) 와 실질적으로 유사한 글로벌 메모리는 디바이스 (10) 에 삽입될 수도 있다. 특정 예들에서, 비일시적 저장 매체는 시간이 지남에 따라 변할 수 있는 데이터를 (예를 들어, RAM 에) 저장할 수도 있다.
IC (12) 는 프로세서 (14), 그래픽 처리 유닛 (GPU; 16), 및 파이프라인 관리 유닛 (PMU; 18) 을 포함한다. IC (12) 는 프로세서 (14), GPU (16), 및 PMU (18) 를 하우징하거나 형성하는 임의의 타입의 집적 회로일 수도 있다. 예를 들어, IC (12) 는 칩 패키지 내의 처리 칩으로서 간주될 수도 있다. PMU (18) 는 IC (12) 의 부분을 형성하는 하드웨어 유닛일 수도 있고 또는 GPU (16) 내의 하드웨어일 수도 있다. PMU (18) 가 IC (12) 내의 또는 GPU (16) 내의 하드웨어 상에서 실행하는 소프트웨어인 것이 가능할 수도 있다. 예시 및 설명의 목적을 위해, 이 기법들은 하드웨어 유닛인 PMU (18) 에 대해 설명된다.
프로세서 (14), GPU (16), 및 PMU (18) 가 단일 IC (12) 의 부분인 것으로 예시되지만, 본 개시물의 양태들은 이와 같이 제한되지 않는다. 일부 예들에서, 프로세서 (14) 및 GPU (16) 는 상이한 집적 회로들 (즉, 상이한 칩 패키지들) 에 하우징될 수도 있다. 이들 예들에서, PMU (18) 는 GPU (16) 와 동일한 집적 회로에 하우징될 수도 있다. 일부 예들에서, PMU (18) 는 GPU (16) 의 부분으로서 형성될 수도 있다. 하나의 예로서, 프로세서 (14) 및 GPU (16) 는 동일한 집적 회로 (즉, 동일한 칩 패키지) 에 하우징될 수도 있고, PMU (18) 는 GPU (16) 내에 형성될 수도 있다. 다른 예로서, 프로세서 (14) 및 GPU (16) 는 상이한 집적 회로들 (즉, 상이한 칩 패키지) 에 하우징될 수도 있고, PMU (18) 는 GPU (16) 내에 형성될 수도 있다.
프로세서 (14), GPU (16), 및 PMU (18) 의 예로는 디지털 신호 프로세서 (DSP), 범용 마이크로프로세서, 주문형 집적 회로 (ASIC), 필드 프로그래머블 게이트 어레이 (FPGA), 또는 다른 균등한 집적 또는 이산 로직 회로부를 포함하지만 이들로 제한되지 않는다. 일부 예들에서, GPU (16) 및 PMU (18) 는, 아래에 더욱 상세히 설명되는 바와 같이, 그래픽 처리에 적합한 대량 병렬 처리 능력들을 GPU (16) 에 제공하고 글로벌 메모리 (20) 의 관리를 PMU (18) 에 제공하는 집적 및/또는 이산 로직 회로부를 포함하는 특수화된 하드웨어일 수도 있다. 일부 경우들에서, GPU (16) 는 또한 범용 처리를 포함할 수도 있고, 범용 처리 태스크들 (즉, 논-그래픽 관련 태스크들) 을 구현할 때 범용 GPU (general purpose GPU; GPGPU) 라고 지칭될 수도 있다.
때때로 호스트라고 지칭되는 프로세서 (14) 는, 디바이스 (10) 의 중앙 처리 유닛 (CPU) 일 수도 있다. 프로세서 (14) 는 다양한 타입들의 애플리케이션들을 실행할 수도 있다. 애플리케이션들의 예로는, 웹 브라우저들, 전자 판독기들, 이메일 애플리케이션들, 스프레드시트들, 비디오 게임들, 비디오 재생, 오디오 재생, 워드 처리, 또는 디스플레이를 위해 뷰잉가능한 오브젝트들을 발생시키는 다른 애플리케이션들, 또는 임의의 다른 타입들의 애플리케이션들을 포함한다. 글로벌 메모리 (20) 는 하나 이상의 애플리케이션들의 실행을 위한 명령들을 저장할 수도 있다.
일부 예들에서, 프로세서 (14) 는 대량 병렬 동작들을 요구하는 태스크들과 같은 처리 태스크들을 GPU (16) 에게 전가시킬 수도 있다. 하나의 예로서, 그래픽 처리는 대량 병렬 동작들을 요구하고, 프로세서 (14) 는 이러한 그래픽 처리 태스크들을 GPU (16) 에게 전가시킬 수도 있다. 일부 예들에서, 프로세서 (14) 는 그래픽 처리에 관련되지 않은 태스크들을 GPU (16) 에게 전가시킬 수도 있다. 예를 들어, 행렬 연산들은 병렬 동작들을 요구하고, GPU (16) 는 프로세서 (14) 에 비해 이러한 동작들을 구현하기에 더 적합할 수도 있다.
태스크들을 구현하기 위해, GPU (16) 는 하나 이상의 애플리케이션들을 실행하도록 구성될 수도 있다. 예를 들어, 그래픽 관련 처리를 위해, GPU (16) 는 버텍스 쉐이더들, 프래그먼트 쉐이더들, 및 지오메트리 쉐이더들과 같은 애플리케이션들을 실행할 수도 있다. 논-그래픽 관련 처리를 위해, GPU (16) 는 이러한 처리를 위해 설계된 애플리케이션들 (예를 들어, 행렬 연산들을 구현하기 위한 애플리케이션 또는 유체 역학을 위한 애플리케이션) 을 실행할 수도 있다. 어느 하나의 예에 있어서 (예를 들어, 그래픽 관련 처리 또는 논-그래픽 관련 처리), 프로세서 (14) 는 GPU (16) 에게 하나 이상의 애플리케이션들을 실행하라고 지시할 수도 있다.
프로세서 (14) 는 특정 애플리케이션 처리 인터페이스 (API) 에 따라 GPU (16) 와 통신할 수도 있다. 예를 들어, 프로세서 (14) 는 API 를 활용하여 하나 이상의 애플리케이션들을 실행하라고 GPU (16) 에게 지시하는 명령들과 같은 명령들을 GPU (16) 에게 송신할 수도 있다. 이러한 API들의 예로는 Microsoft® 에 의한 DirectX®, Khronos group 에 의한 OpenGL®, 및 Khronos group 에 의한 OpenCL® 을 포함하지만; 본 개시물의 양태들은 DirectX, OpenGL, 또는 OpenCL API들로 제한되지 않고, 개발되었거나, 현재 개발되고 있거나, 미래에 개발될 다른 타입들의 API들로 확장될 수도 있다. 또한, 본 개시물에 설명된 기법들은, API 에 따라 기능하도록 요구되지 않으며, 프로세서 (14) 및 GPU (16) 는 통신을 위한 임의의 기법을 활용할 수도 있다.
하나의 예로서, 그래픽 관련 애플리케이션들에 대해, 프로세서 (14) 는 OpenGL API 를 이용하여 GPU (16) 와 통신할 수도 있다. 논-그래픽 관련 애플리케이션들에 대해, 프로세서 (14) 는 OpenCL API 를 이용하여 GPU (16) 와 통신할 수도 있다. 또 다시, 본 개시물에 설명된 기법들은 프로세서 (14) 에게 OpenGL 및/또는 OpenCL API들을 이용하여 GPU (16) 와 통신하는 것을 반드시 요구하지는 않는다.
GPU (16) 가 실행되어야 하는 그래픽 관련 애플리케이션들은 쉐이더들이라고 지칭될 수도 있고, GPU (16) 가 실행되어야 하는 논-그래픽 관련 애플리케이션들은 커널들이라고 지칭될 수도 있다. 예를 들어, 글로벌 메모리 (20) 는 쉐이더들 및 커널들의 명령들을 저장할 수도 있고, 프로세서 (14) 상에서 실행하는 컴파일러는 쉐이더들 및 커널들의 명령들을 GPU (16) 상의 실행을 위한 오브젝트 코드로 컨버팅할 수도 있다. 다른 예로서, 글로벌 메모리 (20) 는, GPU (16) 가 취출하고 실행하는, 쉐이더들 및 커널들의 오브젝트 코드를 저장할 수도 있다.
쉐이더들의 예로는 그래픽 관련 처리를 위한 버텍스 쉐이더, 프래그먼트 쉐이더, 및 지오메트리 쉐이더를 포함한다. 커널들의 예로는 (예를 들어, 선형 대수학 또는 유체 역학을 위한) 그래픽 처리에 관련되지 않은 애플리케이션들을 포함한다. 부가적인 예들로서, 커널들은 이미지 처리 및 비디오 처리를 위한 애플리케이션들을 포함한다.
GPU (16) 는 쉐이더 프로세서를 포함할 수도 있고, 쉐이더 프로세서는 쉐이더들 및 커널들을 실행할 수도 있다. 예를 들어, GPU (16) 의 쉐이더 프로세서는 하나 이상의 쉐이더 코어들 (프로그래머블 연산 유닛들이라고 지칭됨) 을 포함할 수도 있고, 하나 이상의 프로그래머블 연산 유닛들 각각은 커널을 실행할 수도 있다.
커널들이 GPU (16) 상에서 실행하는 애플리케이션들인 것으로 설명되지만, 커널들은 이와 같이 제한하는 것으로 간주되어서는 안된다. 커널들의 다른 예로는 GPU (16) 의 고정 기능 유닛들을 포함한다. 예를 들어, GPU (16) 는 프로그래머블 연산 유닛들 및 고정 기능 유닛들을 포함한다. 프로그래머블 연산 유닛들은 애플리케이션들을 실행함으로써 기능적 유연성을 제공할 수도 있다. 고정 기능 유닛들은 기능적 유연성을 제공하지 않는 하드웨어 유닛들일 수도 있고, 특정 목적을 위해 설계될 수도 있다. 일반적으로, 커널이라는 용어는 데이터를 수신하고, 데이터를 처리하며, 논-그래픽 관련 목적을 위해 데이터를 출력하는 임의의 애플리케이션 또는 하드웨어 유닛들을 지칭한다. 그러나, 예시의 목적을 위해, 본 개시물에 설명된 기법들은 커널들이 애플리케이션들인 예로 설명되고, 이 기법들이 커널들이 고정 기능 유닛들인 예들로 확장가능하다는 것을 이해한다.
본 개시물에 설명된 기법들에서, 커널의 명령들 모두를 실행하는 하나의 프로그래머블 연산 유닛보다는 오히려, 다수의 프로그래머블 연산 유닛들이 커널의 부분들을 실행하는 것이 가능할 수도 있다. 커널의 일 부분은 워크 그룹, 태스트, 또는 스레드 (모두 동의어임) 라고 지칭될 수도 있다. 예를 들어, 커널의 워크 그룹, 태스크, 또는 스레드는, 커널의 워크 그룹들, 태스크들, 또는 스레드들과 독립적으로 실행될 수 있는 명령들의 세트이다.
일부 예들에서, 하나 이상의 프로그래머블 연산 유닛들의 제 1 세트는 커널의 스레드들을 실행할 수도 있고, 하나 이상의 프로그래머블 연산 유닛들의 제 2 세트는 커널의 스레드들을 실행할 수도 있다. 일부 경우들에서, 프로그래머블 연산 유닛들의 제 1 세트와 프로그래머블 연산 유닛들의 제 2 세트가 실행하는 스레드들은 동일한 커널의 스레드들일 수도 있다. 일부 경우들에서, 프로그래머블 연산 유닛들의 제 1 세트 및 프로그래머블 연산 유닛들의 제 2 세트가 실행하는 스레드들은 상이한 커널들의 스레드들일 수도 있다. 이들 예들 중 어느 한 예에서, 스레드들 중 하나는 발생된 데이터를 스레드들 중 다른 하나에 출력하기 위해 필요할 수도 있다. 다시 말해, GPU (16) 는 파이프라인 방식으로 커널들을 실행할 수도 있다.
상술된 바와 같이, 파이프라인 방식으로 커널들을 실행한다는 것은, 하나의 스레드에 의해 생성된 데이터가 다른 스레드에 의해 소비되고, 이 다른 스레드에 의해 생성된 데이터가 또 다른 스레드에 의해 소비되는 것 등을 위해 커널들을 실행한다는 것을 의미할 수도 있다. 이들 예들에서, 스레드들은 상이한 커널들, 동일한 커널의 스레드들일 수도 있고, 또는 일부 스레드들은 상이한 커널들에 대한 것일 수도 있고 다른 스레드들은 동일한 커널에 대한 것일 수도 있다. 이들 예들에서, 커널들은, 데이터가 생성되고 소비되는 파이프라인을 형성한다고 보여질 수도 있다. 예를 들어, 동일한 커널 또는 상이한 커널들의 제 1, 제 2, 및 제 3 스레드들은 파이프를 형성할 수도 있고, 여기서 제 1 스레드는 데이터를 생성하고 데이터를 송신하여 처리를 위한 제 2 스레드에 의해 소비된다. 제 2 스레드는 수신된 데이터를 처리하여 데이터를 생성하고, 생성된 데이터를 처리를 위한 제 3 스레드에게 송신하는 것 등을 한다.
이 예에서, 제 1 스레드는 생성자 스레드라고 지칭될 수도 있고, 제 2 스레드는 제 1 스레드에 대한 소비자 스레드 및 제 3 스레드에 대한 생성자 스레드라고 지칭될 수도 있으며, 제 3 스레드는 소비자 스레드라고 지칭될 수도 있다. 예들에서, 제 1, 제 2, 및 제 3 스레드들이 상이한 커널들 (예를 들어, 각각 제 1, 제 2, 및 제 3 커널들) 에 대한 것인 경우, 제 1 커널은 생성자 커널이라고 지칭될 수도 있고, 제 2 커널은 제 1 커널에 대한 소비자 커널 및 제 3 커널에 대한 생성자 커널이라고 지칭될 수도 있으며, 제 3 커널은 소비자 커널이라고 지칭될 수도 있다.
기존 GPU들에서, 파이프라인 방식으로 커널들을 실행하는 것은, 연산 및 파워 비효율적일 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 각각은, 프로그래머블 연산 유닛들에 의해 실행되어야 하는 명령들을 저장하기 위해, 처리되어야 하는 데이터를 저장하기 위해, 그리고 생성될 수도 있는 중간 결과들을 포함하여 생성되는 데이터를 저장하기 위해, 로컬 메모리를 포함할 수도 있다. 그러나, 프로그래머블 연산 유닛의 로컬 메모리는 임의의 다른 프로그래머블 연산 유닛들에 의해 액세스가능하지 않을 수도 있다.
따라서, 일부 예들에서, 파이프라인 방식으로 커널들을 실행하기 위해, GPU (16) 는 프로그래머블 연산 유닛의 로컬 메모리에 저장되는 생성된 데이터를 취출하고 생성된 데이터를 글로벌 메모리 (20) 에 저장할 수도 있다. 글로벌 메모리 (20) 에 데이터를 저장하는 것은, 글로벌 메모리 (20) 가 GPU (16) 를 하우징하는 집적 회로 외부에 (즉, IC (12) 외부에) 있기 때문에, 오프-칩의 데이터 저장이라고 지칭될 수도 있다. GPU (16) 는 그 후에 글로벌 메모리 (20) 에 저장된 데이터를 취출하고 취출된 데이터를 다른 프로그래머블 연산 유닛의 로컬 메모리에 로딩할 수도 있다.
일 예시적인 예로서, 제 1 프로그래머블 연산 유닛이 생성자 커널의 스레드들을 실행하고 있다고 가정한다. 이 예에서, 제 1 프로그래머블 연산 유닛은 생성자 커널의 스레드들의 실행에 의해 생성된 데이터를 제 1 프로그래머블 연산 유닛의 로컬 메모리에 저장할 수도 있다. GPU (16) 는 생성된 데이터를 제 1 프로그래머블 연산 유닛의 로컬 메모리로부터 취출하고 생성된 데이터를 글로벌 메모리 (20) 에 저장할 수도 있다.
이 예에서, 제 2 프로그래머블 연산 유닛이 소비자 커널의 스레드들을 실행하고 있다고 가정한다. 이 예에서, GPU (16) 는 생성자 커널에 의해 생성된 데이터를 글로벌 메모리 (20) 로부터 취출하고 그 데이터를 제 2 프로그래머블 연산 유닛의 로컬 메모리에 로딩할 수도 있다. 소비자 커널은 그 후에 제 2 프로그래머블 유닛의 로컬 메모리에 저장된 데이터를 소비할 수도 있다.
위의 예에서, 제 2 프로그래머블 연산 유닛이 제 1 프로그래머블 연산 유닛의 로컬 메모리에 대한 액세스를 갖지 않기 때문에, GPU (16) 는 생성자 커널에 의해 생성된 데이터를 글로벌 메모리 (20) 에 저장할 필요가 있을 수도 있다. 이러한 방법으로, 글로벌 메모리 (20) 는 후속하여 소비되어야 하는 생성된 데이터의 중간 저장부로서 기능한다.
일반적으로, 생성된 데이터가 저장되는 방식 및/또는 데이터가 글로벌 메모리 (20) 로부터 취출되는 방식을 관리하는 것은, 처리 및 연산 비효율적일 수도 있다. 하나의 예로서, 비효율적이지만, 데이터가 글로벌 메모리 (20) 에 저장되는 방식을 커널들이 관리하는 것이 가능할 수도 있다. 예를 들어, 커널들은, 프로그래머블 연산 유닛들의 산술 로직 유닛 (ALU) 들로 하여금, 데이터가 저장되어야 하거나 저장된 데이터가 취출되어야 하는 글로벌 메모리 (20) 내의 어드레스 (예를 들어, 포인터들) 를 결정하게 하는 명령들을 포함할 수 있다.
다른 예로서, 글로벌 메모리 (20) 는 어토믹 카운터 (atomic counter) 를 저장할 수도 있다. 어토믹 카운터의 값은 데이터가 소비되는 것이 가능한지 여부를 나타낼 수도 있다. 예를 들어, 생성자 커널은 글로벌 메모리 (20) 에 저장된 어토믹 카운터의 현재 값을 판독하라는 명령들을 포함할 수도 있다. 또한, 생성자 커널은 생성자 커널이 저장한 데이터의 양에 기초하여 어토믹 카운터의 값을 변경하는 명령들, 및 어토믹 카운터의 변경된 값을 다시 글로벌 메모리 (20) 에 기입하는 명령들을 포함할 수도 있다.
소비자 커널은 글로벌 메모리 (20) 에 저장된 어토믹 카운터의 값을 주기적으로 체크하라는 명령들을 포함할 수도 있다. 어토믹 카운터의 값이 충분히 크면, 소비자 커널은 소비될 데이터가 이용가능하다고 결정할 수도 있다. 예를 들어, 어토믹 카운터의 값이 X 이고, 생성자 커널은 N개의 데이터 양을 생성한다고 가정한다. 이 예에서, 소비자 커널은, 소비자 커널의 스레드들을 실행하고 있는 프로그래머블 연산 유닛으로 하여금, 어토믹 카운터의 값을 주기적으로 체크하게 하는 명령들을 포함할 수도 있다. 프로그래머블 연산 유닛이 어토믹 카운터의 값이 X 플러스 N 이라고 결정할 때, 프로그래머블 연산 유닛은 GPU (16) 에게 소비를 위해 저장된 데이터를 글로벌 메모리 (20) 로부터 취출하라고 요청할 수도 있다.
이러한 방법으로, 파이프라인 방식으로 커널들을 실행하는 소프트웨어 (즉, 커널의 명령들) 를 이용하는 것이 가능할 수도 있다. 그러나, 커널 내의 명령들을 이용하여 파이프라인 방식으로 커널들을 실행하는 것이 비효율적이라는 다양한 이유가 존재할 수도 있다. 예를 들어, 데이터를 저장하거나 또는 데이터가 글로벌 메모리 (20) 에 저장되는 어드레스들을 결정하기 위해 커널들에 명령들을 포함하는 것은, 프로그래머블 연산 유닛들의 ALU들에게 불필요하게 소비 파워를 요구할 수도 있을 뿐만 아니라, 글로벌 메모리 (20) 내의 어드레스들을 결정하기 위한 명령들을 처리하는 클록 사이클들을 낭비할 수도 있다.
또한, 어토믹 카운터의 값을 주기적으로 체크하는 것은, GPU (16) 에게 오프-칩의 (즉, 글로벌 메모리 (20) 내의) 정보에 액세스하는 것을 요구한다. 글로벌 메모리 (20) 로부터 어토믹 카운터의 값을 판독하고 어토믹 카운터의 변경된 값을 글로벌 메모리 (20) 에 기입하는 것은, 바람직하지 않은 양의 파워를 소비할 수도 있다. 또한, 예시된 바와 같이, IC (12) 는 메모리 버스 (24) 를 통해 글로벌 메모리 (20) 에 커플링된다. 메모리 버스 (24) 가 핸들링할 수 있는 데이터의 양에 대한 대역폭 제한들이 존재할 수도 있다. 따라서, GPU (16) 가 어토믹 카운터의 값을 판독하고 기입할 수 있는 경우에 지연이 있을 수도 있다.
또한, 데이터가 소비자 커널에 의해 소비되는 것이 가능할 때의 시간이 알려져 있지 않기 때문에, 소비자 커널을 실행하는 프로그래머블 연산 유닛은 주기적으로, GPU (16) 로 하여금, 데이터가 소비되는 것이 가능한지 여부를 결정하기 위해 어토믹 카운터의 값을 체크하게 할 수도 있다. 어토믹 카운터의 값을 주기적으로 체크하는 것은, 소비자 커널의 스레드들을 "스피닝 (spinning)" 상태로 남게 할 수도 있다. 예를 들어, 어토믹 카운터의 판독 값이 데이터가 소비를 위해 아직 충분히 이용가능하지 않다고 나타내는 경우, 프로그래머블 연산 유닛이 어토믹 카운터의 값을 한번 더 체크할 때까지, 프로그래머블 연산 유닛은 소비자 커널의 스레드들의 실행을 멈출 수도 있다. 데이터가 여전히 이용가능하지 않은 경우, 프로그래머블 연산 유닛은 다시 기다리고, GPU (16) 로 하여금 데이터가 이용가능한지 여부를 다시 체크하게 한다. 이 예에서, 소비자 커널의 스레드들은 소비될 데이터가 글로벌 메모리 (20) 에서 입수가능하지 않을 때의 시간 동안 비지-웨이트 (busy-wait) 상태에 있게 될 수도 있다. 다시 말해, 스피닝 동안, 프로그래머블 연산 유닛은 데이터의 소비를 지연시킬 수도 있는 임의의 기능들을 수행하고 있지 않을 수도 있다.
(예를 들어, 어토믹 카운터의 값을 판독함으로써) 프로그래머블 연산 유닛이 데이터가 이용가능한지 여부를 결정하는 빈도가 높다면, GPU (16) 는 글로벌 메모리 (20) 에 저장된 어토믹 카운터의 값을 너무 빈번하게 판독함으로써 파워를 낭비할 수도 있다. 프로그래머블 연산 유닛이 데이터가 이용가능한지 여부를 결정하는 빈도가 낮다면, 데이터가 이용가능한 때와 GPU (16) 가 데이터를 취출할 때 사이의 시간이 낭비될 수도 있어서, 또한 데이터의 소비를 지연시킨다.
또한, 글로벌 메모리 (20) 가 어토믹 카운터를 저장하는 위의 기법들 중 일부에서, 하나의 커널이 어토믹 카운터의 값을 판독, 변경, 및 기입하고 있을 때, 어떠한 다른 커널도 어토믹 카운터의 값을 판독, 변경, 또는 기입하도록 허용되지 않는다. 이러한 경우들에서, 2개의 생성자 스레드들이 동시에 글로벌 메모리 (20) 에의 저장을 위해 데이터를 출력할 필요가 있을 때, 스레드들 중 하나가 데이터를 출력하는 것이 가능할 것이지만, 다른 스레드는 데이터를 출력하는 것이 가능하지 않을 수도 있는데, 이는 이 다른 스레드가 어토믹 카운터에 액세스하는 것이 가능하지 않을 수도 있기 때문이다. 이러한 경우들에서, 저장 액세스가 거부된 스레드는, 어토믹 카운터로의 액세스가 가능하게 될 때까지 스피닝할 수도 있고, 어토믹 카운터가 액세스에 대해 가능하게 될 때, 저장 액세스를 거부한 스레드는 데이터를 글로벌 메모리 (20) 에 출력할 수도 있다. 이는 2개의 소비자 스레드들이 동시에 데이터에 액세스하려고 시도할 때 발생할 수도 있다.
본 개시물에 설명된 기법들은, 상술된 기법들에 비해, GPU (16) 로 하여금 파이프라인 방식으로 커널들을 더욱 효율적으로 실행하게 할 수도 있다. 더욱 상세히 설명되는 바와 같이, 파이프라인 관리 유닛 (PMU; 18) 은 다양한 스레드들에 의해 생성되는 데이터 및 다양한 스레드들에 의해 소비되는 데이터의 상태 정보를 저장하도록 구성될 수도 있다. 이러한 방식으로, GPU (16) 는, 데이터가 저장되는 장소 및 데이터가 소비를 위해 이용가능하게 될 때를 나타내는, 오프-칩의 정보에 연속적으로 액세스할 필요가 없을 수도 있다. 오히려, PMU (18) 는 이러한 정보를 내부에 (즉, IC (12) 내에) 저장할 수도 있다.
예시된 바와 같이, 글로벌 메모리 (20) 는 버퍼 (22A 내지 22N) (총칭하여 버퍼들 (22) 이라고 지칭됨) 를 포함할 수도 있다. 버퍼들 (22) 은 글로벌 메모리 (20) 내의 저장 위치들일 수도 있다. 버퍼들 (22) 의 예로는 선입 선출 (FIFO) 버퍼 또는 링 버퍼를 포함한다.
프로세서 (14) 는 글로벌 메모리 (20) 내에 상주하는 버퍼들의 수를 정의하고 글로벌 메모리 (20) 내의 저장 위치들을 예비해 두도록 구성될 수도 있다. 예를 들어, 프로세서 (14) 는 버퍼들 (22) 의 시작 위치와 끝 위치 (즉, 시작 어드레스와 끝 어드레스) 를 정의할 수도 있다. 프로세서 (14) 는 GPU (16) 의 쉐이더 프로세서 내에 상주하는 프로그래머블 연산 유닛들의 수에 기초하여 글로벌 메모리 (20) 내에 상주하는 버퍼들의 수를 정의할 수도 있다. 하나의 예로서, 프로세서 (14) 는 각각의 프로그래머블 연산 유닛에 대해 하나 이상의 입력 버퍼들 (22) (즉, 프로그래머블 연산 유닛들 상에서 실행하는 커널들에 의해 소비되는 데이터를 저장하는 하나 이상의 버퍼들) 및 각각의 프로그래머블 연산 유닛에 대해 0개 이상의 출력 버퍼들 (22) (즉, GPU (16) 의 프로그래머블 연산 유닛들 상에서 실행하는 커널들에 의해 생성된 데이터를 저장하는 0개 이상의 버퍼들) 이 존재하도록 글로벌 메모리 (20) 내에 상주하는 버퍼들의 수를 정의할 수도 있다.
또한, 프로세서 (14) 는 버퍼들의 사이즈를 정의하도록 구성될 수도 있다. 예를 들어, 프로세서 (14) 는 각각의 버퍼들 (22) 내의 저장 위치들의 수 (예를 들어, 버퍼들 (22) 의 길이) 를 정의하도록 구성될 수도 있다. 프로세서 (14) 는 또한 저장 위치들 각각에 저장될 수 있는 데이터의 양 (예를 들어, 버퍼들 (22) 의 폭) 을 정의할 수도 있다. 일부 예들에서, 프로세서 (14) 는 데이터를 버퍼들 (22) 에 미리 채울 수도 있다.
일부 예들에서, 프로세서 (14) 는 버퍼들 (22) 의 최소 수를 정의하도록 구성될 수도 있다. 하나의 예로서, 프로세서 (14) 는 최소의 128개의 버퍼들 (22) 을 정의하도록 구성될 수도 있다. 128 인 버퍼들 (22) 의 최소 수는 예시의 목적을 위해 제공된 것이고 제한하려고 간주되어서는 안된다. 버퍼들 (22) 의 최소 수는 128 보다 더 크거나 더 작을 수도 있다. 일부 예들에서, 버퍼들 (22) 의 최소 수에 대한 요건이 존재하지 않을 수도 있다.
프로세서 (14) 는 또한 버퍼들 (22) 의 상태를 결정하기 위해 다양한 명령들을 실행하도록 구성될 수도 있다. 예를 들어, 프로세서 (14) 는 버퍼들 (22) 에 저장된 데이터를 IC (12) 또는 GPU (16) 내의 버퍼들로 카피 (copy) 하라는 명령들 및 IC (12) 또는 GPU (16) 의 버퍼들 내에 저장된 데이터를 버퍼들 (22) 로 카피하라는 명령들을 실행할 수도 있다. 프로세서 (14) 는 또한 버퍼들 (22) 에 저장된 데이터의 양을 정의하는 명령들뿐만 아니라, (예를 들어, 버퍼들 (22) 이 손상되지 않은 것을 보장하기 위해) 버퍼들 (22) 의 길이와 폭을 확인하는 명령들을 실행할 수도 있다. 프로세서 (14) 로 하여금 버퍼들 (22) 의 상태를 결정하게 하는 명령들의 이러한 실행은, 모든 예에서 요구되지 않지만, 커널들의 개발자가 GPU (16) 보다는 오히려 프로세서 (14) 상에서 명령들을 실행함으로써 버퍼들 (22) 의 상태를 결정하는 것을 잠재적으로 도울 수도 있다.
일부 예들에서, 프로세서 (14) 는 버퍼들 (22) 에 대한 증폭 계수 (amplification factor) 를 정의하도록 구성될 수도 있다. 증폭 계수는 버퍼들 (22) 중 하나의 버퍼에 저장하기 위한 커널의 스레드에 의해 생성될 수 있는 엘리먼트들의 최대 수를 나타낼 수도 있다. 증폭 계수는, 데이터를 저장해야 하는 버퍼들 (22) 중 하나의 버퍼가 생성된 데이터 모두를 저장할 수 없는 상황들에 대해 필요할 수도 있다. 이는 버퍼들 (22) 에서의 불충분한 저장 공간으로 인해 커널의 실행을 지연시키는 것을 초래할 수도 있어서 (예를 들어, 커널이 실행의 상태로 결코 되돌아갈 수 없는 경우) 데드록 (deadlock) 에 이르게 할 수 있다.
이러한 데드록의 가능성을 최소화하기 위해, 프로세서 (14) 는 글로벌 메모리 (20) 의 큰 부분들을 예비 (예를 들어, 대부분의 임의의 타입의 데이터를 저장하기에 충분히 큰, 길고 넓은 버퍼들 (22) 을 정의) 해 둘 수도 있다. 이는 일부 경우들에 대해 잘 기능할 수도 있지만, 글로벌 메모리 (20) 의 큰 부분들을 예비해 두는 것이 가능하지 않을 수도 있는 다른 경우들에 대해서는 잘 기능하지 않을 수도 있다. 일부 경우들에서, 개발자들은 커널들이 너무 많은 데이터를 생성하지 않아서 데드록의 가능성을 최소화하도록 커널들을 개발할 수도 있다.
프로세서 (14) 가 버퍼들 (22) 을 정의하는 것으로 설명되지만, 본 개시물에 설명된 기법들은 이와 같이 제한되지 않는다. 일부 예들에서, 프로세서 (14) 이외의 처리 유닛은 버퍼들 (22) 을 정의하도록 구성될 수도 있다. 일부 예들에서, GPU (16) 가 버퍼들 (22) 을 정의하는 것이 가능할 수도 있다. 그러나, 설명의 용이를 위해, 이 기법들은 버퍼들 (22) 을 정의하는 프로세서 (14) 에 대해 설명된다.
프로세서 (14) 는 버퍼들 (22) 의 정보를 파이프라인 처리 유닛 (PMU; 18) 에 송신할 수도 있다. 예를 들어, PMU (18) 는 버퍼들 (22) 의 수, 버퍼들 (22) 의 시작 어드레스와 끝 어드레스, 버퍼들 (22) 의 길이와 폭, 및 프로세서 (14) 가 버퍼들 (22) 에 대해 결정한 임의의 다른 정보를 나타내는 정보를 수신할 수도 있다. PMU (18) 는 IC (12) 내에 위치된 레지스터들 내의 버퍼들 (22) 의 상태 정보를 저장할 수도 있다. 프로세서 (14) 로부터의 버퍼들 (22) 의 정보에 의해, 프로그래머블 연산 유닛들 상에서 실행하는 커널들의 스레드들이 데이터를 생성하고 소비함에 따라 PMU (18) 는 버퍼들 (22) 의 상태 정보를 관리하도록 구성될 수도 있다.
예를 들어, 커널의 스레드들을 실행하는 프로그래머블 연산 유닛이 데이터를 생성하고 그 생성된 데이터를 출력한 후에, PMU (18) 는 데이터를 수신하고, 그 데이터가 저장되어야 하는 어드레스를 결정할 수도 있다. 예를 들어, PMU (18) 는 버퍼들 (22) 중 어떤 버퍼에 데이터를 저장해야 하는지를 결정할 수도 있다. 버퍼들 (22) 이 링 버퍼들 또는 FIFO 버퍼들인 예들에서, PMU (18) 는 버퍼들 (22) 의 시작과 끝을 식별하는 포인터들에 대한 정보를 저장할 수도 있다. 링 버퍼들에 대해, PMU (18) 는 또한 유효 데이터의 시작과 유효 데이터의 끝을 식별하는 포인터들에 대한 정보를 저장할 수도 있다.
따라서, 프로그래머블 연산 유닛로 하여금, 생성된 데이터가 저장되어야 하거나 또는 데이터가 소비를 위해 취출되어야 하는 어드레스들을 결정하게 하는 명령들을 포함하는 커널들보다는 오히려, PMU (18) 는 생성된 데이터가 저장되어야 하거나 또는 데이터가 소비를 위해 취출되어야 하는 어드레스들을 결정하도록 구성될 수도 있다. 이러한 방법으로, GPU (16) 는 클록 사이클들을 낭비하지 않을 수도 있고, 프로그래머블 연산 유닛들의 ALU들은 데이터가 저장되어야 하거나 또는 데이터가 취출되어야 하는 어드레스들을 결정하는 처리 파워를 낭비하지 않을 수도 있다.
또한, PMU (18) 는 소비되어야 하는 데이터가 소비할 준비가 될 때를 결정하도록 구성될 수도 있다. 예를 들어, 어토믹 카운터를 저장하는 글로벌 메모리 (20) 보다는 오히려, PMU (18) 는 어토믹 카운터를 로컬로 IC (12) 내에 (예를 들어, IC (12) 내의 로컬 캐시 메모리에서의 레지스터들 내에) 저장할 수도 있다. 하나의 예로서, 생성자 스레드를 실행하는 프로그래밍 연산 유닛이 데이터를 출력할 때, PMU (18) 는 내부에 저장된 어토믹 카운터의 값을 판독하고, 생성된 데이터의 양에 기초하여 어토믹 카운터의 값을 변경하며, IC (12) 내에 어토믹 카운터의 변경된 값을 기입할 수도 있다. 이 예에서, 소비자 스레드를 실행하는 프로그래밍 연산 유닛이 어토믹 카운터의 값을 판독할 때, GPU (16) 는 오프-칩의 글로벌 메모리 (20) 에 액세스함으로써 어토믹 카운터의 값을 결정할 필요가 없을 수도 있다. 그 대신에, PMU (18) 는 어토믹 카운터의 값을 제공할 수도 있다.
일부 예들에서, 어토믹 카운터의 값을 로컬로 저장하는 PMU (18) 는 스피닝을 감소시킬 수도 있다. 예를 들어, 소비자 스레드를 실행하는 프로그래머블 연산 유닛은, 소비자 스레드에 의해 소비되어야 하는 데이터에 대한 요청을 출력할 수도 있다. 이 예에서, PMU (18) 는 (예를 들어, 로컬로 저장된 어토믹 카운터의 값에 기초하여) 소비되어야 하는 데이터가 이용가능한지 여부를 결정할 수도 있다.
데이터가 소비를 위해 아직 이용가능하지 않다고 PMU (18) 가 결정하는 경우, PMU (18) 는, 아직 이용가능하지 않은 데이터에 의존하지 않는 (예를 들어, 동일한 커널 또는 어쩌면 상이한 커널의) 상이한 스레드로 프로그래머블 연산 유닛이 스위칭해야 한다고 프로그래머블 연산 유닛에게 나타낼 수도 있다. 다시 말해, PMU (18) 는 프로그래머블 연산 유닛이 다른 스레드들을 계속 실행할 수 있도록, 아직 이용가능하지 않은 데이터를 필요로 하는 소비자 스레드가 슬립 (sleep) 하도록 두어야 한다고 나타낼 수도 있다. 그 후에, 어토믹 카운터의 로컬로 저장된 값에 기초하여 PMU (18) 에 의해 결정되는 바와 같이 그 데이터가 이용가능하게 될 때, PMU (18) 는 프로그래머블 연산 유닛에게 슬립하는 스레드로 다시 스위칭하라고 지시하여 (즉, 스레드를 어웨이크함 (awaken)) 프로그래머블 연산 유닛이 지금 이용가능한 데이터를 이용하여 소비자 스레드를 실행할 수 있도록 할 수도 있다. 이러한 방법으로, 데이터가 소비를 위해 아직 이용가능하지 않을 때, 소비자 스레드들을 실행하는 프로그래머블 연산 유닛은, 비지-웨이트 상태에 남아있기보다는 오히려, 커널의 다른 스레드들을 실행하는 것이 가능할 수도 있다.
다른 예로서, 상이한 프로그래머블 연산 유닛들 상에서 실행하는 동일한 커널의 2개의 생성자 스레드들이, 버퍼들 (22) 중 동일한 것에 동시에 데이터를 기입하려고 시도할 때, PMU (18) 는 생성자 스레드들 중 하나의 생성자 스레드로의 액세스를 허용하고 다른 생성자 스레드로의 액세스를 거부할 수도 있다. 이 예에서, PMU (18) 는, 액세스를 거부했던 스레드를 실행하는 프로그래머블 연산 유닛에게, 커널의 다른 스레드들을 실행하라고 지시할 수도 있다. PMU (18) 에 의해 결정되는 바와 같이 버퍼들 (22) 로의 기입 액세스가 이용가능하게 될 때, PMU (18) 는, 액세스를 거부했던 스레드를 실행하고 있었던 프로그래머블 연산 유닛에게, 버퍼들 (22) 로의 기입 액세스가 지금 이용가능하다고 나타낼 수도 있다. 이러한 방식으로, 액세스를 거부했던 스레드를 실행하는 프로그래머블 연산 유닛은, 부가적인 스레드들을 실행하는 것이 가능할 수도 있다.
이와 유사하게, 2개의 소비자 스레드들이 버퍼들 (22) 중 동일한 것으로부터 동시에 데이터를 판독하려고 시도할 때, PMU (18) 는 소비자 스레드들 중 하나의 소비자 스레드로의 액세스를 허용하고 다른 소비자 스레드로의 액세스를 거부할 수도 있다. 2개의 스레드들이 동시에 기입하고 있는 예와 유사하게, 2개의 스레드들이 동시에 판독하고 있는 이 예에서, PMU (18) 는 액세스를 거부했던 스레드를 실행하는 프로그래머블 연산 유닛에게 다른 스레드들을 실행하라고 지시할 수도 있다. PMU (18) 에 의해 결정되는 바와 같이 버퍼들 (22) 로의 판독 액세스가 이용가능하게 될 때, PMU (18) 는, 액세스를 거부했던 스레드를 실행하고 있었던 프로그래머블 연산 유닛에게, 버퍼들 (22) 로의 판독 액세스가 지금 이용가능하다고 나타낼 수도 있다. 이러한 방식으로, 액세스를 거부했던 스레드를 실행하는 프로그래머블 연산 유닛은, 부가적인 스레드들을 실행하는 것이 가능할 수도 있다.
이러한 방법으로, 글로벌 메모리 (20) 에서의 버퍼들 (22) 을 정의하는 프로세서 (14), 및 글로벌 메모리 (20) 에서의 버퍼들 (22) 의 상태를 관리하는 PMU (18) 는, GPU (16) 에 의한 파이프라인 방식으로의 커널들의 효율적인 실행을 가능하게 할 수도 있다. 하나의 예로서, PMU (18) 는 파이프라인 방식으로 커널들을 실행할 필요가 있는 오프-칩 액세스들의 수를 최소화할 수도 있다. 다른 예로서, PMU (18) 가 데이터가 저장되어야 하거나 또는 데이터가 취출되어야 하는 어드레스들을 결정할 수도 있기 때문에, GPU (16) 는 이러한 어드레스들을 결정하기 위한 커널들 내의 명령들을 실행함으로써 이러한 어드레스들을 결정하는 파워 및 클록 사이클들을 낭비하지 않을 수도 있다. 다시 말해, PMU (18) 는, 데이터가 저장 또는 취출되어어야 하는 장소를 결정하기 위한 명령들을 스레드들이 포함하는 일 없이도, 데이터가 저장 또는 취출되어야 하는 장소의 어드레스들을 결정할 수도 있다. 또한, PMU (18) 는 프로그래머블 연산 유닛들로 하여금 스피닝 없이 커널들의 스레드들을 실행하게 할 수도 있다. 예를 들어, 생성자 커널로부터의 데이터가 아직 이용가능하지 않을 때, PMU (18) 는 소비자 커널의 다른 스레드들 (예를 들어, 생성자 커널로부터 데이터를 요구하지 않는 스레드들) 이 실행하게 할 수도 있다.
도 2 는 그래픽 처리 유닛 (GPU) 및 글로벌 메모리를 더욱 상세히 예시한 블록도이다. 예를 들어, 도 2 는 도 1 의 GPU (16) 및 글로벌 메모리 (20) 를 더욱 상세히 예시한 것이다. 예시된 바와 같이, GPU (16) 는 쉐이더 프로세서 (26), 고정 기능 유닛 (30), 파이프라인 관리 유닛 (PMU; 18), 캐시 (34), 스케줄러 (40), 레지스터들 (44) 을 포함한다. 일부 예들에서, 레지스터들 (44) 은 캐시 (34) 의 부분일 수도 있다. 도 2 에 예시된 예에서, PMU (18) 는 GPU (16) 내에 형성되어 있는 것으로 예시된다. 그러나, 상술된 바와 같이, PMU (18) 는 GPU (16) 의 외측에, 그리고 GPU (16) 와 동일한 집적 회로에 형성될 수도 있다.
쉐이더 프로세서 (26) 는, 쉐이더 코어들로서 간주될 수도 있는 프로그래머블 연산 유닛 (28A 내지 28N) (보통 프로그래머블 연산 유닛들 (28) 이라고 지칭됨) 을 포함할 수도 있다. 고정 기능 유닛 (30) 은 고정 기능 연산 유닛 (32A 내지 32N) (보통 고정 기능 연산 유닛들 (32) 이라고 지칭됨) 을 포함한다. 쉐이더 프로세서 (26) 및 고정 기능 유닛 (30) 은 프로그래머블 연산 유닛들 (28) 및 고정 기능 유닛들 (32) 중 하나 이상을 (예를 들어, 예시된 것들보다 더 많거나 더 적게) 포함할 수도 있다.
프로그래머블 연산 유닛들 (28) 은 상술된 바와 같이 기능할 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 (28) 은 그래픽 및 논-그래픽 관련 애플리케이션들 (예를 들어, 쉐이더들 및 커널들) 양쪽 모두를 실행할 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 (28) 은 (예를 들어, OpenCL C 언어와 같은) 디바이스 언어로 기입되는 커널들을 실행할 수도 있다. 상술된 바와 같이, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은 그 프로그래머블 연산 유닛 (28) 상에서 실행하는 커널의 스레드들 간에서 공유하기 위해 그리고 중간 결과들을 저장하기 위해 로컬 메모리를 포함할 수도 있다. 프로그래머블 연산 유닛들 (28) 각각의 로컬 메모리는 다른 프로그래머블 연산 유닛들 (28) 에 의해 액세스가능하지 않을 수도 있다. 일부 예들에서, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은, 프로그래머블 연산 유닛들 (28) 중 다른 하나의 프로그래머블 연산 유닛이 커널의 스레드들을 실행해야 할 때의 시간을 스케줄링하는 것이 가능할 수도 있다.
일부 경우들에서, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은 프로그래머블 연산 유닛들 (28) 중 하나 이상의 다른 프로그래머블 연산 유닛들에게 데이터를 송신할 수도 있다. 예를 들어, 파이프라인 방식으로 커널들을 실행하기 위해, 생성자 스레드를 실행하는, 프로그래머블 연산 유닛들 (28) 중 제 1 프로그래머블 연산 유닛은, 데이터 (예를 들어, 논-그래픽 관련 데이터) 를 프로그래머블 연산 유닛들 (28) 중 제 2 프로그래머블 연산 유닛에게 출력할 수도 있다. 상술된 바와 같이, 프로그래머블 연산 유닛들 (28) 중 송신측 프로그래머블 연산 유닛 (예를 들어, 생성자 스레드를 실행하는 프로그래머블 연산 유닛) 은, 글로벌 메모리 (20) 의 버퍼들 (22) 중 하나의 버퍼와 같은 버퍼에 데이터를 저장할 수도 있고, 프로그래머블 연산 유닛들 (28) 중 수신측 프로그래머블 연산 유닛 (예를 들어, 소비자 스레드를 실행하는 프로그래머블 연산 유닛) 은, 글로벌 메모리 (20) 의 버퍼들 (22) 중 하나의 버퍼로부터 데이터를 취출할 수도 있다.
도 2 에 예시된 바와 같이, 일부 예들에서, GPU (16) 는 내부 캐시 (34) 를 포함할 수도 있다. 그러나, 캐시 (34) 는 GPU (16) 의 내부에 있는 것으로 제한되기보다는 오히려, IC (12) 의 내부에 있을 수도 있다. 일부 예들에서, 생성된 데이터를 오프-칩에 (예를 들어, 글로벌 메모리 (20) 에) 저장하기보다는 오히려, GPU (16) 가 GPU (16) 또는 IC (12) 의 내부에도 데이터를 저장하는 것이 가능할 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 (28) 중 송신측 프로그래머블 연산 유닛은 캐시 (34) 에서의 버퍼들 (36A 내지 36N) (총칭하여 버퍼들 (36) 이라고 지칭됨) 중 하나 이상에 데이터를 저장할 수도 있고, 이 캐시 (34) 는 도 2 의 예에서 GPU (16) 내에 있지만, IC (12) 내부에 그리고 GPU (16) 외부에 있을 수 있다. 프로그래머블 연산 유닛들 (28) 중 수신측 프로그래머블 연산 유닛은 캐시 (34) 에서의 버퍼들 (36) 로부터 데이터를 취출할 수도 있다. 캐시 (34) 내의 버퍼들은 글로벌 메모리 (20) 에서의 버퍼들 (22) 의 캐시-백킹된 버퍼들 (cache-backed buffers) 일 수도 있다. 다시 말해, 글로벌 메모리 (20) 의 버퍼들 (22) 은 소비자 스레드에 의해 소비되어야 하는 생성자 스레드에 의해 생성된 완전한 데이터를 저장할 수도 있고, 버퍼들 (36) 은 글로벌 메모리 (20) 로부터의 데이터에 액세스하는 것에 비해 빠른 액세스를 위해 생성된 데이터 중 일부를 저장하는 캐시로서 기능할 수도 있다.
캐시 (34) 내의 버퍼들 (36) 은 버퍼들 (22) 과 유사할 수도 있다. 예를 들어, 버퍼들 (36) 은 FIFO 버퍼들 또는 링 버퍼들일 수도 있다. 캐시 (34) 는 오프-칩 메모리 (예를 들어, 글로벌 메모리 (20) 의 버퍼들 (22)) 에 액세스하는 것과 연관된 메모리 레이턴시 및 파워 소비를 피하기 위해 버퍼들 (36) 을 포함하는 것이 바람직할 수도 있다. 그러나, 버퍼들 (36) 만을 활용하는 것은 저장을 위해 제한된 이용가능 공간으로 인해 현실적이지 않을 수도 있다. 이러한 방식으로, 버퍼들 (36) 내에 데이터 중 일부를 저장하고 버퍼들 (22) 로 확산되는 것을 허용하는 것이 가능할 수도 있다.
버퍼들 (36) 및 버퍼들 (22) 은 GPU (16) 로 하여금 파이프라인 방식으로 커널들을 실행하게 할 수도 있다. 예를 들어, 버퍼들 (36) 및 버퍼들 (22) 은 프로그래머블 연산 유닛들 (28) 사이의 통신을 위해 허용하는 데이터 구조들로서 간주될 수도 있다. 버퍼들 (36) 및 버퍼들 (22) 은 프로그래머블 연산 유닛들 상에서 실행하는 커널들이 출력할 수도 있는 데이터의 최소 양보다 더 많은 데이터 (예를 들어, 2개 이상의 데이터 유닛) 를 저장하도록 구성될 수도 있다. 이러한 방식으로, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛 상에서 실행하는 커널의 스레드들은, 소비를 위해, 프로그래머블 연산 유닛들 (28) 중 다른 하나의 프로그래머블 연산 유닛 상에서 실행하는 다른 커널의 스레드들로 전달될 수 있고 버퍼들 (36) 및 버퍼들 (22) 에 저장되는 가변 양의 데이터를 생성하는 것이 가능할 수도 있다.
고정 기능 연산 유닛들 (32) 은 (비제한적인 예로서) 하드웨어 유닛들로서 형성될 수도 있고 고정된 기능성을 제공할 수도 있다. 고정 기능 연산 유닛들 (32) 은 디바이스 언어를 이용하여 기입되는 특정 빌트인 커널들을 실행하는 것으로서 간주될 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 (28) 이 기능적 유연성을 제공할 수도 있지만, 고정 기능 연산 유닛들 (32) 은 이들 각각의 기능적 유연성에 있어서 제한될 수도 있다. 예를 들어, 고정 기능 연산 유닛들 (32) 은 래스터화 유닛들, 프리미티브 어셈블리 유닛들 (primitive assembly units), 뷰포트 변환 유닛, 및 특정 그래픽 기능성을 제공하는 다른 이러한 유닛들을 포함할 수도 있다.
일부 경우들에서, 고정 기능 연산 유닛들 (32) 은 이들의 각각의 특정 기능들을 수행하도록 하드와이어화될 (hardwired) 수도 있다. 또한, 고정 기능 연산 유닛들 (32) 은 고정 기능 연산 유닛들 (32) 중 다른 하나의 고정 기능 연산 유닛이 실행해야 할 때를 스케줄링하는 것이 가능할 수도 있다. 또한, 일부 경우들에서, GPU (16) 가 고정 기능 연산 유닛들 (32) 중 특정 고정 기능 연산 유닛을 포함하지 않는 경우, 이용가능하지 않은 고정 기능 연산 유닛의 기능을 수행하는 커널을 개발하는 것이 가능할 수도 있다. 다시 말해, 커널은 이용가능하지 않은 고정 기능 연산 유닛의 고정 기능 거동을 에뮬레이팅할 수도 있다. 예를 들어, 고정 기능 테셀레이터 (tessellator) 가 이용가능하지 않은 경우, 개발자는 테셀레이터의 고정 기능 거동을 에뮬레이팅하는 테셀레이션 커널을 개발하여 프로그래머블 연산 유닛들 (28) 중 하나 이상의 프로그래머블 연산 유닛 상에서 커널을 실행할 수도 있다.
일부 예들에서, GPU (16) 는 스케줄러 (40) 를 포함할 수도 있다. 스케줄러 (40) 는 스레드들 및 동작들을 다양한 프로그래머블 연산 유닛들 (28) 및 고정 기능 유닛들 (32) 에게 할당할 수도 있다. 예를 들어, 스케줄러 (40) 는 프로그래머블 연산 유닛들 (28) 중 어느 하나도 지나치게 활용되지 않는 한편 다른 것들이 덜 활용되지 않도록 프로그래머블 연산 유닛들 (28) 에 의해 수행된 태스크들을 로드 밸런싱할 수도 있다. 스케줄러 (40) 는 하드웨어 또는 하드웨어 상에서 실행하는 소프트웨어로서 구현될 수도 있다.
도 2 에서, 글로벌 메모리 (20) 는 버퍼 (42A 내지 42N) (총칭하여 버퍼들 (42) 이라고 지칭됨) 를 포함할 수도 있고, 캐시 (34) 는 버퍼 (38A 내지 38N) (총칭하여 버퍼들 (38) 이라고 지칭됨) 를 포함할 수도 있다. 버퍼들 (38) 은 반드시 모든 예에서 있을 필요는 없을 수도 있으며, 버퍼들 (42) 에 저장된 커맨드들에 대한 캐시-백킹된 저장을 제공하기 위한 옵션적인 온-칩 캐시로서 형성할 수도 있다. 버퍼들 (42) 및 버퍼들 (38) 은 커맨드 큐들로서 간주될 수도 있다. 모든 프로그래머블 연산 유닛들 (28) 에 대한 커맨드 큐 (예를 들어, 버퍼들 (42) 과 버퍼들 (38) 중 하나) 및 각 타입의 고정 기능 연산 유닛 (32) 에 대한 하나의 큐가 존재할 수도 있다. 버퍼들 (42) 및 버퍼들 (38) 은 0개 이상의 엔트리들을 저장할 수도 있다.
버퍼들 (42) 및 옵션적인 온-칩 버퍼들 (38) 은 프로그래머블 연산 유닛들 (28) 및 고정 기능 연산 유닛들 (32) 에 대한 워크로드 스케줄링을 조직화하는 것을 도울 수도 있다. 예를 들어, 버퍼들 (42) 은 프로그래머블 연산 유닛들 (28) 및 고정 기능 연산 유닛들 (32) 에게 다양한 태스크들을 수행하라고 지시하는 커맨드들을 저장할 수도 있다. 예를 들어, 버퍼들 (42) 에서의 각 엔트리는 이용가능한 하나 이상의 프로그래머블 연산 유닛들 (28) 로 하여금 커널들의 스레드들을 실행하게 하기 위한 정보를 저장할 뿐만 아니라, 커널 인수 값들 및 종속성 정보에 대한 정보를 저장할 수도 있다. 일부 예들에서, 커널의 스레드들 간의 종속성들은 하나 이상의 프로그래머블 연산 유닛들 (28) 이 커널을 실행하기 전에 만족될 필요가 있을 수도 있다.
버퍼들 (22) 은 프로세서 (14) (도 1) 와 GPU (16) 양쪽 모두에 의해 액세스가능할 수도 있다. 하나의 예로서, 프로세서 (14) 는 상술된 다양한 API들에 따른 콜 (call) 들을 이용하여 버퍼들 (22) 에 액세스할 수도 있다. GPU (16) 는 프로그래머블 연산 유닛들 (28) 상에서 실행된 커널들에 기초하여 버퍼들 (22) 에 액세스할 수도 있다. 예를 들어, 커널들은 생성된 데이터를 글로벌 메모리 (20) 에 저장하기 위한 기능들로 개발될 수도 있다.
예시된 바와 같이, GPU (16) 는 또한 파이프라인 관리 유닛 (PMU; 18) 을 포함할 수도 있다. 상술된 바와 같이, PMU (18) 는 글로벌 메모리 (20) 내의 버퍼들 (22) 의 상태를 관리할 수도 있다. 부가적으로, PMU (18) 는 캐시 (34) 내의 버퍼들 (36) 의 상태를 관리할 수도 있다.
예를 들어, PMU (18) 는, 생성된 데이터를 저장하는데 이용가능한 버퍼들 (22) 과 버퍼들 (36) 의 수를 포함하여, 버퍼들 (22) 과 버퍼들 (36) 의 길이와 폭을 저장함으로써 버퍼들 (22) 과 버퍼들 (36) 의 상태를 관리할 수도 있다. 하나의 예로서, PMU (18) 는 커널들이 프로그래머블 연산 유닛들 (28) 상에서 실행하기에 앞서 버퍼들 (22) 을 할당할 수도 있고, 커널들의 실행의 종료시 버퍼들 (22) 을 할당해제할 수도 있다.
다른 예로서, PMU (18) 는 헤더 포인터, 현재 오프셋, 최대 깊이 등에 대한 정보를 온-칩 레지스터들 (44) 에 저장할 수도 있다. 일부 예들에서, PMU (18) 는 그래픽 처리에서 텍스처 파라미터들이 저장되는 방법과 유사한 방식으로 버퍼들 (22) 과 버퍼들 (36) 의 정보를 명시할 수도 있다.
버퍼들 (22) 은 어떤 버퍼들 (22) 이 데이터를 저장하는지 또는 데이터를 취출하는지를 결정한다는 것, 데이터를 버퍼들에 저장해야 하거나 또는 데이터를 취출해야 할 저장 위치들을 결정 (예를 들어, 어드레스들을 결정) 한다는 것, 그리고 프로그래머블 연산 유닛들 (28) 의 상이한 것들이 데이터 손상을 야기하는 버퍼들로부터의 정보에 액세스하려고 시도하지 않은 것을 보장한다는 것의 의미에서의 관리를 요구할 수도 있다. PMU (18) 는 이러한 관리로 태스킹될 수도 있다. 예를 들어, PMU (18) 를 포함하는 GPU (16) 또는 PMU (18) 를 포함하는 GPU (16) 를 포함하는 IC 에 의해, 버퍼들 (22) 의 관리는 IC 의 외부보다는 오히려 GPU (16) 를 포함하는 IC 내로 로컬화될 수도 있다. 이는 프로그래머블 연산 유닛들 (28) 상에서 실행하는 커널들의 효율적인 실행뿐만 아니라 감소된 파워 소비를 발생시킬 수도 있다.
하나의 예로서, PMU (18) 는 어토믹 카운터를 레지스터들 (44) 내에 저장할 수도 있다. 레지스터들 (44) 은 캐시 (34) 의 부분, 또는 GPU (16) 또는 IC (12) 내의 어떤 다른 메모리의 부분일 수도 있다. 어토믹 카운터는, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛에 대한 액세스가 이용가능한지 여부 (예를 들어, 데이터가 판독되는 것이 가능한지 여부 또는 2개 이상의 커널들이 동일한 버퍼들 (22) 로부터 동시에 기입 또는 판독하려고 시도하고 있는지 여부) 를 나타낼 수도 있다. 어토믹 카운터에 기초하여, PMU (18) 는 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛으로의 액세스를 적절히 허용하는 한편, 2개의 스레드들이 동시에 데이터를 기입하려고 시도하는 경우에 발생할 수도 있는 버퍼들 (22) 의 데이터 손상을 피하기 위해 프로그래머블 연산 유닛들 (28) 중 다른 프로그래머블 연산 유닛들로의 액세스를 거부하는 것이 가능할 수도 있다. 일부 경우들에서, PMU (18) 가 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛으로의 액세스를 거부할 때, PMU (18) 는 그 액세스를 요청하는 태스크 (예를 들어, 스레드) 가 슬립하게 하고, 프로그래머블 연산 유닛들 (28) 중 거부된 하나의 프로그래머블 연산 유닛이 다른 태스크들 (예를 들어, 스레드들) 을 계속 실행하게 할 수도 있다. 프로그래머블 연산 유닛들 (28) 중 거부된 하나의 프로그래머블 연산 유닛으로의 액세스가 이용가능하게 될 때, PMU (18) 는 그 태스크를 어웨이크하여 미래의 실행을 위해 그 태스크에 데이터를 제공할 수도 있다. 이러한 방법으로, 프로그래머블 연산 유닛들 (28) 은 완전히 유휴 상태로 가지 않을 수도 있고, 프로그래머블 연산 유닛들 (28) 의 다른 태스크들이 실행할 수도 있다.
일부 예들에서, 데이터가 글로벌 메모리 (20) 의 하나의 버퍼들 (22) 로부터 취출될 필요가 있을 때, PMU (18) 는 필요한 데이터 이외에 부가적인 데이터를 취출하는 것이 가능할 수도 있다. 예를 들어, PMU (18) 는 요청된 데이터의 시작 위치와 끝 위치를 결정할 수도 있다. 그러나, PMU (18) 는 요청된 데이터의 결정된 끝 위치 이후에 버퍼들 (22) 에 저장되는 부가적인 데이터를 취출할 수도 있다. PMU (18) 는 저장 공간이 버퍼들 (36) 에서 이용가능하다고 PMU (18) 가 결정할 때 이러한 부가적인 데이터를 취출할 수도 있다. 상술된 바와 같이, PMU (18) 는 글로벌 메모리 (20) 에서의 버퍼들 (22) 뿐만 아니라, 캐시 (34) 내의 버퍼들 (36) 양쪽 모두를 관리할 수도 있다. PMU (18) 는 그 후에, 취출된 데이터를 캐시 (34) 에 저장할 수도 있다. 이러한 방식으로, 부가적인 데이터는, 이 데이터가 필요하게 될 때 GPU (16) 내에서 이미 이용가능하다. 부가적인 데이터 (예를 들어, 요청된 데이터 이외의 데이터) 를 버퍼들 (36) 에 저장하는 것은, GPU (16) 가 오프-칩의 (예를 들어, 글로벌 메모리 (20) 로부터의) 데이터에 액세스해야 하는 횟수를 더욱 감소시킬 수도 있다.
데이터에 액세스하기 위해, 프로그래머블 연산 유닛들 (28) 은 버퍼들에 액세스하기 위해 포인터들을 활용할 수도 있다 (예를 들어, 커널들은 포인터들을 이용하여 데이터에 액세스하도록 개발될 수도 있다). 일부 예들에서, PMU (18) 는 프로그래머블 연산 유닛들 (28) 이 데이터에 적절히 액세스하는 것이 가능하도록 포인터 정보를 유지할 수도 있다. 예를 들어, 프로그래머블 연산 유닛들 (28) 은 PMU (18) 에게 버퍼들 (22) 에 관한 정보를 요청하는 특수화된 명령들을 출력할 수도 있다. 이러한 명령들은 버퍼들 내의 엘리먼트들의 수, 얼마나 많은 데이터가 버퍼 내에 저장되어 있는지 (예를 들어, 버퍼의 폭), 정보가 저장된 장소, 및 다른 이러한 정보에 대한 정보를 포함할 수도 있다. 이러한 방식으로, 프로그래머블 연산 유닛들 (28) 이 적절히 버퍼들 (22) 에 액세스하는 것을 보장하는 것은, GPU (16) 를 하우징하는 IC 에 내부적으로 수행될 수도 있고, 이는 어쩌면 GPU (16) 를 하우징하는 IC 외부로의 액세스를 감소시킨다.
하나의 예로서, 데이터가 손상 또는 손실되지 않은 것을 보장하기 위해, 생성자 커널은 버퍼들 (22) 의 범위 (예를 들어, 시작 포인트와 끝 포인트) 를 쿼리하라는 명령들을 포함하도록 개발될 수도 있다. 이 예에서, 생성자 커널을 실행하고 있는, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은, 버퍼들 (22) 의 범위의 쿼리를 PMU (18) 에 출력할 수도 있다. PMU (18) 는 버퍼들 (22) 의 범위의 정보를 (예를 들어, 프로세서 (14) 가 버퍼들 (22) 을 정의했을 때 프로세서 (14) 로부터 이러한 정보를 수신함으로써) 레지스터들 (44) 에 저장하였을 수도 있다. PMU (18) 는 버퍼들 (22) 의 범위의 결과를 생성자 커널에게 리턴할 수도 있다.
다른 예로서, 파이프라인 방식으로 커널들을 실행하기 위해, 일부 예들에서, 파이프라인에 데이터의 순서를 유지할 필요가 있을 수도 있다. 예를 들어, 제 2 커널에 의해 소비되어야 하는 데이터를 제 1 커널이 생성해야 한다고 가정한다. 그러나, 이 경우, 제 1 및 제 2 커널들이 실행하고 있는 동일한 시간 동안 제 3 커널이 또한 실행하고 있는 것이 가능할 수도 있다. 이 경우, 제 1 커널에 의해 생성된 데이터 및 제 3 커널에 의해 생성된 데이터가 재순서화되는 것이 가능하여, 어쩌면 제 2 커널이 올바르지 않은 데이터를 소비하게 될 수도 있다.
적절한 순서화를 보장하기 위해, 일부 예들에서, 버퍼들 (22) 이 액세스하기에 이용가능한지 여부를 나타내는 어토믹 카운터 이외에도, PMU (18) 는 부가적인 어토믹 카운터들을 레지스터들 (44) 에 저장할 수도 있다. 이들 부가적인 어토믹 카운터들은 디바이스-어토믹 카운터들이라고 지칭될 수도 있다. 예를 들어, 버퍼들 (22) 의 각 버퍼와 연관된 디바이스-어토믹 카운터가 존재할 수도 있다. 또한, PMU (18) 또는 스케줄러 (40) 는, 각 커널의 각 스레드에, 그 스레드에 의해 생성된 데이터가 버퍼들 (22) 에 저장되어야 하는 장소의 상대 위치를 정의하는 토큰을 할당하도록 구성될 수도 있다. 스레드에 대한 이러한 토큰은 디바이스-어토믹 카운터의 현재 값일 수도 있다.
예를 들어, PMU (18) 는 첫 번째로 데이터를 소비해야 하는 제 1 소비자 스레드에 0 의 토큰 값을 할당하고, 두 번째로 데이터를 소비해야 하는 제 2 소비자 스레드에 1 의 토큰 값을 할당하는 것 등을 할 수도 있다. 이들 소비자 스레드들 각각은 PMU (18) 로부터 디바이스-어토믹 카운터의 값을 요청할 수도 있다. 디바이스-어토믹 카운터의 현재 값이 소비자 스레드의 토큰 값과 동일하다면, 소비자 스레드는 데이터를 소비할 수도 있다. 그렇지 않다면, 소비자 스레드는 데이터를 소비하지 않을 수도 있다.
토큰 값이 디바이스-어토믹 카운터의 값과 동일한 소비자 스레드가 데이터를 소비한 후에, PMU (18) 는 디바이스-어토믹 카운터의 값을 업데이트할 수도 있다. 일부 예들에서, 소비자 스레드가 소비해야 하는 데이터의 양은 고정될 수도 있고, PMU (18) 는 그 고정된 양의 데이터가 버퍼들 (22) 로부터 취출된 후에 디바이스-어토믹 카운터의 값을 업데이트할 수도 있다. 그러나, 일부 예들에서, 소비자 스레드가 소비해야 하는 데이터의 양은 고정되지 않을 수도 있다. 이들 예들에서, 소비자 스레드가 데이터를 수신하는 것을 완료한 후에, 소비자 스레드는, 다음 소비자 스레드가 데이터를 소비할 수 있도록 PMU (18) 가 디바이스-어토믹 카운터의 값을 증가시켜야 한다고 PMU (18) 에게 나타낼 수도 있다. 이러한 방식으로, PMU (18) 가 레지스터들 (44) 에 저장하고 업데이트할 수도 있는 디바이스-어토믹 카운터의 값은, 데이터가 소비되어야 하는 순서가 보호되어야 하는 것, 및 데이터를 순서없이 수신해서는 안되는 소비자 스레드들이 데이터를 순서없이 수신하지 않는다는 것을 보장할 수도 있다.
다른 예로서, PMU (18) 는 데드록의 가능성을 최소화하기 위해 정보를 레지스터들 (44) 에 저장할 수도 있다. 예를 들어, 상술된 바와 같이, 프로세서 (14) 는, 버퍼들 (22) 중 하나의 버퍼에 저장하기 위해 커널의 스레드에 의해 생성될 수 있는 엘리먼트들의 최대 수를 나타내는, 버퍼들 (22) 에 대한 증폭 계수를 정의하도록 구성될 수도 있다. 커널이 증폭 계수로 정의된 것보다 더 많은 데이터를 생성한다면, 커널은 데드록될 수도 있다 (예를 들어, 실행이 중단될 수도 있다). 프로세서 (14) 는 증폭 계수의 값을 PMU (18) 에 제공할 수도 있고, PMU (18) 는 증폭 계수의 값을 레지스터들 (44) 내에 저장할 수도 있다.
일부 예들에서, 데드록의 가능성을 최소화하기 위해, 개발자는 증폭 계수의 값을 요청하는 명령들을 커널에 포함시킬 수도 있다. 커널을 실행하는 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은, 증폭 계수의 값에 대한 요청을 PMU (18) 에게 출력할 수도 있다. 이어서, PMU (18) 는 커널을 실행하는 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛에게 증폭 계수의 값을 나타낼 수도 있다. 프로그래머블 연산 유닛 (28) 이 커널의 스레드들에 의해 생성된 데이터의 양이 증폭 계수보다 더 크다고 결정하는 경우, 프로그래머블 연산 유닛 (28) 은, 생성된 데이터의 양이 증폭 계수와 동일하다면 커널의 실행을 중단할 수도 있고, 이미 생성된 데이터가 소비되었다면 커널의 나머지 스레드들의 실행을 스케줄링할 수도 있다.
데드록을 최소화하기 위한 위의 기법 이외에도 또는 그 대신에, PMU (18) 는 생성된 데이터가 증폭 계수와 동일할 때까지 PMU (18) 가 데이터를 버퍼들 (22) 에 저장할 수도 있게 하는 사전 스케줄링 (advance scheduling) 을 구현할 수도 있다. PMU (18) 는 그 후에 나머지 데이터를 버퍼들 (36) 에 저장할 수도 있다. 다시 말해, PMU (18) 는 데이터를 버퍼 (22) 에 저장하라는 요청들이 "안전" 범위 내에 있다는 것, 및 데이터를 버퍼 (22) 에 저장하라는 임의의 요청이 대신에 버퍼 (36) 에 저장했다는 것을 보장할 수도 있다.
도 3 은 본 개시물에 설명된 하나 이상의 예들에 따른 일 예시적인 기법을 예시한 플로차트이다. 도 3 에 예시된 바와 같이, 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은 GPU (16) 의 쉐이더 프로세서 (26) 상에서 커널의 하나 이상의 스레드들을 실행할 수도 있다 (46). IC (12) 내에 있거나 또는 GPU (16) 내에 있는 PMU (18) 는, 커널의 하나 이상의 스레드들을 위해, IC (12) 외부에 있는 글로벌 메모리 (20) 에 데이터를 저장하거나 이 글로벌 메모리 (20) 로부터 데이터를 취출하라는 요청을 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛으로부터 수신할 수도 있다 (48).
PMU (18) 는 데이터의 저장 또는 취출을 요청한 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛에 대해 액세스가 허용가능한지 여부를 결정할 수도 있다 (50). 액세스가 이용가능하지 않은 경우 (50 의 아니오), 프로그래머블 연산 유닛들 (28) 중 하나의 프로그래머블 연산 유닛은 커널의 부가적인 스레드들을 실행할 수도 있다 (52). 이 예에서, PMU (18) 는 액세스가 이용가능할 때를 하나의 프로그래머블 연산 유닛에게 나타낼 수도 있다.
액세스가 이용가능한 경우 (50 의 예), 하나의 프로그래머블 연산 유닛 (28) 은, 데이터가 저장 또는 취출되어야 하는 글로벌 메모리 (20) 에서의 버퍼 (버퍼들 (22) 중 하나) 내의 위치를 결정할 수도 있다 (52). 예를 들어, PMU (18) 는 데이터가 저장되어야 하거나 또는 데이터가 취출되어야 하는 글로벌 메모리 (20) 내의 위치 (즉, 어드레스) 를 결정할 수도 있다 (54). 결정된 위치에 기초하여, 그 후에 GPU (16) 는 글로벌 메모리 (20) 내의 버퍼들 (22) 중 하나의 버퍼 내의 결정된 위치에 데이터를 저장하거나 또는 그 위치로부터 데이터를 취출할 수도 있다 (56).
일부 예들에서, 버퍼들 (22) 중 하나의 버퍼 내의 위치를 결정하기 위해, PMU (18) 는 데이터가 글로벌 메모리 (20) 에 저장되거나 또는 글로벌 메모리 (20) 로부터 취출되어야 하는 위치를 커널의 하나 이상의 스레드들이 나타내는 일 없이 위치를 결정할 수도 있다. 이러한 방법으로, 커널들은 데이터를 저장하거나 또는 데이터가 취출되어야 하는 글로벌 메모리 (20) 내의 위치를 결정하기 위한 명령들을 포함할 필요는 없다.
일부 예들에서, PMU (18) 는 요청된 데이터 이외의 데이터를 취출할 수도 있다. 이들 예들에서, PMU (18) 는 부가적인 데이터를 캐시 (34) 에 저장할 수도 있다. 일부 예들에서, PMU (18) 는 프로세서 (14) 로부터 버퍼들 (22) 의 상태 정보를 수신할 수도 있다. 이들 예들에서, PMU (18) 는 수신된 상태 정보에 기초하여 데이터가 저장 또는 취출되어야 하는 하나의 버퍼 (22) 내의 위치를 결정할 수도 있다.
도 4 는 본 개시물에 설명된 하나 이상의 예들에 따른 다른 예시적인 기법을 예시한 플로차트이다. 예시된 바와 같이, GPU (16) 의 쉐이더 프로세서 (26) 의 제 1 프로그래머블 연산 유닛 (예를 들어, 프로그래머블 연산 유닛들 (28) 중 하나) 은 제 1 스레드를 실행할 수도 있다 (58). GPU (16) 의 쉐이더 프로세서 (26) 의 제 2 프로그래머블 연산 유닛 (예를 들어, 프로그래머블 연산 유닛들 (28) 중 다른 하나) 은 상이한 제 2 스레드를 실행할 수도 있다 (60).
GPU (16) 를 포함하는 IC (12) 내에 있는 PMU (18) 는, 제 1 스레드의 실행에 의해 생성된 데이터를, IC (12) 외부에 있는 글로벌 메모리 (20) 에서의 버퍼 (예를 들어, 버퍼들 (22) 중 하나) 에 저장하라는 요청을 제 1 프로그래머블 연산 유닛으로부터 수신할 수도 있다 (62). 이 예에서, 제 1 스레드 (예를 들어, 생성자 스레드) 의 실행에 의해 생성된 데이터는, 제 2 스레드 (예를 들어, 소비자 스레드) 를 실행하는 제 2 프로그래머블 연산 유닛에 의해 소비되어야 한다. 또한, 버퍼는 선입 선출 (FIFO) 버퍼와 링 버퍼 중 하나일 수도 있고, 여기서 링 버퍼는 FIFO 버퍼의 하나의 예이다.
PMU (18) 는 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정할 수도 있다 (64). IC (12) 는 제 1 스레드의 실행에 의해 생성된 데이터를 버퍼 내의 결정된 위치에 저장할 수도 있다 (66). 제 1 스레드의 실행에 의해 생성된 데이터를 버퍼 내의 결정된 위치에 저장하는 IC (12) 는, 데이터를 저장하는 IC (12), 데이터를 저장하는 GPU (16), 및/또는 데이터를 저장하는 PMU (18) 를 포함한다는 것을 이해해야 한다. 다시 말해, 데이터를 저장하는 IC (12) 는 데이터를 저장하는 IC (12) 또는 IC (12) 내의 임의의 컴포넌트를 의미한다.
일부 예들에서, PMU (18) 는 버퍼들 (22) 의 상태 정보를 IC (12) 내에 (예를 들어, 레지스터들 (44) 내에) 저장할 수도 있다. PMU (18) 는 프로세서 (14) 로부터 버퍼들 (22) 의 이러한 상태 정보를 수신할 수도 있다. 버퍼들 (22) 의 상태 정보는 버퍼들 (22) 의 시작 어드레스, 버퍼들 (22) 의 끝 어드레스, 생성된 데이터가 저장되어야 하는 버퍼들 (22) 내의 어드레스, 및 데이터가 취출되어야 하는 버퍼들 내의 어드레스 중 하나 이상을 포함할 수도 있다. 이들 예들에서, PMU (18) 는 버퍼들 (22) 의 저장된 상태 정보에 기초하여 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정할 수도 있다. 또한, 일부 예들에서, PMU (18) 는 데이터가 버퍼에 저장되어야 하는 위치를 제 1 스레드가 나타내는 일 없이 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 버퍼 내의 위치를 결정할 수도 있다.
PMU (18) 는 또한 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛으로부터, 제 1 스레드의 실행에 의해 생성된 데이터의 적어도 일부를 취출하라는 요청을 수신할 수도 있다. PMU (18) 는, 제 1 스레드의 실행에 의해 생성되는 데이터가, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능한지 여부를 결정할 수도 있다. 일부 예들에서, PMU (18) 는, 제 1 프로그래머블 연산 유닛으로부터의 요청을 수신하는 것과 동시에, 수신하기 이전에, 또는 수신한 이후에, 제 1 스레드의 실행에 의해 생성된 데이터를 저장하라는 요청을 제 2 프로그래머블 연산 유닛으로부터 수신할 수도 있다.
제 2 스레드에 의해 요청된 데이터가, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능하지 않을 때, PMU (18) 는 제 3 스레드를 실행하라고 제 2 프로그래머블 연산 유닛에게 지시할 수도 있다. PMU (18) 는 또한, 제 2 스레드에 의해 요청된 데이터가, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때를 제 2 프로그래머블 연산 유닛에게 나타낼 수도 있다. PMU (18) 는 또한, 제 2 스레드에 의해 요청된 데이터가, 제 2 스레드를 실행하는 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때, 제 2 스레드에 의해 요청된 데이터를 소비하기 위해 제 2 스레드를 실행하라고 제 2 프로그래머블 연산 유닛에게 지시할 수도 있다.
일부 경우들에서, 제 1 스레드는 커널의 생성자 스레드일 수도 있고, 제 2 스레드는 동일한 커널의 소비자 스레드일 수도 있다. 일부 경우들에서, 제 1 스레드는 생성자 커널의 스레드일 수도 있고, 제 2 스레드는 소비자 커널의 스레드일 수도 있다.
도 5 는 도 1 의 디바이스를 더욱 상세히 에시한 블록도이다. 예를 들어, 도 5 는 디바이스 (10) 를 더욱 예시한 것이다. 디바이스 (10) 의 예로는, 무선 디바이스들, 모바일 전화기들, 개인 휴대 정보 단말기 (PDA) 들, 비디오 디스플레이들을 포함하는 비디오 게이밍 콘솔들, 모바일 비디오 회의 유닛들, 랩톱 컴퓨터들, 데스크톱 컴퓨터들, 텔레비전 셋톱 박스들, 태블릿 컴퓨팅 디바이스들, 이북 판독기들 (e-book readers) 등을 포함하지만, 이들로 제한되지 않는다. 디바이스 (10) 는 프로세서 (14), GPU (16), 글로벌 메모리 (20), 디스플레이 (68), 사용자 인터페이스 (70), 및 트랜시버 모듈 (72) 을 포함할 수도 있다. 예시된 예에서, PMU (18) 는 GPU (16) 내에 형성된다. 일부 예들에서, PMU (18) 는 GPU (16) 를 하우징하는 동일한 IC (즉, IC (12)) 내에 형성될 수도 있다. 또한 예시된 바와 같이, GPU (16) 는 IC (12) 내에 상주한다. 그러나, 프로세서 (14) 도 또한 IC (12) 내에 상주할 수도 있다.
디바이스 (10) 는 명확성을 위해 도 4 에 도시되지 않은 부가적인 모듈들 또는 유닛들을 포함할 수도 있다. 예를 들어, 디바이스 (10) 는, 디바이스 (10) 가 모바일 무선 전화기인 예들에서 전화 통신들을 달성하기 위해, 도 4 에 도시되지 않은 스피커와 마이크로폰을 포함할 수도 있다. 또한, 디바이스 (10) 에 도시된 다양한 모듈들 및 유닛들은 디바이스 (10) 의 모든 예에서 필수적인 것은 아닐 수도 있다. 예를 들어, 디바이스 (10) 가 데스크톱 컴퓨터인 예들에서 사용자 인터페이스 (70) 및 디스플레이 (68) 는 디바이스 (10) 외부에 있을 수도 있다. 다른 예로서, 디스플레이 (68) 가 모바일 디바이스의 터치-감응형 또는 존재-감응형 디스플레이인 예들에서 사용자 인터페이스 (70) 는 디스플레이 (68) 의 부분일 수도 있다.
도 4 의 프로세서 (14), GPU (16), PMU (18), 및 글로벌 메모리 (20) 는 도 1 의 프로세서 (14), GPU (16), PMU (18), 및 글로벌 메모리 (20) 와 유사할 수도 있다. 사용자 인터페이스 (70) 의 예로는 트랙볼, 마우스, 키보드, 및 다른 타입들의 입력 디바이스들을 포함하지만, 이들로 제한되지 않는다. 사용자 인터페이스 (70) 는 또한 터치 스크린일 수도 있고 디스플레이 (68) 의 부분으로서 통합될 수도 있다. 트랜시버 모듈 (72) 은 디바이스 (10) 와 다른 디바이스 또는 네트워크 사이의 무선 또는 유선 통신을 허용하는 회로부를 포함할 수도 있다. 트랜시버 모듈 (72) 은 변조기들, 복조기들, 증폭기들 및 유선 또는 무선 통신을 위한 다른 이러한 회로부를 포함할 수도 있다. 디스플레이 (68) 는 액정 디스플레이 (LCD), 음극선관 (CRT) 디스플레이, 플라즈마 디스플레이, 터치-감응형 디스플레이, 존재-감응형 디스플레이, 또는 다른 타입의 디스플레이 디바이스를 포함할 수도 있다.
하나 이상의 예들에서, 설명된 기능들은 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현된다면, 그 기능들은 컴퓨터 판독가능 매체 상에 하나 이상의 명령들 또는 코드로서 저장되고 하드웨어 기반 처리 유닛에 의해 실행될 수도 있다. 컴퓨터 판독가능 매체는 유형의 매체, 예컨대 데이터 저장 매체, 또는 예를 들어, 통신 프로토콜에 따라, 일 장소로부터 다른 장소로의 컴퓨터 프로그램의 전송을 용이하게 하는 임의의 매체를 포함하는 통신 매체에 대응하는, 컴퓨터 판독가능 저장 매체를 포함할 수도 있다. 이러한 방식으로, 컴퓨터 판독가능 매체는 일반적으로 (1) 비일시적인 유형의 컴퓨터 판독가능 저장 매체 또는 (2) 신호 또는 반송파와 같은 통신 매체에 대응할 수도 있다. 데이터 저장 매체는 본 개시물에 설명된 기법들의 구현을 위한 명령들, 코드 및/또는 데이터 구조들을 취출하기 위해 하나 이상의 컴퓨터들 또는 하나 이상의 프로세서들에 의해 액세스될 수 있는 임의의 이용가능한 매체일 수도 있다. 컴퓨터 프로그램 제품은 컴퓨터 판독가능 매체를 포함할 수도 있다.
제한이 아닌 일 예로, 이러한 컴퓨터 판독가능 저장 매체는 RAM, ROM, EEPROM, CD-ROM 또는 다른 광 디스크 저장, 자기 디스크 저장, 또는 다른 자기 저장 디바이스들, 플래시 메모리, 또는 명령들 또는 데이터 구조들의 형태로 원하는 프로그램 코드를 저장하는데 사용될 수 있고 컴퓨터에 의해 액세스될 수 있는 임의의 다른 매체를 포함할 수 있다. 또한, 임의의 문맥이 적절히 컴퓨터 판독가능 매체로 지칭된다. 예를 들어, 명령들이 동축 케이블, 광섬유 케이블, 트위스티드 페어, 디지털 가입자 회선 (DSL), 또는 적외선, 무선 및 마이크로파와 같은 무선 기술들을 이용하여 웹사이트, 서버 또는 다른 원격 소스로부터 송신된다면, 매체의 정의에는, 동축 케이블, 광섬유 케이블, 트위스티드 페어, DSL, 또는 적외선, 무선 및 마이크로파와 같은 무선 기술들이 포함된다. 그러나, 컴퓨터 판독가능 저장 매체 및 데이터 저장 매체는 연결들, 반송파들, 신호들 또는 다른 일시적 매체를 포함하지 않고, 그 대신에 비일시적 유형의 저장 매체와 관련되는 것으로 이해되어야 한다. 디스크 (disk) 및 디스크 (disc) 는, 여기에 사용된 바와 같이, 콤팩트 디스크 (CD), 레이저 디스크, 광 디스크, 디지털 다기능 디스크 (DVD), 플로피 디스크 및 블루레이 디스크를 포함하며, 여기서 디스크 (disk) 는 보통 데이터를 자기적으로 재생시키는 한편, 디스크 (disc) 는 레이저를 이용하여 데이터를 광학적으로 재생시킨다. 위의 조합들이 또한 컴퓨터 판독가능 매체의 범주 내에 포함되어야 한다.
명령들은 하나 이상의 프로세서들, 예컨대, 하나 이상의 디지털 신호 프로세서 (DSP) 들, 범용 마이크로프로세서들, 주문형 집적 회로 (ASIC) 들, 필드 프로그래머블 게이트 어레이 (FPGA) 들, 또는 다른 등가의 집적 또는 이산 논리 회로부에 의해 실행될 수도 있다. 따라서, 용어 "프로세서" 는, 여기에 사용된 바와 같이, 임의의 전술한 구조 또는 여기에 설명된 기법들의 구현에 적합한 임의의 다른 구조를 지칭할 수도 있다. 또한, 일부 양태들에서, 여기에 설명된 기능성은 인코딩 및 디코딩하기 위해 구성된 전용 하드웨어 및/또는 소프트웨어 모듈들 내에 제공되거나, 또는 결합된 코덱에 통합될 수도 있다. 또한, 그 기법들은 하나 이상의 회로들 또는 로직 엘리먼트들 내에 완전히 구현될 수 있다.
본 개시물의 기법들은 무선 핸드셋, 집적 회로 (IC) 또는 IC들의 세트 (예를 들어, 칩 세트) 를 포함하는, 매우 다양한 디바이스들 또는 장치들에서 구현될 수도 있다. 다양한 컴포넌트들, 모듈들 또는 유닛들은 개시된 기법들을 수행하도록 구성된 디바이스들의 기능적 양태들을 강조하기 위해 본 개시물에서 설명되지만, 반드시 상이한 하드웨어 유닛들에 의한 실현을 요구하지는 않는다. 오히려, 상술된 바와 같이, 다양한 유닛들은 코덱 하드웨어 유닛에 결합되거나, 또는 적합한 소프트웨어 및/또는 펌웨어와 함께, 상술된 바와 같은 하나 이상의 프로세서들을 포함하는, 상호동작적인 하드웨어 유닛들의 콜렉션에 의해 제공될 수도 있다.
다양한 예들이 설명되었다. 이들 예 및 다른 예들은 하기의 청구범위의 범주 내에 있다.
Claims (23)
- 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법으로서,
그래픽 처리 유닛 (graphics processing unit; GPU) 의 쉐이더 프로세서 (shader processor) 의 제 1 프로그래머블 연산 유닛 (programmable compute unit) 상에서 제 1 스레드를 실행하는 단계로서, 상기 쉐이더 프로세서는 상기 제 1 프로그래머블 연산 유닛을 포함하는 복수의 프로그래머블 연산 유닛들을 포함하는, 상기 제 1 스레드를 실행하는 단계;
상기 GPU 의 상기 쉐이더 프로세서의 상기 복수의 프로그래머블 연산 유닛들중 제 2 프로그래머블 연산 유닛 상에서 제 2 스레드를 실행하는 단계;
상기 GPU 를 포함하는 집적 회로 (integrated circuit; IC) 내의 관리 유닛에 의해 직접, 상기 제 1 스레드의 실행에 의해 생성된 데이터를 상기 복수의 프로그래머블 연산 유닛들에 의해 공유되는 상기 IC 외부의 집적 글로벌 메모리에서의 버퍼에 저장하라는 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하는 단계로서, 상기 제 1 스레드의 실행에 의해 생성된 데이터는, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의해 소비되어야 하고, 상기 버퍼는 선입 선출 (first-in-first-out; FIFO) 버퍼를 포함하는, 상기 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하는 단계;
상기 관리 유닛에 의해 직접, 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하는 단계; 및
상기 IC 에 의해, 상기 제 1 스레드의 실행에 의해 생성된 데이터를, 상기 버퍼 내의 결정된 상기 위치에 저장하는 단계
를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 관리 유닛에 의해, 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하는 단계 전에, 상기 버퍼의 상태 정보를 상기 IC 내에 저장하는 단계를 더 포함하고,
상기 버퍼의 상태 정보는, 상기 버퍼의 시작 어드레스, 상기 버퍼의 끝 어드레스, 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 어드레스, 및 데이터가 취출되어야 하는 상기 버퍼 내의 어드레스 중 하나 이상을 포함하고,
상기 버퍼 내의 위치를 결정하는 단계는, 저장된 상기 버퍼의 상태 정보에 기초하여, 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하는 단계를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 관리 유닛에 의해, 상기 제 1 프로그래머블 연산 유닛 상에서 상기 제 1 스레드를 실행하는 단계 후에, 상기 제 1 스레드의 실행에 의해 생성된 데이터의 적어도 일부를 취출하라는 요청을, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛으로부터 수신하는 단계; 및
상기 관리 유닛에 의해, 상기 제 1 스레드의 실행에 의해 생성된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능한지 여부를 결정하는 단계
를 더 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 3 항에 있어서,
상기 요청을 상기 제 2 프로그래머블 연산 유닛으로부터 수신하는 단계는, 상기 제 1 스레드의 실행에 의해 생성된 데이터를 저장하라는 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하는 것과 동시에, 수신하기 이전에, 또는 수신한 이후에, 상기 요청을 상기 제 2 프로그래머블 연산 유닛으로부터 수신하는 단계를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 3 항에 있어서,
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능하지 않을 때, 상기 관리 유닛에 의해, 제 3 스레드를 실행하라고 상기 제 2 프로그래머블 연산 유닛에게 지시하는 단계;
상기 관리 유닛에 의해, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때를, 상기 제 2 프로그래머블 연산 유닛에게 나타내는 단계; 및
상기 관리 유닛에 의해, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터를 소비하기 위해 상기 제 2 스레드를 실행하라고 상기 제 2 프로그래머블 연산 유닛에게 지시하는 단계
를 더 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 3 항에 있어서,
상기 관리 유닛에 의해, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터 이외의 데이터를 상기 글로벌 메모리로부터 취출하는 단계; 및
상기 관리 유닛에 의해, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터 이외의 데이터를 상기 IC 내의 캐시에 저장하는 단계
를 더 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 제 1 스레드를 실행하는 단계는, 커널의 생성자 스레드 (producer thread) 를 실행하는 단계를 포함하고,
상기 제 2 스레드를 실행하는 단계는, 상기 커널의 소비자 스레드 (consumer thread) 를 실행하는 단계를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 제 1 스레드를 실행하는 단계는, 생성자 커널의 제 1 스레드를 실행하는 단계를 포함하고,
상기 제 2 스레드를 실행하는 단계는, 소비자 커널의 스레드를 실행하는 단계를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 GPU 는 상기 관리 유닛을 포함하고,
상기 FIFO 버퍼는 링 버퍼를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 제 1 항에 있어서,
상기 버퍼 내의 위치를 결정하는 단계는, 상기 데이터가 상기 버퍼에 저장되어야 하는 위치를 상기 제 1 스레드가 나타내는 일 없이 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하는 단계를 포함하는, 파이프라인 방식으로의 데이터 처리 동작들의 실행을 위한 방법. - 장치로서,
복수의 프로그래머블 연산 유닛들에 의해 공유되는, 버퍼를 포함하는 집적 글로벌 메모리; 및
집적 회로 (IC)
를 포함하고,
상기 버퍼는 선입 선출 (FIFO) 버퍼를 포함하고,
상기 집적 회로 (IC) 는,
그래픽 처리 유닛 (GPU); 및
관리 유닛
을 포함하고,
상기 GPU 는,
상기 복수의 프로그래머블 연산 유닛들;
제 1 스레드를 실행하도록 구성된 상기 복수의 프로그래머블 연산 유닛들 중 제 1 프로그래머블 연산 유닛; 및
제 2 스레드를 실행하도록 구성된 상기 복수의 프로그래머블 연산 유닛들 중 제 2 프로그래머블 연산 유닛
을 포함하고,
상기 관리 유닛은,
상기 제 1 스레드의 실행에 의해 생성된 데이터를 상기 글로벌 메모리에서의 상기 버퍼에 저장하라는 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 직접 수신하는 것으로서, 상기 제 1 스레드의 실행에 의해 생성된 데이터는, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의해 소비되어야 하는, 상기 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 직접 수신하고;
상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 직접 결정하도록
구성되고,
상기 IC 는, 상기 제 1 스레드의 실행에 의해 생성된 데이터를, 상기 버퍼 내의 결정된 상기 위치에 저장하도록 구성되는, 장치. - 제 11 항에 있어서,
상기 관리 유닛은, 상기 버퍼의 상태 정보를 상기 IC 내에 저장하도록 구성되고,
상기 버퍼의 상태 정보는, 상기 버퍼의 시작 어드레스, 상기 버퍼의 끝 어드레스, 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 어드레스, 및 데이터가 취출되어야 하는 상기 버퍼 내의 어드레스 중 하나 이상을 포함하고,
상기 관리 유닛은, 저장된 상기 버퍼의 상태 정보에 기초하여, 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하도록 구성되는, 장치. - 제 11 항에 있어서,
상기 관리 유닛은,
상기 제 1 스레드의 실행에 의해 생성된 데이터의 적어도 일부를 취출하라는 요청을, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛으로부터 수신하고;
상기 제 1 스레드의 실행에 의해 생성된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능한지 여부를 결정하도록
구성되는, 장치. - 제 13 항에 있어서,
상기 관리 유닛은, 상기 제 1 스레드의 실행에 의해 생성된 데이터를 저장하라는 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하는 것과 동시에, 수신하기 이전에, 또는 수신한 이후에, 상기 요청을 상기 제 2 프로그래머블 연산 유닛으로부터 수신하도록 구성되는, 장치. - 제 13 항에 있어서,
상기 관리 유닛은,
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능하지 않을 때, 제 3 스레드를 실행하라고 상기 제 2 프로그래머블 연산 유닛에게 지시하고;
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때를, 상기 제 2 프로그래머블 연산 유닛에게 나타내며;
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터가, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의한 소비를 위한 취출을 위해 이용가능할 때, 상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터를 소비하기 위해 상기 제 2 스레드를 실행하라고 상기 제 2 프로그래머블 연산 유닛에게 지시하도록
구성되는, 장치. - 제 13 항에 있어서,
상기 관리 유닛은,
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터 이외의 데이터를 상기 글로벌 메모리로부터 취출하고;
상기 제 2 프로그래머블 연산 유닛에 의해 요청된 데이터 이외의 데이터를 상기 IC 내의 캐시에 저장하도록
구성되는, 장치. - 제 11 항에 있어서,
상기 제 1 스레드는, 커널의 생성자 스레드를 포함하고,
상기 제 2 스레드는, 상기 커널의 소비자 스레드를 포함하는, 장치. - 제 11 항에 있어서,
상기 제 1 스레드는, 생성자 커널의 스레드를 포함하고,
상기 제 2 스레드는, 소비자 커널의 스레드를 포함하는, 장치. - 제 11 항에 있어서,
상기 GPU 는 상기 관리 유닛을 포함하고,
상기 FIFO 버퍼는 링 버퍼를 포함하는, 장치. - 제 11 항에 있어서,
상기 관리 유닛은, 상기 데이터가 상기 버퍼에 저장되어야 하는 위치를 상기 제 1 스레드가 나타내는 일 없이 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하도록 구성되는, 장치. - 제 11 항에 있어서,
상기 장치는, 비디오 디바이스, 셋톱 박스, 무선 핸드셋, 개인 휴대 정보 단말기 (personal digital assistant), 데스크톱 컴퓨터, 랩톱 컴퓨터, 게이밍 콘솔, 비디오 회의 유닛, 및 태블릿 컴퓨팅 디바이스 중 하나를 포함하는, 장치. - 장치로서,
복수의 프로그래머블 연산 유닛들에 의해 공유되는, 버퍼를 포함하는 집적 글로벌 메모리; 및
집적 회로 (IC)
를 포함하고,
상기 버퍼는 선입 선출 (FIFO) 버퍼를 포함하고,
상기 집적 회로 (IC) 는 그래픽 처리 유닛 (GPU) 을 포함하고,
상기 그래픽 처리 유닛 (GPU) 은,
제 1 스레드를 실행하는 수단;
제 2 스레드를 실행하는 수단;
상기 제 1 스레드의 실행에 의해 생성된 데이터를 상기 글로벌 메모리에서의 상기 버퍼에 저장하라는 요청을, 상기 제 1 스레드를 실행하는 수단으로부터 직접 수신하는 수단으로서, 상기 제 1 스레드의 실행에 의해 생성된 데이터는, 상기 제 2 스레드를 실행하는 수단에 의해 소비되어야 하는, 상기 제 1 스레드를 실행하는 수단으로부터 직접 수신하는 수단;
상기 제 1 스레드를 실행하는 수단에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 직접 결정하는 수단; 및
상기 제 1 스레드의 실행에 의해 생성된 데이터를, 상기 버퍼 내의 결정된 상기 위치에 저장하는 수단
을 포함하는, 장치. - 명령들을 저장한 비일시적 컴퓨터 판독가능 저장 매체로서,
상기 명령들은, 실행될 때, 하나 이상의 프로세서들로 하여금,
그래픽 처리 유닛 (GPU) 의 쉐이더 프로세서의 제 1 프로그래머블 연산 유닛 상에서 제 1 스레드를 실행하게 하는 것으로서, 상기 쉐이더 프로세서는 상기 제 1 프로그래머블 연산 유닛을 포함하는 복수의 프로그래머블 연산 유닛들을 포함하는, 상기 제 1 스레드를 실행하게 하고;
상기 GPU 의 상기 쉐이더 프로세서의 상기 복수의 프로그래머블 연산 유닛들중 제 2 프로그래머블 연산 유닛 상에서 제 2 스레드를 실행하게 하고;
상기 GPU 를 포함하는 집적 회로 (IC) 내의 관리 유닛에 의해 직접, 상기 제 1 스레드의 실행에 의해 생성된 데이터를 상기 복수의 프로그래머블 연산 유닛들에 의해 공유되는 상기 IC 외부의 집적 글로벌 메모리에서의 버퍼에 저장하라는 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하게 하는 것으로서, 상기 제 1 스레드의 실행에 의해 생성된 데이터는, 상기 제 2 스레드를 실행하는 상기 제 2 프로그래머블 연산 유닛에 의해 소비되어야 하고, 상기 버퍼는 선입 선출 (FIFO) 버퍼를 포함하는, 상기 요청을 상기 제 1 프로그래머블 연산 유닛으로부터 수신하게 하고;
상기 관리 유닛에 의해 직접, 상기 제 1 스레드의 실행에 의해 생성된 데이터가 저장되어야 하는 상기 버퍼 내의 위치를 결정하게 하며;
상기 IC 에 의해, 상기 제 1 스레드의 실행에 의해 생성된 데이터를, 상기 버퍼 내의 결정된 상기 위치에 저장하게 하는, 비일시적 컴퓨터 판독가능 저장 매체.
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201261591733P | 2012-01-27 | 2012-01-27 | |
US61/591,733 | 2012-01-27 | ||
US13/747,947 US9256915B2 (en) | 2012-01-27 | 2013-01-23 | Graphics processing unit buffer management |
US13/747,947 | 2013-01-23 | ||
PCT/US2013/022900 WO2013112692A1 (en) | 2012-01-27 | 2013-01-24 | Buffer management for graphics parallel processing unit |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20140125821A KR20140125821A (ko) | 2014-10-29 |
KR101707289B1 true KR101707289B1 (ko) | 2017-02-27 |
Family
ID=48869818
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020147023719A KR101707289B1 (ko) | 2012-01-27 | 2013-01-24 | 그래픽 병렬 처리 유닛에 대한 버퍼 관리 |
Country Status (7)
Country | Link |
---|---|
US (1) | US9256915B2 (ko) |
EP (1) | EP2807646A1 (ko) |
JP (1) | JP6081492B2 (ko) |
KR (1) | KR101707289B1 (ko) |
CN (1) | CN104081449B (ko) |
BR (1) | BR112014018434B1 (ko) |
WO (1) | WO2013112692A1 (ko) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022022937A1 (en) | 2020-07-31 | 2022-02-03 | Morphotonics Holding B.V. | Assembly for replicating flexible stamps from a master |
Families Citing this family (46)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10817043B2 (en) * | 2011-07-26 | 2020-10-27 | Nvidia Corporation | System and method for entering and exiting sleep mode in a graphics subsystem |
US9304730B2 (en) | 2012-08-23 | 2016-04-05 | Microsoft Technology Licensing, Llc | Direct communication between GPU and FPGA components |
CN103810124A (zh) * | 2012-11-09 | 2014-05-21 | 辉达公司 | 用于数据传输的系统及方法 |
US9977683B2 (en) * | 2012-12-14 | 2018-05-22 | Facebook, Inc. | De-coupling user interface software object input from output |
US10176621B2 (en) * | 2013-06-10 | 2019-01-08 | Sony Interactive Entertainment Inc. | Using compute shaders as front end for vertex shaders |
US10096079B2 (en) | 2013-06-10 | 2018-10-09 | Sony Interactive Entertainment Inc. | Fragment shaders perform vertex shader computations |
US10102603B2 (en) | 2013-06-10 | 2018-10-16 | Sony Interactive Entertainment Inc. | Scheme for compressing vertex shader output parameters |
US10134102B2 (en) * | 2013-06-10 | 2018-11-20 | Sony Interactive Entertainment Inc. | Graphics processing hardware for using compute shaders as front end for vertex shaders |
US9659399B2 (en) * | 2013-08-23 | 2017-05-23 | Nvidia Corporation | System, method, and computer program product for passing attribute structures between shader stages in a graphics pipeline |
WO2015074239A1 (en) * | 2013-11-22 | 2015-05-28 | Intel Corporation | Method and apparatus to improve performance of chained tasks on a graphics processing unit |
US9589311B2 (en) * | 2013-12-18 | 2017-03-07 | Intel Corporation | Independent thread saturation of graphics processing units |
US9679347B2 (en) * | 2014-02-18 | 2017-06-13 | Qualcomm Incorporated | Shader pipeline with shared data channels |
US10055342B2 (en) * | 2014-03-19 | 2018-08-21 | Qualcomm Incorporated | Hardware-based atomic operations for supporting inter-task communication |
US9710245B2 (en) * | 2014-04-04 | 2017-07-18 | Qualcomm Incorporated | Memory reference metadata for compiler optimization |
KR102263326B1 (ko) | 2014-09-18 | 2021-06-09 | 삼성전자주식회사 | 그래픽 프로세싱 유닛 및 이를 이용한 그래픽 데이터 처리 방법 |
GB2524346B (en) * | 2014-09-19 | 2016-12-21 | Imagination Tech Ltd | Separating Cores |
US9412147B2 (en) | 2014-09-23 | 2016-08-09 | Apple Inc. | Display pipe line buffer sharing |
US9659407B2 (en) * | 2015-01-26 | 2017-05-23 | MediaTek Singapore, Pte. Lte. | Preemptive flushing of spatial selective bins for deferred graphics processing |
US9652817B2 (en) | 2015-03-12 | 2017-05-16 | Samsung Electronics Co., Ltd. | Automated compute kernel fusion, resizing, and interleave |
CN104899039B (zh) | 2015-06-12 | 2018-12-25 | 百度在线网络技术(北京)有限公司 | 用于在终端设备上提供截屏服务的方法和装置 |
US10515430B2 (en) | 2015-11-03 | 2019-12-24 | International Business Machines Corporation | Allocating device buffer on GPGPU for an object with metadata using access boundary alignment |
CN108986015B (zh) * | 2015-11-17 | 2022-12-06 | 格兰菲智能科技有限公司 | 数据单元的关联性检查方法以及使用该方法的装置 |
CN105446939B (zh) * | 2015-12-04 | 2019-02-26 | 上海兆芯集成电路有限公司 | 由装置端推核心入队列的装置 |
US10025741B2 (en) * | 2016-01-13 | 2018-07-17 | Samsung Electronics Co., Ltd. | System-on-chip, mobile terminal, and method for operating the system-on-chip |
US9799089B1 (en) * | 2016-05-23 | 2017-10-24 | Qualcomm Incorporated | Per-shader preamble for graphics processing |
WO2017209876A1 (en) * | 2016-05-31 | 2017-12-07 | Brocade Communications Systems, Inc. | Buffer manager |
US10572399B2 (en) * | 2016-07-13 | 2020-02-25 | Qualcomm Incorporated | Memory request arbitration |
US20180122037A1 (en) * | 2016-10-31 | 2018-05-03 | Intel Corporation | Offloading fused kernel execution to a graphics processor |
JP6817827B2 (ja) * | 2017-01-23 | 2021-01-20 | Necプラットフォームズ株式会社 | アクセラレータ処理管理装置、ホスト装置、アクセラレータ処理実行システム、方法およびプログラム |
US10430919B2 (en) * | 2017-05-12 | 2019-10-01 | Google Llc | Determination of per line buffer unit memory allocation |
US11163546B2 (en) * | 2017-11-07 | 2021-11-02 | Intel Corporation | Method and apparatus for supporting programmatic control of a compiler for generating high-performance spatial hardware |
US11068308B2 (en) * | 2018-03-14 | 2021-07-20 | Texas Instruments Incorporated | Thread scheduling for multithreaded data processing environments |
US10810064B2 (en) | 2018-04-27 | 2020-10-20 | Nasdaq Technology Ab | Publish-subscribe framework for application execution |
US11397694B2 (en) | 2019-09-17 | 2022-07-26 | Micron Technology, Inc. | Memory chip connecting a system on a chip and an accelerator chip |
US11416422B2 (en) | 2019-09-17 | 2022-08-16 | Micron Technology, Inc. | Memory chip having an integrated data mover |
US11163490B2 (en) * | 2019-09-17 | 2021-11-02 | Micron Technology, Inc. | Programmable engine for data movement |
CN111078395B (zh) * | 2019-11-12 | 2023-06-20 | 华中科技大学 | 一种基于张量的深度学习gpu内存管理优化方法及系统 |
US11263064B2 (en) * | 2019-12-30 | 2022-03-01 | Qualcomm Incorporated | Methods and apparatus to facilitate improving processing of machine learning primitives |
US11250538B2 (en) | 2020-03-09 | 2022-02-15 | Apple Inc. | Completion signaling techniques in distributed processor |
US11416961B2 (en) | 2020-05-29 | 2022-08-16 | Samsung Electronics Co., Ltd. | Variable entry transitional ring storage for efficiently accessing graphics states |
CN112104731B (zh) * | 2020-09-11 | 2022-05-20 | 北京奇艺世纪科技有限公司 | 请求处理方法、装置、电子设备和存储介质 |
US11989554B2 (en) * | 2020-12-23 | 2024-05-21 | Intel Corporation | Processing pipeline with zero loop overhead |
CN113457160B (zh) * | 2021-07-15 | 2024-02-09 | 腾讯科技(深圳)有限公司 | 数据处理方法、装置、电子设备及计算机可读存储介质 |
US20240193844A1 (en) * | 2022-12-08 | 2024-06-13 | Advanced Micro Devices, Inc. | Configurable multiple-die graphics processing unit |
CN115599574B (zh) * | 2022-12-12 | 2023-03-24 | 北京象帝先计算技术有限公司 | 图形处理系统、电子组件、电子设备及信息处理方法 |
CN116048816B (zh) * | 2023-03-23 | 2023-08-22 | 摩尔线程智能科技(北京)有限责任公司 | 数据请求处理方法、装置、电子设备和存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040160446A1 (en) | 2003-02-18 | 2004-08-19 | Gosalia Anuj B. | Multithreaded kernel for graphics processing unit |
JP2007122537A (ja) | 2005-10-31 | 2007-05-17 | Sony Computer Entertainment Inc | 描画処理装置、並列処理装置および排他制御方法 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2500101B2 (ja) | 1992-12-18 | 1996-05-29 | インターナショナル・ビジネス・マシーンズ・コーポレイション | 共用変数の値を更新する方法 |
US7117481B1 (en) | 2002-11-06 | 2006-10-03 | Vmware, Inc. | Composite lock for computer systems with multiple domains |
TWI322354B (en) * | 2005-10-18 | 2010-03-21 | Via Tech Inc | Method and system for deferred command issuing in a computer system |
US7928990B2 (en) | 2006-09-27 | 2011-04-19 | Qualcomm Incorporated | Graphics processing unit with unified vertex cache and shader register file |
US8087029B1 (en) | 2006-10-23 | 2011-12-27 | Nvidia Corporation | Thread-type-based load balancing in a multithreaded processor |
US8135926B1 (en) | 2008-10-21 | 2012-03-13 | Nvidia Corporation | Cache-based control of atomic operations in conjunction with an external ALU block |
US8392925B2 (en) | 2009-03-26 | 2013-03-05 | Apple Inc. | Synchronization mechanisms based on counters |
JP2010287110A (ja) * | 2009-06-12 | 2010-12-24 | Nec Personal Products Co Ltd | 情報処理装置、情報処理方法、プログラム及び記録媒体 |
BR112012001629B1 (pt) | 2009-07-28 | 2019-10-22 | Ericsson Telefon Ab L M | método de sincronizar o processamento de eventos associados com sessões de aplicação em uma plataforma de processamento de telecomunicações, adaptador de recursos, e, agrupamento de java enterprise edition |
US9324175B2 (en) | 2009-09-11 | 2016-04-26 | Nvidia Corporation | Memory coherency in graphics command streams and shaders |
US8817031B2 (en) * | 2009-10-02 | 2014-08-26 | Nvidia Corporation | Distributed stream output in a parallel processing unit |
US8810592B2 (en) * | 2009-10-09 | 2014-08-19 | Nvidia Corporation | Vertex attribute buffer for inline immediate attributes and constants |
WO2012012440A1 (en) * | 2010-07-19 | 2012-01-26 | Advanced Micro Devices, Inc. | Data processing using on-chip memory in multiple processing units |
US20120092351A1 (en) | 2010-10-19 | 2012-04-19 | Apple Inc. | Facilitating atomic switching of graphics-processing units |
US9092267B2 (en) | 2011-06-20 | 2015-07-28 | Qualcomm Incorporated | Memory sharing in graphics processing unit |
-
2013
- 2013-01-23 US US13/747,947 patent/US9256915B2/en active Active
- 2013-01-24 CN CN201380006620.XA patent/CN104081449B/zh active Active
- 2013-01-24 BR BR112014018434-8A patent/BR112014018434B1/pt active IP Right Grant
- 2013-01-24 JP JP2014554817A patent/JP6081492B2/ja active Active
- 2013-01-24 WO PCT/US2013/022900 patent/WO2013112692A1/en active Application Filing
- 2013-01-24 EP EP13704848.4A patent/EP2807646A1/en not_active Ceased
- 2013-01-24 KR KR1020147023719A patent/KR101707289B1/ko active IP Right Grant
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040160446A1 (en) | 2003-02-18 | 2004-08-19 | Gosalia Anuj B. | Multithreaded kernel for graphics processing unit |
JP2007122537A (ja) | 2005-10-31 | 2007-05-17 | Sony Computer Entertainment Inc | 描画処理装置、並列処理装置および排他制御方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022022937A1 (en) | 2020-07-31 | 2022-02-03 | Morphotonics Holding B.V. | Assembly for replicating flexible stamps from a master |
Also Published As
Publication number | Publication date |
---|---|
BR112014018434A2 (pt) | 2017-06-20 |
JP6081492B2 (ja) | 2017-02-15 |
BR112014018434A8 (pt) | 2017-07-11 |
JP2015513715A (ja) | 2015-05-14 |
CN104081449B (zh) | 2016-11-09 |
US9256915B2 (en) | 2016-02-09 |
BR112014018434B1 (pt) | 2021-07-27 |
KR20140125821A (ko) | 2014-10-29 |
CN104081449A (zh) | 2014-10-01 |
WO2013112692A1 (en) | 2013-08-01 |
US20130194286A1 (en) | 2013-08-01 |
EP2807646A1 (en) | 2014-12-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101707289B1 (ko) | 그래픽 병렬 처리 유닛에 대한 버퍼 관리 | |
US9779469B2 (en) | Register spill management for general purpose registers (GPRs) | |
KR101931073B1 (ko) | 프로세싱 유닛을 위한 프레임 기반 클럭 레이트 조정 | |
EP2820540B1 (en) | Execution model for heterogeneous cpu-gpu computing | |
KR102009125B1 (ko) | 프로세서 주파수 및 버스 대역폭의 활성 및 스톨 사이클 기반 동적 스케일링 | |
KR101558069B1 (ko) | 범용 그래픽스 프로세싱 유닛에서의 컴퓨테이션 리소스 파이프라이닝 | |
EP3161817A1 (en) | Load scheme for shared register in gpu | |
US20230113415A1 (en) | Gpr optimization in a gpu based on a gpr release mechanism | |
US9171525B2 (en) | Graphics processing unit with a texture return buffer and a texture queue | |
EP3991131B1 (en) | Methods and apparatus for wave slot management | |
US9165396B2 (en) | Graphics processing unit with a texture return buffer and a texture queue | |
US9437172B2 (en) | High-speed low-power access to register files | |
US11954758B2 (en) | Dynamic wave pairing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
A302 | Request for accelerated examination | ||
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant |