KR20160148673A - Simd 프로세싱 시스템에 있어서의 직렬화된 실행을 위한 기법들 - Google Patents
Simd 프로세싱 시스템에 있어서의 직렬화된 실행을 위한 기법들 Download PDFInfo
- Publication number
- KR20160148673A KR20160148673A KR1020167033480A KR20167033480A KR20160148673A KR 20160148673 A KR20160148673 A KR 20160148673A KR 1020167033480 A KR1020167033480 A KR 1020167033480A KR 20167033480 A KR20167033480 A KR 20167033480A KR 20160148673 A KR20160148673 A KR 20160148673A
- Authority
- KR
- South Korea
- Prior art keywords
- threads
- instruction
- active
- processing elements
- processor
- Prior art date
Links
- 238000012545 processing Methods 0.000 title claims description 165
- 238000000034 method Methods 0.000 title claims description 64
- 238000004891 communication Methods 0.000 description 29
- 230000008569 process Effects 0.000 description 17
- 238000010586 diagram Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 230000004044 response Effects 0.000 description 6
- 230000004913 activation Effects 0.000 description 3
- 239000008186 active pharmaceutical agent Substances 0.000 description 3
- 238000013459 approach Methods 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 238000007796 conventional method Methods 0.000 description 2
- 230000009849 deactivation Effects 0.000 description 2
- 230000009191 jumping Effects 0.000 description 2
- 230000002441 reversible effect Effects 0.000 description 2
- 230000001360 synchronised effect Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 241000699670 Mus sp. Species 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 230000001143 conditioned effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/3009—Thread control instructions
-
- 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
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- 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/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- 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
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- 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
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3888—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
- Hardware Redundancy (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
SIMD 프로세서는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하고, 그리고 선택된 활성 스레드 상에서 발산 동작을 수행하도록 구성될 수도 있다. 발산 동작은 직렬 동작일 수도 있다.
Description
본 개시는 멀티-스레딩 (multi-threaded) 프로세싱에 관한 것으로서, 더 상세하게는, 단일 명령 다중 데이터 (SIMD) 프로세싱 시스템에 있어서의 직렬화된 실행을 위한 기법들에 관한 것이다.
단일 명령 다중 데이터 (SIMD) 프로세싱 시스템은, 다중의 데이터 피스들에 대해 동일한 명령을 실행하는 다중의 프로세싱 엘리먼트들을 포함하는 병렬 컴퓨팅 시스템들의 클래스이다. SIMD 시스템은 자립형 컴퓨터 또는 컴퓨팅 시스템의 서브-시스템일 수도 있다. 예를 들어, 하나 이상의 SIMD 실행 유닛들은 프로그래밍가능 쉐이딩을 지원하는 프로그래밍가능 쉐이딩 유닛을 구현하기 위해 그래픽스 프로세싱 유닛 (GPU) 에서 사용될 수도 있다.
SIMD 프로세싱 시스템은 프로그램에 대한 다중의 실행 스레드들로 하여금 다중의 프로세싱 엘리먼트들 상에서 병렬 방식으로 동기식으로 실행하게 하고, 이에 의해, 프로그램들에 대한 스루풋을 증가시키며, 여기서, 동작들의 동일 세트는 다중의 데이터 피스들에 대해 수행될 필요가 있다. 일부 상황들에 있어서, 하나 이상의 스레드들을 직렬로 수행하는 것이 바람직할 수도 있다. 예를 들어, 하나의 스레드의 출력이 하나 이상의 다른 스레드들에 대한 입력으로서 필요한 상황에 있어서. SIMD 에 대한 직렬 동작들을 실행하는 것은 리소스 집중적이고 비효율적일 수 있다.
본 개시는 SIMD 프로세싱 시스템에 있어서 직렬화된 동작을 수행하기 위한 기법들을 설명한다. 본 개시의 예들에 있어서, 직렬 명령을 실행하기 위한 복수의 활성 스레드들 중의 하나의 스레드를 선택하는 하드웨어-실행 명령이 제안된다. 그 명령은, 공유 변수를 록킹 (lock) 할 명령들을 사용하거나 스레드 ID들을 체크하지 않고 스레드를 선택할 수도 있다. 이에 따라, 직렬 동작들은 시스템 리소스들에 대한 최소의 영향으로 신속하고 효율적으로 수행될 수도 있다.
본 개시의 일 예에 있어서, 발산 (divergent) 동작들을 수행하도록 구성된 멀티-스레딩 프로세서는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하도록 구성된 제어 유닛, 및 복수의 프로세싱 엘리먼트들을 포함하고, 여기서, 선택된 활성 스레드와 연관된 복수의 프로세싱 엘리먼트들 중의 하나의 프로세싱 엘리먼트는 발산 동작을 수행하도록 구성된다.
본 개시의 다른 예에 있어서, 멀티-스레딩 프로세서 상에서 발산 동작들을 수행하도록 구성된 장치는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하는 수단, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하는 수단, 및 선택된 활성 스레드 상에서 발산 동작을 수행하는 수단을 포함한다.
본 개시의 다른 예에 있어서, 발산 동작들을 수행하도록 구성된 장치는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하도록 구성된 제어 유닛, 및 복수의 프로세싱 엘리먼트들을 포함하는 멀티-스레딩 프로세서를 포함하고, 여기서, 선택된 활성 스레드와 연관된 복수의 프로세싱 엘리먼트들 중의 하나의 프로세싱 엘리먼트는 발산 동작을 수행하도록 구성된다.
본 개시의 다른 예에 있어서, 멀티-스레딩 프로세서 상에서 발산 동작들을 수행하는 방법은 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하는 단계, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하는 단계, 및 선택된 활성 스레드 상에서 발산 동작을 수행하는 단계를 포함한다.
본 개시의 하나 이상의 예들의 상세들은 첨부 도면들 및 하기의 설명에 기재된다. 본 개시의 다른 특징들, 목적들, 및 이점들은 그 설명 및 도면들로부터, 그리고 청구항들로부터 명백할 것이다.
도 1 은 본 개시의 기법들을 구현하도록 구성될 수도 있는 디바이스를 도시한 블록 다이어그램이다.
도 2 는 본 개시의 기법들을 구현하기 위해 사용될 수도 있는 예시적인 그래픽스 프로세싱 유닛 (GPU) 을 도시한 블록 다이어그램이다.
도 3 은 도 2 의 예시적인 GPU 에서의 제어 유닛을 더 상세히 도시한 블록 다이어그램이다.
도 4 는 본 개시의 직렬화된 동작 기법들을 도시한 플로우 다이어그램이다.
도 5 는 본 개시의 기법들의 예시적인 방법을 도시한 플로우차트이다.
도 2 는 본 개시의 기법들을 구현하기 위해 사용될 수도 있는 예시적인 그래픽스 프로세싱 유닛 (GPU) 을 도시한 블록 다이어그램이다.
도 3 은 도 2 의 예시적인 GPU 에서의 제어 유닛을 더 상세히 도시한 블록 다이어그램이다.
도 4 는 본 개시의 직렬화된 동작 기법들을 도시한 플로우 다이어그램이다.
도 5 는 본 개시의 기법들의 예시적인 방법을 도시한 플로우차트이다.
본 개시는 SIMD 프로세싱 시스템 (예를 들어, GPU) 에 있어서 직렬 동작들을 수행하기 위한 기법들을 설명한다. SIMD 프로세싱 시스템들에 있어서 직렬 동작들을 수행하기 위한 종래의 기법들은 리소스 집중적이고 비효율적일 수 있다. 본 개시는, 모든 비활성 스레드들에 걸쳐 루핑 (loop) 하지 않고도, 직렬 동작을 수행하기 위해 복수의 활성 스레드들 중의 하나의 활성 스레드를 선택하는 (예를 들어, SIMD 프로세서에서의 하드웨어에 의해 실행되는) 명령을 제안한다. 이는 SIMD 프로세싱 시스템에 있어서 더 효율적인 직렬 동작을 안내할 수도 있다.
도 1 은 SIMD 프로세싱 시스템에 있어서의 직렬화된 실행을 위한 본 개시의 기법들을 구현할 수도 있는 예시적인 디바이스를 도시한 블록 다이어그램이다. 도 1 은 GPU (12), 시스템 메모리 (14), 및 중앙 프로세싱 유닛 (CPU) 일 수도 있는 프로세서 (16) 를 포함하는 디바이스 (10) 를 도시한다. 디바이스 (10) 의 예들은 미디어 플레이어들과 같은 비디오 디바이스들, 셋탑 박스들, 모바일 전화기들과 같은 무선 핸드셋들, 개인용 디지털 보조기들 (PDA들), 데스크탑 컴퓨터들, 랩탑 컴퓨터들, 게이밍 콘솔들, 비디오 컨퍼런싱 유닛들, 태블릿 컴퓨팅 디바이스들 등을 포함하지만 이에 한정되지 않는다. 디바이스 (10) 는 도 1 에 도시된 컴포넌트들에 추가로 컴포넌트들을 포함할 수도 있다.
시스템 메모리 (14) 는 디바이스 (10) 를 위한 메모리로서 고려될 수도 있다. 시스템 메모리 (14) 는 하나 이상의 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 시스템 메모리 (14) 의 예들은 랜덤 액세스 메모리 (RAM), 전기적으로 소거가능한 프로그래밍가능 판독 전용 메모리 (EEPROM), 플래시 메모리, 또는 원하는 프로그램 코드를 명령들 및/또는 데이터 구조들의 형태로 수록 또는 저장하는데 이용될 수 있고 컴퓨터 또는 프로세서에 의해 액세스될 수 있는 임의의 다른 매체를 포함하지만 이에 한정되지 않는다.
일부 양태들에 있어서, 시스템 메모리 (14) 는, 프로세서 (16) 및/또는 GPU (12) 로 하여금 본 개시에 있어서 프로세서 (16) 및 GPU (12) 에 속한 것으로 사료되는 기능들을 수행하게 하는 명령들을 포함할 수도 있다. 이에 따라, 시스템 메모리 (14) 는, 실행될 경우, 하나 이상의 프로세서들 (예를 들어, 프로세서 (16) 및 GPU (12)) 로 하여금 다양한 기능들을 수행하게 하는 명령들이 저장된 컴퓨터 판독가능 저장 매체일 수도 있다.
시스템 메모리 (14) 는, 일부 예들에 있어서, 비-일시적인 저장 매체로서 고려될 수도 있다. 용어 "비-일시적인" 은 저장 매체가 캐리어파 또는 전파 신호에서 구현되지 않음을 나타낼 수도 있다. 하지만, 용어 "비-일시적인" 은 시스템 메모리 (14) 가 비-이동성이거나 또는 그 내용들이 정적임을 의미하도록 해석되지 않아야 한다. 일 예로서, 시스템 메모리 (14) 는 디바이스 (10) 로부터 제거되고 다른 디바이스로 이동될 수도 있다. 다른 예로서, 시스템 메모리 (14) 와 실질적으로 유사한 메모리는 디바이스 (10) 에 삽입될 수도 있다. 특정 예들에 있어서, 비-일시적인 저장 매체는, (예를 들어, RAM 에 있어서) 시간에 걸쳐 변할 수 있는 데이터를 저장할 수도 있다.
디바이스 (10) 가 무선 핸드셋 통신 디바이스인 예들과 같은 일부 예들에 있어서, 프로세서 (16) 및 GPU (12) 는 집적 회로 (IC) 에서 형성될 수도 있다. 예를 들어, IC 는 칩 패키지 내의 프로세싱 칩으로서 고려될 수도 있다. 일부 예들에 있어서, 프로세서 (16) 및 GPU (12) 는, 디바이스 (10) 가 데스크탑 또는 랩탑 컴퓨터인 예들과 같이 상이한 집적 회로들 (즉, 상이한 칩 패키지들) 에서 하우징될 수도 있다. 하지만, 프로세서 (16) 및 GPU (12) 는, 디바이스 (10) 가 무선 핸드셋 통신 디바이스인 예들에 있어서 상이한 집적 회로들에서 하우징됨이 가능할 수도 있다.
프로세서 (16) 및 GPU (12) 의 예들은 디지털 신호 프로세서 (DSP), 범용 마이크로프로세서, 주문형 집적회로 (ASIC), 필드 프로그래밍가능 로직 어레이 (FPGA), 또는 다른 등가의 집적된 또는 별도의 로직 회로부를 포함하지만 이에 한정되지 않는다. 일부 예들에 있어서, GPU (12) 는, 그래픽스 프로세싱에 적합한 대량 병렬 프로세싱 능력들을 GPU (12) 에 제공하는 집적된 및/또는 별도의 로직 회로부를 포함하는 특수화된 하드웨어일 수도 있다. 일부 경우들에 있어서, GPU (12) 는 또한 범용 프로세싱 능력들을 포함할 수도 있으며, 범용 프로세싱 태스크들 (즉, 비-그래픽스 관련 태스크들) 을 구현할 경우 범용 GPU (GPGPU) 로서 지칭될 수도 있다.
프로세서 (16) 는 다양한 타입들의 어플리케이션들을 실행할 수도 있다. 어플리케이션의 예들은 웹 브라우저들, 이메일 어플리케이션들, 스프레드 시트들, 비디오 게임들, 또는 디스플레이용의 가시 (viewable) 오브젝트들을 생성하는 다른 어플리케이션들을 포함한다. 하나 이상의 어플리케이션들의 실행을 위한 명령들은 시스템 메모리 (14) 내에 저장될 수도 있다. 프로세서 (16) 는 추가 프로세싱을 위해 가시 오브젝트들의 그래픽스 데이터를 GPU (12) 에 송신할 수도 있다.
예를 들어, 프로세서 (16) 는 대량 병렬 동작들을 요구하는 태스크들과 같은 프로세싱 태스크들을 GPU (12) 에 오프로딩할 수도 있다. 일 예로서, 그래픽스 프로세싱은 대량 병렬 동작들을 요구하고, 프로세서 (16) 는 그러한 그래픽스 프로세싱 태스크들을 GPU (12) 에 오프로딩할 수도 있다. 프로세서 (16) 는 특정 어플리케이션 프로세싱 인터페이스 (API) 에 따라 GPU (12) 와 통신할 수도 있다. 그러한 API들의 예들은 Microsoft® 에 의한 DirectX®, 크로노스 그룹에 의한 OpenGL® API, 및 OpenCLTMAPI 를 포함하지만; 본 개시의 양태들은 DirectX, OpenGL, 또는 OpenCL API들로 한정되지 않고, 다른 타입들의 API들로 확장될 수도 있다. 더욱이, 본 개시에서 설명된 기법들은 API 에 따라 기능하도록 요구되지 않으며, 프로세서 (16) 및 GPU (12) 는 통신을 위한 임의의 기법을 활용할 수도 있다.
그래픽스 동작들을 수행하기 위해, GPU (12) 는 그래픽스 프로세싱 파이프라인을 구현할 수도 있다. 그래픽스 프로세싱 파이프라인은 GPU (12) 상에서 실행하는 소프트웨어 또는 펌웨어에 의해 정의된 바와 같은 기능들을 수행하는 것, 및 매우 특정한 기능들을 수행하기 위해 하드와이어링된 고정 기능 유닛들에 의한 기능들을 수행하는 것을 포함한다. GPU (12) 상에서 실행하는 소프트웨어 또는 펌웨어는 쉐이더 프로그램들 (또는 단순히 쉐이더들) 로서 지칭될 수도 있으며, 쉐이더 프로그램들은 GPU (12) 의 하나 이상의 쉐이더 코어들 상에서 실행할 수도 있다. 사용자가 원하는 태스크들을 임의의 상상가능한 방식으로 수행하도록 쉐이더 프로그램을 설계할 수 있기 때문에, 쉐이더 프로그램들은 사용자들에게 기능적 유연성을 제공한다. 하지만, 고정 기능 유닛들은, 고정 기능 유닛들이 태스크들을 수행하는 방식을 위해 하드와이어링된다. 이에 따라, 고정 기능 유닛들은 많은 기능적 유연성을 제공하지 않을 수도 있다.
예를 들어, 프로세서 (16) 는 비디오 게임과 같은 어플리케이션을 실행할 수도 있고, 프로세서 (16) 는 실행의 부분으로서 그래픽스 데이터를 생성할 수도 있다. 프로세서 (16) 는 GPU (12) 에 의한 프로세싱을 위해 그래픽스 데이터를 출력할 수도 있다. 그 후, GPU (12) 는 그래픽스 파이프라인에서 그래픽스 데이터를 프로세싱할 수도 있다. 일부 예들에 있어서, 그래픽 데이터를 프로세싱하기 위해, GPU (12) 는 하나 이상의 쉐이더 프로그램들을 실행할 필요가 있을 수도 있다. 예를 들어, 프로세서 (16) 상에서 실행하는 어플리케이션은 프로세서 (16) 로 하여금 시스템 메모리 (14) 로부터 쉐이더 프로그램을 취출하도록 GPU (12) 에게 지시하게 하고 그리고 쉐이더 프로그램을 실행하도록 GPU (12) 에게 지시하게 할 수도 있다.
디바이스 (10) 는 또한 옵션적으로, 디스플레이 (60), 사용자 인터페이스 (62), 및 트랜시버 모듈 (64) 을 포함할 수도 있다. 디바이스 (10) 는 명료화의 목적으로 도 1 에 도시되지 않은 추가 모듈들 또는 유닛들을 포함할 수도 있다. 예를 들어, 디바이스 (10) 는, 디바이스 (10) 가 모바일 무선 전화기인 예들에서 전화 통신을 실시하기 위해 스피커 및 마이크로폰 (이들 중 어느 것도 도 1 에 도시되지 않음) 을 포함할 수도 있다. 더욱이, 디바이스 (10) 에서 도시된 다양한 모듈들 및 유닛들이 디바이스 (10) 의 모든 예에서 필요하지는 않을 수도 있다. 예를 들어, 사용자 인터페이스 (62) 및 디스플레이 (60) 는, 디바이스 (10) 가 데스크탑 컴퓨터인 예들에서 디바이스 (10) 외부에 있을 수도 있다. 다른 예로서, 사용자 인터페이스 (62) 는, 디스플레이 (60) 가 모바일 디바이스의 터치 감응식 또는 존재 감응식 디스플레이인 예들에 있어서 디스플레이 (60) 의 부분일 수도 있다.
사용자 인터페이스 (62) 의 예들은 트랙볼, 마우스, 키보드, 및 다른 타입들의 입력 디바이스들을 포함하지만 이에 한정되지 않는다. 사용자 인터페이스 (62) 는 또한 터치 스크린일 수도 있고 디스플레이 (60) 의 부분으로서 통합될 수도 있다. 트랜시버 모듈 (64) 은, 디바이스 (10) 와 다른 디바이스 또는 네트워크 사이의 무선 또는 유선 통신을 허용하기 위한 회로부를 포함할 수도 있다. 트랜시버 모듈 (64) 은 변조기들, 복조기들, 증폭기들, 및 유선 또는 무선 통신을 위한 다른 그러한 회로부를 포함할 수도 있다. 디스플레이 (60) 는 액정 디스플레이 (LCD), 음극선관 (CRT) 디스플레이, 플라즈마 디스플레이, 터치 감응식 디스플레이, 존재 감응식 디스플레이, 또는 다른 타입의 디스플레이 디바이스를 포함할 수도 있다.
하기에서 더 상세히 설명될 바와 같이, 본 개시의 기법들에 따르면, GPU (12) 는 멀티-스레딩 프로세서 상에서 발산 동작들을 수행하는 방법을 수행하도록 구성될 수도 있다. GPU (12) 는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하고, 그리고 선택된 활성 스레드 상에서 발산 동작을 수행하도록 구성될 수도 있다.
도 2 는 본 개시의 직렬 프로세싱을 위한 기법들을 구현하기 위해 사용될 수도 있는 GPU (12) 의 예시적인 구성을 도시한 블록 다이어그램이다. GPU (12) 는 프로그램에 대한 명령들을 병렬 방식으로 실행하도록 구성된다. GPU (12) 는 제어 유닛 (72), 프로세싱 엘리먼트들 (74A-74D) (총괄하여, "프로세싱 엘리먼트들 (74)"), 명령 스토어 (76), 데이터 스토어 (78), 및 통신 경로들 (80, 82, 84, 86A-86D) 을 포함한다. 통신 경로들 (86A-86D) 은 총괄하여 "통신 경로들 (86)" 으로서 지칭될 수도 있다. 일부 예들에 있어서, GPU (12) 는, 프로세싱 엘리먼트들 (74) 을 사용하여 프로그램에 대한 복수의 실행 스레드들을 실행하도록 구성되는 단일 명령 다중 데이터 (SIMD) 프로세싱 시스템으로서 구성될 수도 있다. 그러한 SIMD 시스템에 있어서, 프로세싱 엘리먼트들 (74) 은 상이한 데이터 아이템들에 관하여 단일 명령을 한번에 함께 프로세싱할 수도 있다. 프로그램은, 그 프로그램과 연관된 스레드들 모두가 실행을 완료한 이후에 중단할 수도 있다.
제어 유닛 (72) 은 명령 스토어 (76) 에 저장된 프로그램에 대한 명령들을 실행하기 위해 GPU (12) 를 제어하도록 구성된다. 프로그램의 각각의 명령에 대해, 제어 유닛 (72) 은 명령 스토어 (76) 으로부터의 명령을 통신 경로 (80) 를 통해 취출하고, 그 명령을 프로세싱할 수도 있다. 일부 예들에 있어서, 제어 유닛 (72) 은, 명령과 연관된 동작이 프로세싱 엘리먼트들 (74) 중 하나 이상을 실행하게 함으로써 명령을 프로세싱할 수도 있다. 예를 들어, 제어 유닛 (72) 에 의해 취출된 명령은, 명령에 의해 명시된 데이터 아이템들에 관하여 산술 연산을 수행하도록 GPU (12) 에게 지시하는 산술 명령일 수도 있으며, 제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 중 하나 이상으로 하여금 명시된 데이터 아이템들에 대해 산술 연산을 수행하게 할 수도 있다. 추가적인 예들에 있어서, 제어 유닛 (72) 은 동작이 프로세싱 엘리먼트들 (74) 상에서 실행되게 하지 않고 명령을 프로세싱할 수도 있다.
제어 유닛 (72) 은 명령을 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 에 제공함으로써, 동작이 프로세싱 엘리먼트들 (74) 중 하나 이상의 프로세싱 엘리먼트들 상에서 수행되게 할 수도 있다. 명령은 프로세싱 엘리먼트들 (74) 에 의해 수행될 동작을 명시할 수도 있다. 프로세싱 엘리먼트들 (74) 중 하나 이상에 제공된 명령은 명령 스토어 (76) 로부터 취출된 명령과 동일하거나 상이할 수도 있다. 일부 예들에 있어서, 제어 유닛 (72) 은, 동작이 수행되어야 하는 프로세싱 엘리먼트들 (74) 의 특정 서브세트를 활성화시키는 것 및 동작이 수행되지 않아야 하는 프로세싱 엘리먼트들 (74) 의 다른 서브세트를 비활성화시키는 것 중 하나 또는 그 양자에 의해, 동작이 프로세싱 엘리먼트 (74) 의 특정 서브세트 상에서 (단일 프로세싱 엘리먼트에 의한 것 포함) 수행되게 할 수도 있다. 제어 유닛 (72) 은 개별 활성화 및/또는 비활성화 신호들을 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 각각에 제공함으로써 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다. 일부 예들에 있어서, 제어 유닛 (72) 은 명령을 프로세싱 엘리먼트들 (74) 에 제공하는 것과 함께 활성화 및/또는 비활성화 신호들을 프로세싱 엘리먼트들 (74) 에 제공하는 것에 의해 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다. 추가적인 예들에 있어서, 제어 유닛 (72) 은 명령을 프로세싱 엘리먼트들 (74) 에 제공하기 전에 프로세싱 엘리먼트들 (74) 을 활성화 및/또는 비활성화할 수도 있다.
제어 유닛 (72) 은 프로세싱 엘리먼트들 (74) 을 사용하여 프로그램에 대한 복수의 실행 스레드들을 실행할 수도 있다. 병렬로 실행될 복수의 스레드들은 종종 웨이브로 지칭된다. 프로세싱 엘리먼트들 (74) 각각은 복수의 스레드들의 개별 스레드에 대한 프로그램의 명령들을 프로세싱하도록 구성될 수도 있다. 예를 들어, 제어 유닛 (72) 은, 프로세싱을 위해, 각각의 실행 스레드를 프로세싱 엘리먼트들 (74) 의 개별 프로세싱 엘리먼트에 할당할 수도 있다. 프로그램에 대한 실행 스레드들은 데이터 아이템들의 세트에서의 상이한 데이터 아이템들에 관하여 명령들의 동일한 세트를 실행할 수도 있다. 예를 들어, 프로세싱 엘리먼트 (74A) 는 복수의 데이터 아이템들에서의 데이터 아이템들의 제 1 서브세트에 관하여 명령 스토어 (76) 에 저장된 프로그램에 대한 제 1 실행 스레드를 실행할 수도 있고, 프로세싱 엘리먼트 (74B) 는 복수의 데이터 아이템들에서의 데이터 아이템들의 제 2 서브세트에 관하여 명령 스토어 (76) 에 저장된 프로그램에 대한 제 2 실행 스레드를 실행할 수도 있다. 제 1 실행 스레드는 제 2 실행 스레드와 동일한 명령들을 포함할 수도 있지만, 데이터 아이템들의 제 1 서브세트는 데이터 아이템들의 제 2 서브세트와는 상이할 수도 있다.
일부 예들에 있어서, 제어 유닛 (72) 은 복수의 실행 스레드들에서의 개별 스레드들을 활성화 및 비활성화할 수도 있다. 제어 유닛 (72) 이 스레드를 비활성화할 경우, 제어 유닛 (72) 은 또한, 스레드를 실행하도록 할당된 프로세싱 엘리먼트 (74A-74D) 를 비활성화 및/또는 디스에이블링할 수도 있다. 그러한 비활성화된 스레드들은 비활성 스레드들로서 지칭될 수도 있다. 유사하게, 제어 유닛 (72) 이 스레드를 활성화할 경우, 제어 유닛 (72) 은 또한, 스레드를 실행하도록 할당된 프로세싱 엘리먼트 (74A-74D) 를 활성화할 수도 있다. 그러한 활성화된 스레드들은 활성 스레드들로서 지칭될 수도 있다. 하기에서 더 상세히 설명될 바와 같이, 제어 유닛 (72) 은, 다른 활성 또는 비활성 스레드들을 고려할 필요없이, 발산 동작 (예를 들어, 직렬 동작) 을 실행하기 위해 활성화 스레드를 선택하도록 구성될 수도 있다.
본 명세서에서 사용된 바와 같이, 활성 스레드는 활성화된 스레드를 지칭할 수도 있고, 비활성 스레드는 비활성화된 스레드를 지칭할 수도 있다. 소정의 프로세싱 사이클 동안 GPU (12) 상에서 실행하는 복수의 스레드들에 대해, 활성 스레드들 각각은 프로세싱 사이클 동안 복수의 스레드들에 대한 글로벌 프로그램 카운터 레지스터에 의해 식별된 프로그램의 명령을 프로세싱하도록 구성될 수도 있다. 예를 들어, 제어 유닛 (72) 은, 프로세싱 사이클 동안 프로그램의 명령을 프로세싱하도록 그러한 프로세싱 엘리먼트들 (74) 을 구성하기 위해 활성 스레드들에 할당된 프로세싱 엘리먼트들 (74) 을 활성화할 수도 있다. 한편, 소정의 프로세싱 사이클 동안 GPU (12) 상에서 실행하는 복수의 스레드들에 대해, 비활성 스레드들 각각은 프로세싱 사이클 동안 프로그램의 명령을 프로세싱하지 않도록 구성될 수도 있다. 예를 들어, 제어 유닛 (72) 은, 프로세싱 사이클 동안 프로그램의 명령을 프로세싱하지 않도록 그러한 프로세싱 엘리먼트들 (74) 을 구성하기 위해 비활성 스레드들에 할당된 프로세싱 엘리먼트들 (74) 을 비활성화할 수도 있다.
일부 예들에 있어서, 프로세싱 사이클은, 프로그램 카운터의 연속적인 로드들 간의 시간 간격을 지칭할 수도 있다. 예를 들어, 프로세싱 사이클은, 프로그램 카운터가 제 1 값으로 로딩될 때와 프로그램 카운터가 제 2 값으로 로딩될 때 사이의 시간을 지칭할 수도 있다. 제 1 값 및 제 2 값은 동일하거나 상이한 값들일 수도 있다. 프로그램 카운터가 재개 체크 (resume check) 기법들로 인해 비동기 방식으로 로딩되는 예들에 있어서, 그러한 비동기식 로드들은, 일부 예들에 있어서, 프로세싱 사이클들을 구별하도록 서빙하지 않을 수도 있다. 즉, 그러한 예들에 있어서, 프로세싱 사이클은, 프로그램 카운터의 연속적인 동기식 로드들 간의 시간 간격을 지칭할 수도 있다. 프로그램 카운터의 동기식 로드는, 일부 예들에 있어서, 클록 신호에 의해 트리거링되는 로드를 지칭할 수도 있다.
다음 명령의 취출 이전의 어느때, 제어 유닛 (72) 은 GPU (12) 에 프로세싱될 다음 명령을 결정한다. 제어 유닛 (72) 이 프로세싱될 다음 명령을 결정하는 방식은 GPU (12) 에 의해 이전에 취출된 명령이 제어 플로우 명령인지 여부에 의존하여 상이하다. GPU (12) 에 의해 이전에 취출된 명령이 제어 플로우 명령이 아니면, 제어 유닛 (72) 은, GPU (12) 에 의해 프로세싱될 다음 명령이 명령 스토어 (76) 에 저장된 다음의 순차적인 명령에 대응함을 결정할 수도 있다. 예를 들어, 명령 스토어 (76) 는 프로그램에 대한 명령들을 순서화된 시퀀스로 저장할 수도 있으며, 다음의 순차적인 명령은, 이전에 취출된 명령 직후에 발생하는 명령일 수도 있다.
GPU (12) 에 의해 이전에 취출된 명령이 제어 플로우 명령이면, 제어 유닛 (72) 은, 제어 플로우 명령에서 명시된 정보에 기초하여 GPU (12) 에 의해 프로세싱될 다음 명령을 결정할 수도 있다. 예를 들어, 제어 플로우 명령은 무조건적 제어 플로우 명령, 예를 들어, 무조건적 브랜치 명령 또는 점프 명령일 수도 있으며, 이 경우, 제어 유닛 (72) 은, GPU (12) 에 의해 프로세싱될 다음 명령이 제어 플로우 명령에 의해 식별된 타깃 명령임을 결정할 수도 있다. 다른 예로서, 제어 플로우 명령은 조건적 제어 플로우 명령, 예를 들어, 조건적 브랜치 명령일 수도 있으며, 이 경우, 제어 유닛 (72) 은, 명령 스토어 (76) 에 저장된 다음의 순차적인 명령 또는 제어 플로우 명령에 의해 식별된 타깃 명령 중 하나를 명령 스토어 (76) 로부터 프로세싱할 다음 명령으로서 선택할 수도 있다.
본 명세서에서 사용된 바와 같이, 제어 플로우 명령은, 명령 스토어 (76) 에서의 타깃 명령을 식별하는 정보를 포함하는 명령을 지칭할 수도 있다. 예를 들어, 제어 플로우 명령은 제어 플로우 명령에 대한 타깃 프로그램 카운터 값을 나타내는 타깃 값을 포함할 수도 있다. 타깃 프로그램 카운터 값은 타깃 명령에 대한 타깃 어드레스를 나타낼 수도 있다. 타깃 명령은, 일부 예들에 있어서, 명령 스토어 (76) 에 저장된 다음의 순차적인 명령과는 상이할 수도 있다. 하이-레벨 프로그램 코드는, 예를 들어, if, switch, do, for, while, continue, break, 및 goto 스테이트먼트들과 같은 제어 플로우 스테이트먼트들을 포함할 수도 있다. 컴파일러는 하이-레벨 제어 플로우 스테이트먼트들을 로우-레벨, 예를 들어, 머신-레벨 제어 플로우 명령들로 전환할 수도 있다. 제어 플로우 명령이 아닌 명령은 본 명세서에서 순차적인 명령으로서 지칭될 수도 있다. 예를 들어, 순차적인 명령은, 타깃 명령을 식별하는 정보를 포함하지 않을 수도 있다.
제어 플로우 명령들에 대해, 타깃 명령을 식별하는 정보는, 명령 스토어 (76) 에 저장된 타깃 명령을 나타내는 값일 수도 있다. 일부 예들에 있어서, 명령 스토어 (76) 에서의 타깃 명령을 나타내는 값은 명령 스토어 (76) 에서의 타깃 명령의 명령 어드레스를 나타내는 값일 수도 있다. 타깃 명령의 명령 어드레스를 나타내는 값은, 일부 경우들에 있어서, 명령 스토어 (76) 에서의 타깃 명령의 어드레스일 수도 있다. 타깃 명령의 명령 어드레스를 나타내는 값은, 부가적인 경우들에 있어서, 타깃 명령의 어드레스를 계산하기 위해 사용된 값일 수도 있다. 추가적인 예들에 있어서, 타깃 명령의 명령 어드레스를 나타내는 값은, 타깃 명령에 대응하는 타깃 프로그램 카운터 값을 나타내는 값일 수도 있다. 타깃 프로그램 카운터 값을 나타내는 값은, 일부 경우들에 있어서, 타깃 명령에 대응하는 타깃 프로그램 카운터 값일 수도 있다. 타깃 프로그램 카운터 값을 나타내는 값은, 부가적인 경우들에 있어서, 타깃 프로그램 카운터 값을 계산하기 위해 사용된 값일 수도 있다. 타깃 명령에 대응하는 타깃 프로그램 카운터 값은, 일부 예들에 있어서, 타깃 명령의 어드레스와 동일할 수도 있다.
제어 플로우 명령은 순방향 제어 플로우 명령이거나 역방향 제어 플로우 명령일 수도 있다. 순방향 제어 플로우 명령은, 명령 스토어 (76) 에 저장된 명령들의 순서화된 시퀀스에 있어서 제어 플로우 명령 이후에 타깃 명령이 발생하는 제어 플로우 명령일 수도 있다. 역방향 제어 플로우 명령은, 명령 스토어 (76) 에 저장된 명령들의 순서화된 시퀀스에 있어서 다음의 순차적인 명령 이전에 타깃 명령이 발생하는 제어 플로우 명령일 수도 있다. 다음의 순차적인 명령은, 명령들의 순서화된 시퀀스에 있어서 제어 플로우 명령 직후에 발생할 수도 있다.
제어 플로우 명령은 조건적 제어 플로우 명령이거나 무조건적 제어 플로우 명령일 수도 있다. 조건적 제어 플로우 명령은, 제어 플로우 명령과 연관된 타깃 명령으로 점프하기 위한 조건을 명시한 정보를 포함한다. 조건적 제어 플로우 명령을 프로세싱할 경우, 제어 유닛 (72) 이 조건이 충족됨을 결정하면, 제어 유닛 (72) 은 프로세싱될 다음 명령이 타깃 명령임을 결정할 수도 있다. 한편, 제어 유닛 (72) 이 조건이 충족되지 않음을 결정하면, 제어 유닛 (72) 은, 프로세싱될 다음 명령이 명령 스토어 (76) 에 저장된 다음의 순차적인 명령임을 결정할 수도 있다. 무조건적 제어 플로우 명령은, 제어 플로우 명령과 연관된 타깃 명령으로 점프하기 위한 조건을 명시한 정보를 포함하지 않는다. 무조건적 제어 플로우 명령을 프로세싱할 경우, 제어 유닛 (72) 은, 프로세싱할 다음 명령이 제어 플로우 명령에 의해 식별된 타깃 명령임을 무조건적으로 결정할 수도 있다. 즉, 그러한 경우에 있어서의 결정은, 무조건적 제어 플로우 명령에서 명시된 임의의 조건에 조건이 붙지 않는다. 본 명세서에서 사용된 바와 같이, 조건 제어 플로우 명령은, 브랜치 명령이 무조건적 브랜치 명령으로서 달리 지정되지 않으면 본 명세서에서 브랜치 명령으로서 지칭될 수도 있다. 또한, 무조건적 제어 플로우 명령은 본 명세서에서 점프 명령으로서 지칭될 수도 있다.
조건적 브랜치 명령은, 하나 이상의 데이터 아이템 값들에 대하여 명시되는 조건들을 포함할 수도 있다. 예를 들어, 일 타입의 조건은, GPU (12) 에서 실행하는 각각의 활성 스레드에 대해 제 1 데이터 아이템 값을 제 2 데이터 아이템 값과 비교하는 비교 조건일 수도 있다. 데이터 아이템 값들을 비교하는 것은, 예를 들어, 제 1 데이터 아이템 값이 제 2 데이터 아이템 값보다 초과인지, 미만인지, 이하인지, 이상인지, 동일한지, 또는 동일하지 않은지를 결정하는 것을 포함할 수도 있다. 다른 타입의 조건은, GPU (12) 상에서 실행하는 각각의 활성 스레드에 대한 데이터 아이템 값이 제로와 동일한지 또는 동일하지 않은지를 결정하는 제로 체크 조건일 수도 있다. 프로세싱 엘리먼트들 (74) 각각이 상이한 데이터 아이템들에 대해 동작하기 때문에, 조건을 평가하는 결과는 GPU (12) 상에서 실행하는 각각의 활성 스레드에 대해 상이할 수도 있다.
GPU (12) 상에서 실행하는 활성 스레드들 모두가 브랜치 조건을 충족하거나 또는 GPU (12) 상에서 실행하는 활성 스레드들 모두가 브랜치 조건을 충족하지 않으면, 균일한 브랜칭 조건이 발생하며, 스레드들에 대한 브랜칭 발산은 균일적이라고 일컬어진다. 한편, GPU (12) 상에서 실행하는 활성 스레드들 중 적어도 하나가 브랜치 조건을 충족하고 그리고 GPU (12) 상에서 실행하는 활성 스레드들 중 적어도 하나가 브랜치 조건을 충족하지 않으면, 발산 브랜칭 조건이 발생하며, 스레드들에 대한 브랜칭 발산은 발산적이라고 일컬어진다.
발산 동작의 일 예는 직렬 동작이다. 직렬 동작 (또는 직렬 동작들의 시리즈) 은, (예를 들어, 직렬 동작으로부터) 일 스레드의 출력이 하나 이상의 다른 스레드들에 대한 입력으로서 요구되는 동작이다. 즉, 다른 스레드들은, 하나 이상의 다른 스레드들의 출력이 완료되는 것과 병렬로 프로세싱하는 것을 계속하지 않을 수도 있다. 이러한 의미에서, SIMD 디바이스에서의 스레드들은 시간의 주기 동안 직렬로 수행될 수도 있다.
통상적으로, GPU (12) 상에서 실행하는 스레드들은 엄밀한 방식으로 동일한 명령을 실행할 수도 있다. 즉, 프로세싱 엘리먼트들 (74) 각각은 프로세싱 사이클 동안 모든 활성 스레드들에 대해 동일한 명령을 함께 실행할 수도 있다. 하지만, 발산 브랜치 조건이 발생할 경우, 브랜치 조건을 충족하는 스레드들은, 브랜치 조건을 총족하지 않는 스레드들에 의해 실행되도록 스케줄링된 다음 명령들과는 상이한 다음 명령들을 실행하도록 스케줄링될 수도 있다. 상기 논의된 바와 같이, 하나의 그러한 발산 브랜치 조건은 직렬 동작일 수도 있다.
제어 유닛 (72) 은 통신 경로 (80) 를 통해 명령 스토어 (76) 에, 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 에, 그리고 통신 경로 (84) 를 통해 데이터 스토어 (78) 에 통신가능하게 커플링된다. 제어 유닛 (72) 은 통신 경로 (800) 를 이용하여 판독 명령들을 명령 스토어 (76) 에 전송할 수도 있다. 판독 명령은, 명령이 취출되어야 하는 명령 스토어 (76) 에서의 명령 어드레스를 명시할 수도 있다. 제어 유닛 (72) 은 판독 명령을 전송하는 것에 응답하여 명령 스토어 (76) 로부터 하나 이상의 프로그램 명령들을 수신할 수도 있다. 제어 유닛 (72) 은 통신 경로 (82) 를 이용하여 명령들을 프로세싱 엘리먼트들 (74) 에 제공하고, 일부 예들에 있어서, 프로세싱 엘리먼트들 (74) 로부터의 데이터, 예를 들어, 브랜치 조건을 평가하기 위한 비교 명령의 결과를 수신할 수도 있다. 일부 예들에 있어서, 제어 유닛 (72) 은 통신 경로 (84) 를 이용하여, 예를 들어 브랜치 조건을 결정하기 위해 데이터 스토어 (78) 로부터의 데이터 아이템 값들을 취출할 수도 있다. 비록 도 2 는 통신 경로 (84) 를 포함하는 것으로서 GPU (12) 를 도시하지만, 다른 예들에 있어서, GPU (12) 는 통신 경로 (84) 를 포함하지 않을 수도 있다.
프로세싱 엘리먼트들 (74) 각각은 명령 스토어 (76) 에 저장된 프로그램에 대한 명령들을 프로세싱하도록 구성될 수도 있다. 일부 예들에 있어서, 프로세싱 엘리먼트들 (74) 각각은 동일한 연산 세트를 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 엘리먼트들 (74) 각각은 동일한 명령 세트 아키텍처 (ISA) 를 구현할 수도 있다. 부가적인 예들에 있어서, 프로세싱 엘리먼트들 (74) 각각은 산술 로직 유닛 (ALU) 일 수도 있다. 추가적인 예들에 있어서, GPU (12) 는 벡터 프로세서로서 구성될 수도 있고, 프로세싱 엘리먼트들 (74) 각각은 벡터 프로세서 내의 프로세싱 엘리먼트일 수도 있다. 부가적인 예들에 있어서, GPU (12) 는 SIMD 실행 유닛일 수도 있고, 프로세싱 엘리먼트들 (74) 각각은 SIMD 실행 유닛 내의 SIMD 프로세싱 엘리먼트일 수도 있다.
프로세싱 엘리먼트들 (74) 에 의해 수행된 연산들은 산술 연산들, 로직 연산들, 비교 연산들 등을 포함할 수도 있다. 산술 연산들은, 예를 들어, 가산 연산, 감산 연산, 승산 연산, 제산 연산 등과 같은 연산들을 포함할 수도 있다. 산술 연산들은 또한, 예를 들어, 정수 산술 연산들 및/또는 부동소수점 산술 연산들을 포함할 수도 있다. 로직 연산들은, 예를 들어, 비트별 AND 연산, 비트별 OR 연산, 비트별 XOR 연산 등과 같은 연산들을 포함할 수도 있다. 비교 연산들은, 예를 들어, 초과 연산, 미만 연산, 제로와 동일 연산, 제로와 비동일 연산 등과 같은 연산들을 포함할 수도 있다. 초과 및 미만 연산들은 제 1 데이터 아이템이 제 2 데이터 아이템보다 초과인지 또는 미만인지를 결정할 수도 있다. 제로와 동일 연산 및 제로와 비동일 연산은 데이터 아이템이 제로와 동일한지 또는 제로와 동일하지 않은지를 결정할 수도 있다. 연산들을 위해 사용된 피연산자들은 데이터 스토어 (78) 에 포함된 레지스터들에 저장될 수도 있다.
프로세싱 엘리먼트들 (74) 각각은 제어 유닛 (72) 으로부터의 명령을 통신 경로 (82) 를 통해 수신하는 것에 응답하여 동작을 수행하도록 구성될 수도 있다. 일부 예들에 있어서, 프로세싱 엘리먼트들 (74) 각각은 다른 프로세싱 엘리먼트들 (74) 과 독립적으로 활성화 및/또는 비활성화되도록 구성될 수도 있다. 그러한 예들에 있어서, 프로세싱 엘리먼트들 (74) 각각은 개별 프로세싱 엘리먼트 (74A-74D) 가 활성화될 경우에 제어 유닛 (72) 으로부터의 명령을 수신하는 것에 응답하여 동작을 수행하고, 그리고 개별 프로세싱 엘리먼트 (74A-74D) 가 비활성화될 경우, 즉, 활성화되지 않을 경우에 제어 유닛 (72) 으로부터의 명령을 수신하는 것에 응답하여 동작을 수행하지 않도록 구성될 수도 있다.
프로세싱 엘리먼트들 (14A-14D) 각각은 개별 통신 경로 (86A-86D) 를 통해 데이터 스토어 (78) 에 통신가능하게 커플링될 수도 있다. 프로세싱 엘리먼트들 (74) 은, 통신 경로 (86) 를 통해, 데이터 스토어 (78) 로부터 데이터를 취출하고, 데이터를 데이터 스토어 (78) 에 저장하도록 구성될 수도 있다. 데이터 스토어 (18) 로부터 취출된 데이터는, 일부 예들에 있어서, 프로세싱 엘리먼트들 (74) 에 의해 수행된 연산들에 대한 피연산자들일 수도 있다. 데이터 스토어 (78) 에 저장된 데이터는, 일부 예들에 있어서, 프로세싱 엘리먼트들 (74) 에 의해 수행된 연산의 결과일 수도 있다.
명령 스토어 (76) 는 GPU (12) 에 의한 실행을 위한 프로그램을 저장하도록 구성된다. 프로그램은 명령들의 시퀀스로서 저장될 수도 있다. 일부 예들에 있어서, 각각의 명령은 고유한 명령 어드레스 값에 의해 어드레싱될 수도 있다. 그러한 예들에 있어서, 명령들의 시퀀스에 있어서 더 나중 명령들에 대한 명령 어드레스 값들은 명령들의 시퀀스에 있어서 더 이른 명령들에 대한 명령 어드레스 값들보다 더 크다. 프로그램 명령들은, 일부 예들에 있어서, 머신-레벨 명령들일 수도 있다. 즉, 그러한 예들에 있어서, 명령들은 GPU (12) 의 ISA 에 대응하는 포맷에 있을 수도 있다. 명령 스토어 (76) 는 제어 유닛 (72) 으로부터 통신 경로 (80) 를 통해 판독 명령을 수신하도록 구성된다. 판독 명령은, 명령이 취출되어야 하는 명령 어드레스를 명시할 수도 있다. 판독 명령을 수신한 것에 응답하여, 명령 스토어 (76) 는 판독 명령에 명시된 명령 어드레스에 대응하는 명령을 통신 경로 (80) 를 통해 제어 유닛 (72) 에 제공할 수도 있다.
명령 스토어 (76) 는 임의의 형태의 메모리, 캐시 또는 그 조합일 수도 있다. 명령 스토어 (76) 가 캐시일 경우, 명령 스토어 (76) 는, GPU (12) 외부의 프로그램 메모리에 저장되는 프로그램을 캐싱할 수도 있다. 비록 명령 스토어 (76) 가 GPU (12) 내에 있는 것으로서 도시되지만, 다른 예들에 있어서, 명령 스토어 (76) 는 GPU (12) 외부에 있을 수도 있다.
데이터 스토어 (78) 는 프로세싱 엘리먼트들 (74) 에 의해 사용된 데이터 아이템들을 저장하도록 구성된다. 일부 예들에 있어서, 데이터 스토어 (78) 는 복수의 레지스터들을 포함할 수도 있고, 각각의 레지스터는 GPU (12) 상에서 동작되는 복수의 데이터 아이템들 내의 개별 데이터 아이템을 저장하도록 구성된다. 데이터 스토어 (78) 는, 데이터 스토어 (78) 내의 레지스터들과 메모리 또는 캐시 (도시 안됨) 사이에서 데이터를 이송하도록 구성되는 하나 이상의 통신 경로들 (도시 안됨) 에 커플링될 수도 있다.
비록 도 2 가 프로세싱 엘리먼트들 (74) 에 의해 사용된 데이터를 저장하기 위해 단일의 데이터 스토어 (78) 를 도시하지만, 다른 예들에 있어서, GPU (12) 는 프로세싱 엘리먼트들 (74) 각각에 대한 별도의 전용 데이터 스토어들을 포함할 수도 있다. GPU (12) 는 예시적인 목적들을 위해 4개의 프로세싱 엘리먼트들 (74) 을 도시한다. 다른 예들에 있어서, GPU (12) 는 동일하거나 상이한 구성에 있어서 다수의 더 많은 프로세싱 엘리먼트들을 가질 수도 있다.
도 3 은 도 2 의 예시적인 GPU (12) 에서의 제어 유닛 (72) 을 더 상세히 도시한 블록 다이어그램이다. 제어 유닛 (72) 은 프로그램 카운터 (88), 페치 모듈 (90), 디코드 모듈 (92) 및 제어 플로우 모듈 (94) 을 포함한다. 제어 플로우 모듈 (94) 은 본 명세서에서 제어 플로우 유닛으로서 대안적으로 지칭될 수도 있다.
프로그램 카운터 (288) 는 프로그램 카운터 값을 저장하도록 구성된다. 일부 예들에 있어서, 프로그램 카운터 (88) 는 예를 들어 프로그램 카운터 레지스터와 같은 하드웨어 레지스터일 수도 있다. 프로그램 카운터 값은 명령 스토어 (76) 에 저장된 명령들을 나타낼 수도 있다. 프로그램 카운터 값은, 일부 경우들에 있어서, 명령 스토어 (76) 에 저장된 명령의 명령 어드레스와 동일할 수도 있다. 부가적인 경우들에 있어서, 프로그램 카운터 값은 명령 스토어 (76) 에 저장된 명령의 명령 어드레스를 컴퓨팅하기 위해 사용될 수도 있다. 예를 들어, 프로그램 카운터 값은 명령 어드레스를 생성하기 위해 오프셋 값에 부가될 수도 있다. 프로그램 카운터 (88) 는, 프로그램 카운터 (88) 가 프로세싱 엘리먼트들 (74) 모두에 대해 단일의 프로그램 카운터로서 사용될 수도 있기 때문에 본 명세서에서 "글로벌 프로그램 카운터" 또는 "글로벌 프로그램 카운터 레지스터" 로서 지칭될 수도 있다.
페치 모듈 (90) 은, 프로그램 카운터 (88) 에 저장된 프로그램 카운터 값에 기초하여 제어 유닛 (72) 으로부터의 명령을 페칭, 예를 들어, 취출하도록 구성된다. 예를 들어, 페치 모듈 (90) 은, 프로그램 카운터 (88) 에 저장된 프로그램 카운터 값에 의해 식별된 명령 어드레스로부터의 명령을 페칭할 수도 있다. 페치 모듈 (90) 은, 추가 프로세싱을 위해, 페칭된 명령을 디코드 모듈 (92) 에 제공할 수도 있다.
디코드 모듈 (92) 은 페치 모듈 (90) 로부터 수신된 명령을 디코딩하도록 구성된다. 명령을 디코딩하는 것은, 명령이 프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 명령의 타입인지 여부를 결정하는 것을 수반할 수도 있다. 명령이 프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 명령의 타입이라면, 디코드 모듈 (92) 은 명령으로 하여금 프로세싱 엘리먼트들 (74) 중 하나 이상의 프로세싱 엘리먼트들 상에서 실행하게 할 수도 있다. 일부 예들에 있어서, 디코드 모듈 (92) 은 명령으로 하여금 모든 프로세싱 엘리먼트들 (74) 상에서 실행하게 할 수도 있다. 다른 예들에 있어서, 디코드 모듈 (92) 은 명령으로 하여금 모두보다는 적은 프로세싱 엘리먼트들 (74) 상에서 실행하게 할 수도 있다. 명령으로 하여금 프로세싱 엘리먼트들 (74) 중 하나 이상의 프로세싱 엘리먼트들 상에서 실행하게 하는 것은, 일부 경우들에 있어서, 명령을 실행을 위해 프로세싱 엘리먼트들 (74) 중 하나 이상의 프로세싱 엘리먼트들에 발행하는 것을 포함할 수도 있다. 예를 들어, 페치 모듈 (90) 은 프로그램 카운터 (88) 에 의해 식별된 순차적인 명령을 페칭하고, 그 순차적인 명령을, 프로세싱을 위해, 활성 스레드들에 대응하는 모든 프로세싱 엘리먼트들 (74) 에 발행할 수도 있다. 명령이 프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 명령의 타입이 아니라면, 제어 유닛 (72) 은 명령을 프로세싱을 위해 프로세싱 엘리먼트들 (74) 중 임의의 프로세싱 엘리먼트에 발행하지 않고도 명령을 프로세싱할 수도 있다. 예를 들어, 명령은, 프로세싱 엘리먼트들 (74) 에 의한 프로세싱을 요구하지 않는 타입의 제어 플로우 명령일 수도 있으며, 이 경우, 제어 유닛 (72) 은 명령을 프로세싱 엘리먼트들 (74) 중 임의의 프로세싱 엘리먼트에 발행하지 않고도 명령을 프로세싱할 수도 있다.
어느 경우라도, 디코드 모듈 (92) 은 제어 정보를 추가 프로세싱을 위해 제어 플로우 모듈 (94) 에 포워딩할 수도 있다. 일부 예들에 있어서, 제어 정보는 명령 자체일 수도 있다. 추가적인 예들에 있어서, 제어 정보는, 예를 들어, 명령이 제어 플로우 명령 또는 순차적인 명령인지를 나타내는 정보; 명령이 제어 플로우 명령이라면, 명령이 브랜치 명령 또는 점프 명령인지를 나타내는 정보; 명령이 브랜치 또는 점프 명령이라면, 브랜치 또는 점프 명령이 순방향 또는 역방향 브랜치 또는 점프 명령인지 여부를 나타내는 정보; 및 명령이 브랜치 명령이라면, 브랜치 조건을 명시하는 정보와 같은 정보를 포함할 수도 있다.
프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 타입인 명령들은 산술 명령들 또는 로직 명령들을 포함할 수도 있다. 산술 명령은 산술 연산을 수행하도록 프로세싱 엘리먼트들 (74) 에게 지시하는 명령을 지칭할 수도 있고, 로직 명령은 로직 연산을 수행하도록 프로세싱 엘리먼트들 (74) 에게 지시하는 명령을 지칭할 수도 있다. 일부 예들에 있어서, 제어 플로우 명령은 프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 명령일 수도 있으며, 예를 들어, 제어 플로우 명령은 프로세싱 엘리먼트들 (74) 에 의해 평가되는 브랜치 조건을 포함할 수도 있다. 프로세싱 엘리먼트들 (74) 에 의해 프로세싱될 수 있는 타입이 아닌 명령들은 브랜치 조건이 제어 유닛 (72) 에 의해 평가되는 제어 플로우 명령들 및/또는 브랜치 조건을 갖지 않는 제어 플로우 명령들을 포함할 수도 있다.
제어 플로우 모듈 (94) 은 제어 유닛 (72) 에 의해 프로세싱될 다음 명령과 연관된 프로그램 카운터 값을 결정하고, 프로그램 카운터 값을 프로그램 카운터 (88) 에 로딩할 수도 있다. 이전에 페칭된 명령이 순차적인 명령이면, 제어 플로우 모듈 (94) 은, 명령 스토어 (76) 에 저장된 다음의 순차적인 명령을 나타내는 프로그램 카운터 값을 선택하여 프로그램 카운터 (88) 에 로딩할 수도 있다. 이전에 페칭된 명령이 제어 플로우 명령이면, 제어 플로우 모듈 (94) 은 재개 카운터 기법들을 활용할 수도 있다.
제어 플로우 모듈 (94) 은 GPU (12) 상에서 실행하는 각각의 스레드에 대한 재개 카운터 값을 저장할 수도 있다. 예를 들어, 제어 플로우 모듈 (94) 에 저장된 재개 카운터 값들의 수는 GPU (12) 에 포함된 프로세싱 엘리먼트들 (74) 의 수와 동일할 수도 있다. 각각의 재개 카운터 값에 대해, 개별 재개 카운터 값에 대응하는 스레드가 비활성이면, 재개 카운터 값은, 비활성 스레드가 활성화 또는 재활성화되어야 하는 프로그램 카운터 값을 나타낼 수도 있다. 그렇지 않고 개별 재개 카운터 값에 대응하는 스레드가 활성이면, 재개 카운터 값은, 일부 예들에 있어서, 최대값, 즉, 재개 카운터에 대한 저장 슬롯 또는 레지스터에서 표현될 수 있는 가장 큰 값인 값으로 설정될 수도 있다.
제어 플로우 모듈 (94) 은 GPU (12) 상에서 실행하는 각각의 스레드에 대한 활성 플래그를 저장할 수도 있다. 예를 들어, 제어 플로우 모듈 (94) 에 저장된 활성 플래그들의 수는 GPU (12) 에 포함된 프로세싱 엘리먼트들 (74) 의 수와 동일할 수도 있다. 각각의 활성 플래그는 활성 플래그와 연관된 스레드가 활성인지 또는 비활성인지를 표시할 수도 있다. 일부 예들에 있어서, 활성 플래그는, 활성 플래그와 연관된 스레드가 활성임을 표시하기 위해 세트되고 활성 플래그와 연관된 스레드가 비활성임을 표시하기 위해 리셋되는 단일 비트일 수도 있다.
일부 예들에 있어서, 제어 플로우 모듈 (94) 은 또한 프로그램 상태를 저장할 수도 있다. 예를 들어, 제 1 프로그램 상태는 모든 스레드들이 활성임을 표시할 수도 있고, 제 2 프로그램 상태는 적어도 하나의 스레드가 활성이고 적어도 하나의 스레드가 비활성임을 표시할 수도 있으며, 제 3 프로그램 상태는 모든 스레드들이 비활성임을 표시할 수도 있다. 프로그램 상태는, 그러한 예들에 있어서, 프로그램 카운터 값을 선택하여 프로그램 카운터 (88) 로 로딩하기 위해 사용될 수도 있다.
제어 플로우 모듈 (94) 은, 일부 예들에 있어서, 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 중 하나 이상을 활성화 및 비활성화하도록 구성될 수도 있다. 부가적인 예들에 있어서, 제어 플로우 모듈 (94) 은 특정 프로세싱 엘리먼트들 (74) 을 활성화 및 비활성화하도록 디코더 모듈 (92) 에게 지시할 수도 있다. 추가적인 예들에 있어서, 제어 플로우 모듈 (94) 은 통신 경로 (82) 를 통해 프로세싱 엘리먼트들 (74) 중 하나 이상으로부터 비교 명령의 결과들을 수신할 수도 있다. 일부 예들에 있어서 비교 명령의 결과들은 브랜치 조건을 평가하기 위해 사용될 수도 있다. 더 추가적인 예들에 있어서, 제어 플로우 모듈 (94) 은, 브랜치 조건을 평가할 목적으로, 통신 경로 (84) 를 통하여, 데이터 스토어 (78) 로부터 하나 이상의 데이터 아이템들을 취출할 수도 있다.
상기 논의된 바와 같이, 병렬 머신 (예를 들어, SIMD 프로세싱 시스템) 내에서, 종종, 직렬화된 동작(들)과 같은 발산 동작들을 수행할 필요가 있다. 예를 들어, GPU (12) 는, 프로세싱 엘리먼트들 (74) 상에서 실행하는 소정의 스레드(들)에 대한 입력이 프로세싱 엘리먼트들 (74) 상에서 실행하는 다른 스레드의 출력에 의존하는 '프리픽스 합' 을 수행하도록 지시받을 수도 있다.
SIMD 프로세싱 시스템 상에서 직렬화된 동작들을 수행하는 것에 대한 하나의 종래의 접근법은, 모든 스레드들이 공유 변수에 대한 록 (lock) 을 수행하기 위해 경합하도록 (즉, 프로세싱 엘리먼트들 (74) 중 오직 하나만이 특정 시간에 변수에 액세스하도록) 자동 네이티브 명령들을 이용하는 것을 수반한다. 하지만, 이용 자동 명령들 및 록들은 비효율적일 수 있는데, 왜냐하면 이들은 제한된 리소스이고 통상적으로 실행을 위해 긴 레이턴시를 요구하기 때문이다.
직렬 동작을 수행하기 위한 다른 접근법은 각각의 스레드에 대한 고유의 값 (예를 들어, thread_id) 을 생성하는 것을 수반한다. 그 후, 제어 유닛 (72) 을 통한 GPU (12) 는 루프의 각각의 반복 동안 (스레드 ID 에 의해) 오직 단일의 스레드를 선택하는 것을 모든 스레드들을 통해 루핑하도록 구성될 것이다. 그러한 동작에 대한 예시적인 의사코드가 하기에 나타내어진다:
For (i = 0; i)// i 는 웨이브에서의 스레드들의 총 수를 나타낼 수도 있음
{ if (thread_id == i ) {perform serialized operation} }
상기 접근법은, 심지어 비활성일 수도 있는 그 스레드들에 대해서도 루프 반복을 강요하는 것은 물론, 부가적인 테스팅 및 테스트 변수들을 요구한다. 이는 리소스들 및 시간 양자에 있어서 비효율적이다.
이들 단점들의 관점에서, 본 개시는 병렬 프로세싱 시스템 (예를 들어, SIMD 프로세싱 시스템) 에 있어서 직렬화된 동작들을 수행하기 위한 기법들을 제안한다. 하기 예들에 있어서, 본 개시는, 임의의 비활성 스레드들에 액세스할 필요없이, 복수의 스레드들로부터의 활성 스레드가 직렬화된 동작을 수행하기 위해 선택될 수도 있도록 하는 명령 (예를 들어, 하드웨어-실행 명령) 을 기술한다.
본 개시에서 제안된 솔루션은, GPU (12) 의 제어 유닛 (72) 에 의해 실행될 수도 있는 "GetOne" 명령 (GetOne_and_branch()) 이다. 제어 유닛 (72) 은 실행을 위해 복수의 스레드들 (예를 들어, 웨이브에서의 스레드들) 중에서 단일의 활성 스레드를 선택하도록 구성될 수도 있다. 제어 유닛 (72) 은, 제어 플로우 모듈 (94) 에 의해 저장된 활성 플래그를 이용하여 어느 스레드들이 현재 활성인지를 결정할 수도 있다. 일단 단일의 활성 스레드가 선택되면, 웨이브에서의 모든 다른 활성 스레드들은 브랜치 조건을 실행할 수도 있는 한편, 선택된 스레드는 발산 동작 (예를 들어, 직렬 동작) 을 수행한다. 그 후, "GetOne" 명령은 다음의 의사 코드에 의해 나타낸 바와 같이 직렬 동작을 실행하기 위해 사용될 수 있다:
LOOP: GetOne_and_branch TRY_AGAIN
{perform serialized operation}
goto CONTINUE
TRY_AGAIN: goto LOOP
CONTINUE
상기 예에 있어서, 제어 유닛 (72) 은 처음에, 코드의 LOOP 명령으로 가도록 지시받는다. LOOP 명령은, 복수의 활성 스레드들 (예를 들어, 웨이브) 로부터의 단일의 활성 스레드를 선택하고 그리고 직렬 명령 ({perform serialized operation}) 으로 진행하고 그 후 제어 블록을 퇴장하고 (goto CONTINUE) 비활성으로 가는 "GetOne" 명령 (GetOne_and_branch) 을 포함한다. 선택되지 않은 스레드들은 GetOne_and_branch 명령의 브랜치 명령을 수행한다. 상기 예에 있어서, 브랜치 명령은 "TRY_AGAIN" 명령이고, 이는 본질적으로, 모든 선택되지 않은 활성 스레드들을 Loop 명령으로 전송한다. 그 후, 나머지 활성 스레드들 중 다른 스레드가 직렬화된 동작을 수행하기 위해 선택될 수도 있다.
"GetOne" 명령의 메커니즘은, 부가적인 변수들 없이 그리고 비활성 스레드들에 대한 루프 반복을 요구하지 않고, 웨이브 내에서 효율적인 직렬화를 허용한다. 본 개시의 기법들은, 웨이브 내의 병렬 스레드들이 그 공유된 단일 명령으로 인해 일부 레벨의 동기화를 이미 갖는다는 사실을 이용한다. 이러한 방식으로, 본 개시의 "GetOne" 명령은 하나의 활성 스레드가 직렬 동작을 위해 선택되게 하면서 동시에 모든 다른 활성 스레드들을 비활성으로 되게 한다.
도 4 는 본 개시의 직렬화된 동작 기법들을 더 상세히 도시한 플로우 다이어그램이다. 처음에, GPU (12) 의 제어 유닛 (72) 은 "GetOne" 명령을 수신할 수도 있다 (100). "GetOne" 명령에 응답하여, 제어 유닛 (72) 은 복수의 스레드들 (예를 들어, 웨이브) 에서 어느 스레드들이 활성인지를 결정하도록 구성된다 (102). 일 예에 있어서, 제어 유닛 (72) 은 어느 스레드들이 활성인지를 결정하기 위해 스레드들 각각과 연관된 활성 플래그를 판독하도록 구성될 수도 있다. 어떠한 활성 스레드들도 남아 있지 않다고 제어 유닛 (72) 이 결정하면 (103), 제어 블록은 종료한다 (리턴 (112)).
남아 있는 활성 스레드들이 존재한다고 제어 유닛 (72) 이 결정하면 (103), 제어 블록 (72) 은 복수의 스레드들 중 하나의 활성 스레드를 선택할 수도 있다 (104). 그 후, 선택된 스레드 (106 의 "예") 는 프로세싱 엘리먼트들 (74) 중 하나의 프로세싱 엘리먼트 상에서 직렬 동작을 수행한다 (108). 직렬 동작이 수행된 이후, 선택된 활성 스레드는 비활성화된다 (110). 선택되지 않은 나머지 활성 스레드들은 다시 "Get One" 명령으로 루핑될 수도 있다 (106 의 "아니오").
상기 설명된 직렬 실행을 위한 "GetOne" 명령을 실행하도록 구성된 GPU (12) 는 또한, "GetOne" 명령을 이용하여, 발산을 나타내는 단일 웨이브를 다중의 서브-웨이브들 (그 각각은 균일할 수도 있음) 로 분할하도록 구성될 수도 있다. (가능하게는 발산적인) 서브루틴 호출을 수행하는 것이 바람직한 예를 가정한다. 즉, 웨이브에서의 스레드들 중 오직 일부분만이 서브루틴을 수행해야 하는 상황. 발산 서브루틴을 실행하기 위한 하나의 종래의 기법은 각각의 스레드를 고유하게 실행하는 것을 수반한다. 이는 비효율적일 수도 있다.
대신, GPU (12) 는, 공유 레지스터에 액세스하는 모든 스레드들 (즉, 공유 레지스터에 액세스하는 프로세싱 엘리먼트들 (74)) 에 의해 그 후 실행될 수도 있는 공유 레지스터에서의 서브루틴을 저장하기 위해 "GetOne" 명령을 실행하도록 구성될 수도 있다. 공유 레지스터는 프로세싱 엘리먼트들 (74) 에서 이용가능한 데이터 스토어 (78), 명령 스토어 (76), 또는 다른 메모리의 부분일 수도 있다.
"GetOne" 명령 및 공유 레지스터를 이용하여, GPU (12) 는 "GetOne" 명령을 이용하는 서브루틴 타깃 (즉, 서브루틴 명령들이 저장되는 위치) 을 선택하고, 그 타깃을 모든 스레드들로 브로드캐스트하고 (즉, 서브루틴 위치가 공유 레지스터에 저장된다는 표시를 제공하고), 모든 매칭 스레드들 상에서 서브루틴을 실행 (즉, 공유 레지스터에 액세스하는 프로세싱 엘리먼트들 (74) 상에서 서브루틴을 실행) 하도록 구성될 수도 있다. 그 후, 이 프로세스는 상이한 공유 레지스터들에 액세스하는 다른 스레드들에 대해 반복될 수도 있다. 이 프로세스에 대한 예시적인 의사코드가 하기에 나타내어진다:
LOOP: GetOne_and_branch CONTINUE1
shared_R0 = subroutine_target //'공유' 레지스터에 타깃을 저장
CONTINUE1: if (subroutine_target == shared_R0)
{
call(subroutine_target)
goto CONTINUE2
}
goto LOOP
CONTINUE2:
처음에, 제어 유닛 (72) 은 코드의 LOOP 섹션으로 진행하고, 전술된 바와 같은 "GetOne" 명령을 실행할 것이다. "GetOne" 명령은 동작을 수행하기 위한 하나의 활성 스레드를 선택한다. 상기 예에 있어서, 선택된 활성 스레드는, 위치의 어드레스 (subroutine_target) 를 공유 레지스터 (shared_R0) 에 저장하는 동작을 수행할 것이다. 선택되지 않았던 임의의 활성 스레드들은 CONTINUE1 동작을 수행할 것이다. CONTINUE1 동작에 있어서, 공유 레지스터 (shared_R0) 에 액세스하는 각각의 스레드 (즉, 프로세싱 엘리먼트 (74)) 는 subroutine_target 에 위치된 코드를 실행하고, CONTINUE 2 에서 제어 블록을 퇴장한다. 임의의 비-선택된 활성 스레드들이 공유 레지스터에 액세스하지 않으면, 비-선택된 활성 스레드들은 루프 동작으로 리턴하며, 여기서, 다른 서브-루틴 호출은 상이한 공유 레지스터에 저장될 수도 있다. 다시, 직렬 동작의 예로서, 임의의 비활성 스레드들이 스킵되고, 최소 수의 고유한 서브루틴 호출들이 행해진다.
도 5 는 본 개시의 예시적인 방법을 도시한 플로우차트이다. 도 5 의 기법들은 GPU (12) 의 제어 유닛 (72) 을 포함하여 GPU (12) 에 의해 구현될 수도 있다. 본 개시의 일 예에 있어서, GPU (12) 는 멀티-스레딩 프로세서 상에서 발산 동작들을 수행하는 방법을 수행하도록 구성된다. GPU (12) 는 복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고 (152), 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하고 (154), 그리고 선택된 활성 스레드 상에서 발산 동작을 수행 (156) 하도록 구성될 수도 있다.
본 개시의 일 예에 있어서, 멀티-스레딩 프로세서는 SIMD 프로세서이다. 본 개시의 다른 예에 있어서, 복수의 스레드들은 웨이브를 형성하고, 여기서, 웨이브는 SIMD 프로세서에 의해 병렬로 실행된다.
본 개시의 다른 예에 있어서, GPU (12) 는 선택된 활성 스레드 상에서 직렬화된 동작을 수행함으로써 선택된 활성 스레드 상에서 발산 동작을 수행하도록 구성된다. 본 개시의 다른 예에 있어서, 발산 동작은 공유 레지스터에 서브-루틴 타깃을 저장하고, GPU (12) 는 추가로, 공유 레지스터에 액세스하는 하나 이상의 활성 스레드들 상의 서브-루틴 타깃에 저장된 코드를 실행하도록 구성된다.
본 개시에서 설명된 기법들은, 적어도 부분적으로, 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 조합에서 구현될 수도 있다. 예를 들어, 설명된 기법들의 다양한 양태들은 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서들 (DSP들), 주문형 집적 회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 또는 임의의 다른 균등한 집적된 또는 별개의 로직 회로부 뿐 아니라 그러한 컴포넌트들의 임의의 조합들을 포함한 하나 이상의 프로세서들 내에서 구현될 수도 있다. 용어 "프로세서" 또는 "프로세싱 회로부" 는 일반적으로, 전술한 로직 회로부의 임의의 로직 회로부를 단독으로 또는 다른 로직 회로부와 결합하여 지칭하거나, 또는 프로세싱을 수행하는 별개의 하드웨어와 같은 임의의 다른 균등한 회로부를 지칭할 수도 있다.
그러한 하드웨어, 소프트웨어, 및 펌웨어는, 본 개시에서 설명된 다양한 동작들 및 기능들을 지원하기 위해 동일한 디바이스 내에서 또는 별도의 디바이스들 내에서 구현될 수도 있다. 부가적으로, 설명된 유닛들, 모듈들 또는 컴포넌트들 중 임의의 것은, 별개지만 상호운용가능한 로직 디바이스들로서 별도로 또는 함께 구현될 수도 있다. 상이한 특징부들의 모듈들 또는 유닛들로서의 서술은 상이한 기능적 양태들을 하이라이트하도록 의도되며, 반드시 그러한 모듈들 또는 유닛들이 별도의 하드웨어 또는 소프트웨어 컴포넌트들에 의해 실현되어야 함을 의미하지는 않는다. 대신, 하나 이상의 모듈들 또는 유닛들과 연관된 기능은 별도의 하드웨어, 펌웨어, 및/또는 소프트웨어 컴포넌트들에 의해 수행되거나, 또는 공통의 또는 별도의 하드웨어 또는 소프트웨어 컴포넌트들 내에서 통합될 수도 있다.
본 개시에서 설명된 교시들은 또한, 명령들을 저장하는 컴퓨터 판독가능 저장 매체와 같은 컴퓨터 판독가능 매체에서 저장되거나 구현되거나 인코딩될 수도 있다. 컴퓨터 판독가능 매체에서 구현되거나 인코딩된 명령들은 하나 이상의 프로세서들로 하여금 예를 들어 명령들이 하나 이상의 프로세서들에 의해 실행될 경우 본 명세서에서 설명된 기법들을 수행하게 할 수도 있다. 컴퓨터 판독가능 저장 매체들은 랜덤 액세스 메모리 (RAM), 판독 전용 메모리 (ROM), 프로그래밍가능 판독 전용 메모리 (PROM), 소거가능한 프로그래밍가능 판독 전용 메모리 (EPROM), 전기적으로 소거가능한 프로그래밍가능 판독 전용 메모리 (EEPROM), 플래시 메모리, 하드 디스크, CD-ROM, 플로피 디스크, 카세트, 자기 매체들, 광학 매체들, 또는 유형인 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
컴퓨터 판독가능 매체들은, 상기에 열거된 것들과 같은 유형의 저장 매체에 대응하는 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 컴퓨터 판독가능 매체들은 또한, 예를 들어, 통신 프로토콜에 따라 일 장소로부터 다른 장소로의 컴퓨터 프로그램의 이송을 용이하게 하는 임의의 매체를 포함하는 통신 매체들을 포함할 수도 있다. 이러한 방식으로, 어구 "컴퓨터 판독가능 매체들" 은 일반적으로 (1) 비-일시적인 유형의 컴퓨터 판독가능 저장 매체들 또는 (2) 일시적인 신호 또는 캐리어파와 같은 비-유형의 컴퓨터 판독가능 통신 매체에 대응할 수도 있다.
다양한 양태들 및 예들이 설명되었다. 하지만, 다음의 청구항들의 범위로부터 일탈함없이 본 개시의 구조 또는 기법들에 대해 수정들이 행해질 수 있다.
Claims (20)
- 멀티-스레딩 프로세서 상에서 발산 (divergent) 동작들을 수행하는 방법으로서,
복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하는 단계;
상기 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하는 단계; 및
선택된 상기 활성 스레드 상에서 발산 동작을 수행하는 단계를 포함하는, 발산 동작들을 수행하는 방법. - 제 1 항에 있어서,
상기 멀티-스레딩 프로세서는 단일 명령 다중 데이터 (SIMD) 프로세서인, 발산 동작들을 수행하는 방법. - 제 2 항에 있어서,
상기 복수의 스레드들은 웨이브를 형성하고,
상기 웨이브는 상기 SIMD 프로세서에 의해 병렬로 실행되는, 발산 동작들을 수행하는 방법. - 제 1 항에 있어서,
선택된 상기 활성 스레드 상에서 발산 동작을 수행하는 단계는 선택된 상기 활성 스레드 상에서 직렬화된 동작을 수행하는 단계를 포함하는, 발산 동작들을 수행하는 방법. - 제 1 항에 있어서,
상기 발산 동작을 수행하는 단계는 공유 레지스터에 서브-루틴 타깃을 저장하는 단계를 포함하고,
상기 발산 동작들을 수행하는 방법은
상기 공유 레지스터에 액세스하는 상기 하나 이상의 활성 스레드들 상의 상기 서브-루틴 타깃에 저장된 코드를 실행하는 단계를 더 포함하는, 발산 동작들을 수행하는 방법. - 발산 동작들을 수행하도록 구성된 장치로서,
멀티-스레딩 프로세서를 포함하고,
상기 멀티-스레딩 프로세서는
복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 상기 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하도록 구성된 제어 유닛; 및
복수의 프로세싱 엘리먼트들을 포함하고,
선택된 상기 활성 스레드와 연관된 상기 복수의 프로세싱 엘리먼트들 중의 하나의 프로세싱 엘리먼트는 발산 동작을 수행하도록 구성되는, 발산 동작들을 수행하도록 구성된 장치. - 제 6 항에 있어서,
상기 멀티-스레딩 프로세서는 단일 명령 다중 데이터 (SIMD) 프로세서인, 발산 동작들을 수행하도록 구성된 장치. - 제 7 항에 있어서,
상기 복수의 스레드들은 웨이브를 형성하고,
상기 웨이브는 상기 SIMD 프로세서에 의해 병렬로 실행되는, 발산 동작들을 수행하도록 구성된 장치. - 제 6 항에 있어서,
선택된 상기 활성 스레드와 연관된 상기 프로세싱 엘리먼트는 직렬화된 동작을 수행하도록 구성되는, 발산 동작들을 수행하도록 구성된 장치. - 제 6 항에 있어서,
상기 발산 동작은 공유 레지스터에 서브-루틴 타깃을 저장하고,
상기 복수의 프로세싱 엘리먼트들은 추가로, 상기 하나 이상의 활성 스레드들과 연관되고 상기 공유 레지스터에 액세스하는 상기 복수의 프로세싱 엘리먼트들 중의 임의의 프로세싱 엘리먼트들 상의 상기 서브-루틴 타깃에 저장된 코드를 실행하도록 구성되는, 발산 동작들을 수행하도록 구성된 장치. - 멀티-스레딩 프로세서 상에서 발산 동작들을 수행하도록 구성된 장치로서,
복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하는 수단;
상기 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하는 수단; 및
선택된 상기 활성 스레드 상에서 발산 동작을 수행하는 수단을 포함하는, 발산 동작들을 수행하도록 구성된 장치. - 제 11 항에 있어서,
상기 멀티-스레딩 프로세서는 단일 명령 다중 데이터 (SIMD) 프로세서인, 발산 동작들을 수행하도록 구성된 장치. - 제 12 항에 있어서,
상기 복수의 스레드들은 웨이브를 형성하고,
상기 웨이브는 상기 SIMD 프로세서에 의해 병렬로 실행되는, 발산 동작들을 수행하도록 구성된 장치. - 제 11 항에 있어서,
선택된 상기 활성 스레드 상에서 발산 동작을 수행하는 수단은 선택된 상기 활성 스레드 상에서 직렬화된 동작을 수행하는 수단을 포함하는, 발산 동작들을 수행하도록 구성된 장치. - 제 11 항에 있어서,
상기 발산 동작은 공유 레지스터에 서브-루틴 타깃을 저장하고,
상기 발산 동작들을 수행하도록 구성된 장치는
상기 공유 레지스터에 액세스하는 상기 하나 이상의 활성 스레드들 상의 상기 서브-루틴 타깃에 저장된 코드를 실행하는 수단을 더 포함하는, 발산 동작들을 수행하도록 구성된 장치. - 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서로서,
복수의 스레드들로부터 하나 이상의 활성 스레드들을 결정하고, 상기 하나 이상의 활성 스레드들로부터 하나의 활성 스레드를 선택하도록 구성된 제어 유닛; 및
복수의 프로세싱 엘리먼트들을 포함하고,
선택된 상기 활성 스레드와 연관된 상기 복수의 프로세싱 엘리먼트들 중의 하나의 프로세싱 엘리먼트는 발산 동작을 수행하도록 구성되는, 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서. - 제 16 항에 있어서,
상기 멀티-스레딩 프로세서는 단일 명령 다중 데이터 (SIMD) 프로세서인, 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서. - 제 17 항에 있어서,
상기 복수의 스레드들은 웨이브를 형성하고,
상기 웨이브는 상기 SIMD 프로세서에 의해 병렬로 실행되는, 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서. - 제 16 항에 있어서,
선택된 상기 활성 스레드와 연관된 상기 프로세싱 엘리먼트는 직렬화된 동작을 수행하도록 구성되는, 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서. - 제 16 항에 있어서,
상기 발산 동작은 공유 레지스터에 서브-루틴 타깃을 저장하고,
상기 복수의 프로세싱 엘리먼트들은 추가로, 상기 하나 이상의 활성 스레드들과 연관되고 상기 공유 레지스터에 액세스하는 상기 복수의 프로세싱 엘리먼트들 중의 임의의 프로세싱 엘리먼트들 상의 상기 서브-루틴 타깃에 저장된 코드를 실행하도록 구성되는, 발산 동작들을 수행하도록 구성된 멀티-스레딩 프로세서.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/268,215 US10133572B2 (en) | 2014-05-02 | 2014-05-02 | Techniques for serialized execution in a SIMD processing system |
US14/268,215 | 2014-05-02 | ||
PCT/US2015/025362 WO2015167777A1 (en) | 2014-05-02 | 2015-04-10 | Techniques for serialized execution in a simd processing system |
Publications (1)
Publication Number | Publication Date |
---|---|
KR20160148673A true KR20160148673A (ko) | 2016-12-26 |
Family
ID=53039617
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020167033480A KR20160148673A (ko) | 2014-05-02 | 2015-04-10 | Simd 프로세싱 시스템에 있어서의 직렬화된 실행을 위한 기법들 |
Country Status (8)
Country | Link |
---|---|
US (1) | US10133572B2 (ko) |
EP (1) | EP3137988B1 (ko) |
JP (1) | JP2017515228A (ko) |
KR (1) | KR20160148673A (ko) |
CN (1) | CN106233248B (ko) |
BR (1) | BR112016025511A2 (ko) |
ES (1) | ES2834573T3 (ko) |
WO (1) | WO2015167777A1 (ko) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9898348B2 (en) | 2014-10-22 | 2018-02-20 | International Business Machines Corporation | Resource mapping in multi-threaded central processor units |
US9921838B2 (en) * | 2015-10-02 | 2018-03-20 | Mediatek Inc. | System and method for managing static divergence in a SIMD computing architecture |
WO2017182063A1 (en) | 2016-04-19 | 2017-10-26 | Huawei Technologies Co., Ltd. | Vector processing for segmentation hash values calculation |
US10034407B2 (en) | 2016-07-22 | 2018-07-24 | Intel Corporation | Storage sled for a data center |
US10565017B2 (en) * | 2016-09-23 | 2020-02-18 | Samsung Electronics Co., Ltd. | Multi-thread processor and controlling method thereof |
US10990409B2 (en) * | 2017-04-21 | 2021-04-27 | Intel Corporation | Control flow mechanism for execution of graphics processor instructions using active channel packing |
CN108549583B (zh) * | 2018-04-17 | 2021-05-07 | 致云科技有限公司 | 大数据处理方法、装置、服务器及可读存储介质 |
US12004257B2 (en) * | 2018-10-08 | 2024-06-04 | Interdigital Patent Holdings, Inc. | Device discovery and connectivity in a cellular network |
US20230097115A1 (en) * | 2021-09-27 | 2023-03-30 | Advanced Micro Devices, Inc. | Garbage collecting wavefront |
Family Cites Families (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6947047B1 (en) | 2001-09-20 | 2005-09-20 | Nvidia Corporation | Method and system for programmable pipelined graphics processing with branching instructions |
US7895328B2 (en) | 2002-12-13 | 2011-02-22 | International Business Machines Corporation | System and method for context-based serialization of messages in a parallel execution environment |
US7657882B2 (en) | 2004-01-22 | 2010-02-02 | University Of Washington | Wavescalar architecture having a wave order memory |
US7590830B2 (en) * | 2004-05-28 | 2009-09-15 | Sun Microsystems, Inc. | Method and structure for concurrent branch prediction in a processor |
GB2437836B (en) | 2005-02-25 | 2009-01-14 | Clearspeed Technology Plc | Microprocessor architectures |
US7761697B1 (en) * | 2005-07-13 | 2010-07-20 | Nvidia Corporation | Processing an indirect branch instruction in a SIMD architecture |
US7634637B1 (en) | 2005-12-16 | 2009-12-15 | Nvidia Corporation | Execution of parallel groups of threads with per-instruction serialization |
US8176265B2 (en) | 2006-10-30 | 2012-05-08 | Nvidia Corporation | Shared single-access memory with management of multiple parallel requests |
US8312254B2 (en) * | 2008-03-24 | 2012-11-13 | Nvidia Corporation | Indirect function call instructions in a synchronous parallel thread processor |
US8850436B2 (en) | 2009-09-28 | 2014-09-30 | Nvidia Corporation | Opcode-specified predicatable warp post-synchronization |
US8782645B2 (en) * | 2011-05-11 | 2014-07-15 | Advanced Micro Devices, Inc. | Automatic load balancing for heterogeneous cores |
US8683468B2 (en) * | 2011-05-16 | 2014-03-25 | Advanced Micro Devices, Inc. | Automatic kernel migration for heterogeneous cores |
US10152329B2 (en) | 2012-02-09 | 2018-12-11 | Nvidia Corporation | Pre-scheduled replays of divergent operations |
US9256429B2 (en) | 2012-08-08 | 2016-02-09 | Qualcomm Incorporated | Selectively activating a resume check operation in a multi-threaded processing system |
US10013290B2 (en) | 2012-09-10 | 2018-07-03 | Nvidia Corporation | System and method for synchronizing threads in a divergent region of code |
US9229721B2 (en) * | 2012-09-10 | 2016-01-05 | Qualcomm Incorporated | Executing subroutines in a multi-threaded processing system |
KR101603752B1 (ko) * | 2013-01-28 | 2016-03-28 | 삼성전자주식회사 | 멀티 모드 지원 프로세서 및 그 프로세서에서 멀티 모드를 지원하는 방법 |
KR20150019349A (ko) * | 2013-08-13 | 2015-02-25 | 삼성전자주식회사 | 다중 쓰레드 실행 프로세서 및 이의 동작 방법 |
US9652284B2 (en) * | 2013-10-01 | 2017-05-16 | Qualcomm Incorporated | GPU divergence barrier |
-
2014
- 2014-05-02 US US14/268,215 patent/US10133572B2/en active Active
-
2015
- 2015-04-10 JP JP2016563817A patent/JP2017515228A/ja active Pending
- 2015-04-10 EP EP15719929.0A patent/EP3137988B1/en active Active
- 2015-04-10 KR KR1020167033480A patent/KR20160148673A/ko unknown
- 2015-04-10 BR BR112016025511A patent/BR112016025511A2/pt not_active IP Right Cessation
- 2015-04-10 ES ES15719929T patent/ES2834573T3/es active Active
- 2015-04-10 CN CN201580021777.9A patent/CN106233248B/zh active Active
- 2015-04-10 WO PCT/US2015/025362 patent/WO2015167777A1/en active Application Filing
Also Published As
Publication number | Publication date |
---|---|
EP3137988B1 (en) | 2020-09-02 |
JP2017515228A (ja) | 2017-06-08 |
CN106233248B (zh) | 2018-11-13 |
US20150317157A1 (en) | 2015-11-05 |
ES2834573T3 (es) | 2021-06-17 |
WO2015167777A1 (en) | 2015-11-05 |
US10133572B2 (en) | 2018-11-20 |
BR112016025511A2 (pt) | 2017-08-15 |
CN106233248A (zh) | 2016-12-14 |
EP3137988A1 (en) | 2017-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3137988B1 (en) | Techniques for serialized execution in a simd processing system | |
KR101660659B1 (ko) | 멀티-스레딩된 프로세싱 시스템에서의 서브루틴들의 실행 | |
JP5701487B2 (ja) | 同期並列スレッドプロセッサにおける間接的な関数呼び出し命令 | |
US8615646B2 (en) | Unanimous branch instructions in a parallel thread processor | |
US10706494B2 (en) | Uniform predicates in shaders for graphics processing units | |
EP2820540B1 (en) | Execution model for heterogeneous cpu-gpu computing | |
KR101724247B1 (ko) | 동적 폭 계산을 이용한 배리어 폭 동기화 | |
JP6077117B2 (ja) | マルチスレッド処理システムにおけるレジュームチェック動作を選択的にアクティブ化すること | |
US10318297B2 (en) | Method and apparatus for operating a self-timed parallelized multi-core processor | |
US8572355B2 (en) | Support for non-local returns in parallel thread SIMD engine | |
CN108628639B (zh) | 处理器和指令调度方法 |