KR102014670B1 - 서브그룹 간 데이터 공유 - Google Patents
서브그룹 간 데이터 공유 Download PDFInfo
- Publication number
- KR102014670B1 KR102014670B1 KR1020187030686A KR20187030686A KR102014670B1 KR 102014670 B1 KR102014670 B1 KR 102014670B1 KR 1020187030686 A KR1020187030686 A KR 1020187030686A KR 20187030686 A KR20187030686 A KR 20187030686A KR 102014670 B1 KR102014670 B1 KR 102014670B1
- Authority
- KR
- South Korea
- Prior art keywords
- subgroup
- work
- subgroups
- item
- processing unit
- Prior art date
Links
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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/522—Barrier synchronisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
- G06F16/275—Synchronous replication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
- G06F3/0613—Improving I/O performance in relation to throughput
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0646—Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems
- G06F3/0647—Migration mechanisms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0683—Plurality of storage devices
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Human Computer Interaction (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Computing Systems (AREA)
- Multi Processors (AREA)
- Memory System (AREA)
- Hardware Redundancy (AREA)
- Advance Control (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
일 예에서, 데이터를 전송하는 방법은, 제 1 서브그룹에 대응하는 작업-항목들 및 제 2 서브그룹에 대응하는 작업-항목들을 배리어로 동기화하는 것을 포함할 수도 있다. 이 방법은, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 것을 포함할 수도 있다.
Description
이 출원은 2016년 4월 27일에 출원된 미국 가 특허 출원 제 62/328,228 호의 이익을 주장하고, 그것은 그 전체가 참조에 의해 본원에 통합된다.
기술 분야
이 개시물은 프로세싱 유닛 상에서의 서브그룹 간 데이터 공유 (inter-subgroup data sharing) 에 관한 것이다.
CPU 또는 GPU 와 같은 프로세싱 유닛들은 복수의 작업-항목들 (work-items) 을 실행할 수도 있다. 각각의 작업-항목은 작업-그룹에 속하거나 그 외에 작업-그룹에 대응할 수도 있다. 각각의 작업-그룹은 하나 이상의 작업-항목들을 포함할 수도 있고, 각각의 작업-그룹은 하나 이상의 서브그룹들을 포함할 수도 있다. 각각의 작업-항목은 하나의 작업-그룹 및 하나의 서브그룹에 속할 수도 있다. 프로세싱 유닛들은 동일한 서브그룹의 작업-항목들 사이의 데이터의 공유를 허용할 수도 있다.
일반적으로, 이 개시물은 서브그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 일부 예들에서, 본원에 기술된 서브그룹 간 데이터 전송은 서브그룹들에 관해, 각 서브그룹에 대응하는 하나 이상의 작업-항목들에 관해, 및/또는 각 작업-항목에 대응하는 메모리 로케이션(들) 또는 메모리 공간에 관해 기술될 수도 있다. 예를 들어, 이 개시물은 2 개 이상의 서브그룹들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 다른 예로서, 이 개시물은 작업-그룹의 2 개 이상의 서브그룹들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 다른 예로서, 이 개시물은 상이한 서브그룹들의 작업-항목들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다.
하나의 예에서, 이 개시물은, 프로세싱 유닛에 의해, 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하는 단계; 프로세싱 유닛에 의해, 제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하는 단계; 프로세싱 유닛에 의해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어 (barrier) 를 실행하는 단계; 프로세싱 유닛에 의해, 일단 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 1 배리어에 의해 동기화되면, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계; 및, 프로세싱 유닛에 의해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하는 단계를 포함하는, 방법을 기술한다.
다른 예에서, 이 개시물은, 하나 이상의 작업-항목들을 실행하기 위한 하나 이상의 프로세싱 엘리먼트들을 각각 포함하는 하나 이상의 계산 유닛들; 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리; 및, 하나 이상의 프로세싱 엘리먼트들의 각각에 의해 액세스가능한 전용 메모리 (private memory) 를 포함하는 프로세싱 유닛을 구비하는 디바이스를 기술하고, 이 프로세싱 유닛은: 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하고; 제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하며; 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하고; 일단 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 1 배리어에 의해 동기화되면, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하며; 그리고, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하도록 구성된다.
다른 예에서, 이 개시물은, 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하는 수단; 제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하는 수단; 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하는 수단; 일단 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 1 배리어에 의해 동기화되면, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 수단; 및, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하는 수단을 포함하는, 장치를 기술한다.
다른 예에서, 이 개시물은, 실행될 때, 하나 이상의 프로세서들로 하여금, 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하게 하고; 제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하게 하며; 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하게 하고; 일단 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 1 배리어에 의해 동기화되면, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하게 하고; 그리고, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하게 하는, 명령들을 저장한 비일시적 컴퓨터 판독가능 저장 매체를 기술한다.
본 개시의 하나 이상의 예들의 상세들은 첨부 도면들 및 이하의 설명에서 전개된다. 본 개시의 다른 특징들, 목적들, 및 이점들은 상세한 설명 및 도면들로부터, 그리고 청구항들로부터 명백하게 될 것이다.
도 1 은 본 개시의 기법들을 구현하도록 구성될 수도 있는 컴퓨팅 디바이스를 예시하는 블록도이다.
도 2 는 본 개시의 기법들을 구현하도록 구성될 수도 있는, 도 1 에 도시된 하나 이상의 프로세싱 유닛들을 더 자세히 나타낸다.
도 3 은 본 개시의 기법들을 구현하도록 구성될 수도 있는 예시적인 프로세싱 유닛들을 더 자세히 나타낸다.
도 4 는 본 개시에 따른 동기화 기법의 하나의 예를 나타낸다.
도 5 는 본 개시에 따른 동기화 기법의 하나의 예를 나타낸다.
도 6 은 본원에 기술된 기법들에 따른 작업-항목 프로세싱의 일 예를 나타낸다.
도 7 은 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
도 8 은 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
도 9 는 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
도 2 는 본 개시의 기법들을 구현하도록 구성될 수도 있는, 도 1 에 도시된 하나 이상의 프로세싱 유닛들을 더 자세히 나타낸다.
도 3 은 본 개시의 기법들을 구현하도록 구성될 수도 있는 예시적인 프로세싱 유닛들을 더 자세히 나타낸다.
도 4 는 본 개시에 따른 동기화 기법의 하나의 예를 나타낸다.
도 5 는 본 개시에 따른 동기화 기법의 하나의 예를 나타낸다.
도 6 은 본원에 기술된 기법들에 따른 작업-항목 프로세싱의 일 예를 나타낸다.
도 7 은 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
도 8 은 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
도 9 는 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다.
이 개시물은 서브그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 일부 예들에서, 본원에 기술된 서브그룹 간 데이터 전송은 서브그룹들에 관해, 각 서브그룹에 대응하는 하나 이상의 작업-항목들에 관해, 및/또는 각 작업-항목에 대응하는 메모리 로케이션(들) 또는 메모리 공간에 관해 기술될 수도 있다. 예를 들어, 이 개시물은 2 개 이상의 서브그룹들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 다른 예로서, 이 개시물은 작업-그룹의 2 개 이상의 서브그룹들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다. 다른 예로서, 이 개시물은 상이한 서브그룹들의 작업-항목들 사이의 그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다.
도 1 은 본 개시의 하나 이상의 양태들을 구현하도록 구성될 수도 있는 일 예시적인 컴퓨팅 디바이스 (예컨대, 컴퓨팅 디바이스 (2)) 및/또는 프로세싱 유닛 (예컨대, 프로세싱 유닛 (1A) 또는 프로세싱 유닛 (1B)) 을 나타내는 블록도이다. 도 1 에서 도시된 바와 같이, 컴퓨팅 디바이스 (2) 는, 예를 들어, 퍼스널 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 태블릿 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔, 모바일 전화기 (예컨대, 셀룰러 또는 위성 전화기), 핸드헬드 디바이스 (예컨대, 포터블 비디오 게임 디바이스 또는 퍼스널 디지털 어시스턴트 (PDA)), 웨어러블 컴퓨팅 디바이스, 퍼스널 뮤직 플레이어, 비디오 플레이어, 디스플레이 디바이스, 텔레비젼, 네트워크 디바이스, 중간 네트워크 디바이스, 임의의 컴퓨팅 디바이스, 또는 본 개시의 하나 이상의 양태들을 구현하도록 구성될 수도 있는 임의의 다른 타입의 디바이스일 수도 있다.
컴퓨팅 디바이스 (2) 는 하나 이상의 프로세싱 유닛들 (1), 트랜시버 (3), 사용자 인터페이스 (4), 디스플레이 프로세싱 유닛 (5), 디스플레이 (8), 및 시스템 메모리 (10) 를 포함할 수도 있다. 도 1 의 예에서, 컴퓨팅 디바이스는 2 개의 프로세싱 유닛들: 프로세싱 유닛 (1A) 및 프로세싱 유닛 (1B) 을 포함하는 것으로서 도시되지만, 다른 예들은 도시된 것들보다 더 많거나 더 적은 프로세싱 유닛들을 가질 수도 있다. 본 명세서에서 사용된 바와 같이, 프로세싱 유닛 (1) 에 대한 언급은 하나 이상의 프로세싱 유닛들, 예컨대, 프로세싱 유닛 (1A) 및/또는 프로세싱 유닛 (1B) 을 지칭할 수도 있다. 예를 들어, 프로세싱 유닛 (1) 에 대한 언급은 프로세싱 유닛 (1A) 을 지칭할 수도 있다. 다른 예로서, 프로세싱 유닛 (1) 에 대한 언급은 프로세싱 유닛 (1B) 을 지칭할 수도 있다. 다른 예로서, 프로세싱 유닛 (1) 에 대한 언급은 프로세싱 유닛 (1A) 및/또는 프로세싱 유닛 (1B) 을 지칭할 수도 있다. 또 다른 예로서, 프로세싱 유닛 (1) 에 대한 언급은 하나 이상의 프로세싱 유닛들 (1) 을 지칭할 수도 있다. 프로세싱 유닛 (1) 은 다른 프로세싱 유닛들과 혼성으로 (heterogeneously) 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1A) 및 프로세싱 유닛 (1B) 은 서로 혼성으로 수행하도록 구성될 수도 있다. 따라서 컴퓨팅 디바이스 (2) 는 혼성 컴퓨팅을 수행하도록 구성될 수도 있음이 이해된다. 프로세싱 유닛 (1) 은 임의의 컴퓨팅 디바이스 내로 통합될 수도 있다.
도 1 의 예에서 컴퓨팅 디바이스 (2) 에서 도시된 다양한 컴포넌트들은 컴퓨팅 디바이스 (2) 의 모든 예에서 반드시 필요하지는 않을 수도 있다. 예를 들어, 컴퓨팅 디바이스 (2) 는, 다른 예들에서, 도 1 의 예에서 도시된 하나 이상의 컴포넌트들 (예컨대, 디스플레이 프로세싱 유닛 (5)) 을 포함하지 않을 수도 있다. 다른 예들에서, 컴퓨팅 디바이스 (10) 는 도 1 의 예에서 예시된 컴포넌트들에 추가하여 하나 이상의 컴포넌트들을 포함할 수도 있다.
프로세싱 유닛 (1) 은 중앙 프로세싱 유닛 (CPU), 그래픽 프로세싱 유닛 (GPU), 병렬 프로세싱 유닛 (예컨대, 병렬적 프로세싱을 수행하도록 구성된 임의의 프로세싱 유닛), 시스템 온 칩 (SoC), 또는 본원에 기술된 하나 이상의 기법들을 수행하도록 구성될 수도 있는 임의의 다른 프로세싱 유닛일 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 범용 프로세싱 능력들을 갖는 GPU 일 수도 있고, 범용 프로세싱 태스크들 (예컨대, 비-그래픽 관련 태스크들) 을 구현할 때 범용 GPU (GPGPU) 로서 지칭될 수도 있다. 이에 따라, 본 명세서에서 사용된 바와 같이, GPU 에 대한 언급은 범용 프로세싱 능력들을 갖는 또는 갖지 않는 GPU 를 의미할 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 서브그룹 간 (inter-subgroup) 및/또는 서브그룹 내 (intra-subgroup) 데이터 공유를 수행하도록 구성될 수도 있는 임의의 프로세싱 유닛일 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 단일 명령 다중 데이터 (SIMD) 프로세서, 다중 명령 다중 데이터 (MIMD) 프로세서, 단일 프로그램 다중 데이터 (SPMD) 프로세서, 또는 다중 프로그램 다중 데이터 (MPMD) 프로세서일 수도 있다. 일부 예들에서, 프로세싱 유닛 (1A) 은 CPI 일 수도 있고, 프로세싱 유닛 (1B) 은 GPU 일 수도 있다. 다른 예들에서, 프로세싱 유닛 (1B) 은 CPU 일 수도 있고, 프로세싱 유닛 (1A) 은 GPU 일 수도 있다.
프로세싱 유닛 (1) 은 하나 이상의 프로세서들 (예컨대, 하나 이상의 마이크로프로세서들), 애플리케이션 특정적 집적 회로 (ASIC) 들, 필드 프로그래머블 게이트 어레이 (FPGA) 들, 산술 로직 유닛 (ALU) 들, 디지털 신호 프로세서 (DSP) 들, 이산 로직, 소프트웨어, 하드웨어 펌웨어, 다른 등가의 집적 또는 이산 로직 회로, 또는 이들의 임의의 조합을 포함할 수도 있다. 프로세싱 유닛 (1) 은 또한, 하나 이상의 프로세서 코어들을 포함할 수도 있어서, 프로세싱 유닛 (1) 은 다중-코어 프로세서로서 지칭될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은, 프로세싱 유닛 (1) 에 그래픽 프로세싱을 위해 적합한 대량 병렬 프로세싱 능력들을 제공하는 집적 및/또는 이산 로직 회로를 포함하는 특수화된 하드웨어일 수도 있다.
프로세싱 유닛 (1) 은 하나 이상의 내부 메모리들 (6) 및 하나 이상의 메모리 제어기들을 포함할 수도 있다. 하나 이상의 메모리 제어기들은 하나 이상의 메모리들 (예컨대, 하나 이상의 내부 메모리들 (6) 및/또는 시스템 메모리 (10)) 에 대한 액세스를 제어하도록 구성될 수도 있다. 일부 예들에서, 하나 이상의 메모리 제어기들은 메모리 요청들을 직렬화하도록 구성될 수도 있다. 도 1 의 예에서, 컴퓨팅 디바이스 (2) 는 2 개의 프로세싱 유닛들: 프로세싱 유닛 (1A) 및 프로세싱 유닛 (1B) 을 포함하는 것으로서 도시된다. 본 명세서에서 사용된 바와 같이, 하나 이상의 내부 메모리들 (6) 에 대한 언급은 하나 이상의 메모리들 (6A) 및/또는 하나 이상의 내부 메모리들 (6B) 을 지칭할 수도 있다.
묘사된 시스템 메모리 (10) 와 같은, 프로세싱 유닛 (1) 외부의 메모리는 프로세싱 유닛 (1) 에 대해 액세스가능할 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은 버스 (예컨대, 유선이거나 무선이든지 간에 임의의 통신 매체) 를 통해 시스템 메모리 (10) 에 통신가능하게 커플링될 수도 있다.
하나 이상의 내부 메모리들 (6) 은, 예컨대, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능 프로그래머블 ROM (EPROM), 전기적으로 소거가능 프로그래머블 ROM (EEPROM), 플래시 메모리, 자기적 데이터 매체들 또는 광학적 저장 매체들, 임의의 온-칩 메모리 (예컨대, 프로세싱 유닛 (1) 의 임의의 통합된 메모리), 또는 임의의 다른 내부 메모리와 같은, 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들을 포함할 수도 있다.
시스템 메모리 (10) 는 컴퓨팅 디바이스 (2) 에 대한 메모리로서 고려될 수도 있다. 시스템 메모리 (10) 는 하나 이상의 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 시스템 메모리 (10) 는, 예컨대, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능 프로그래머블 ROM (EPROM), 전기적으로 소거가능 프로그래머블 ROM (EEPROM), 플래시 메모리, SDRAM DDR SDRAM, 자기적 데이터 매체들 또는 광학적 저장 매체들, 임의의 오프-칩 메모리 (예컨대, 프로세싱 유닛 (1) 외부의 임의의 메모리), 임의의 다른 메모리, 또는 하나 이상의 명령들 및/또는 데이터 구조들을 저장하기 위해 사용될 수 있고 프로세싱 유닛 (예컨대, 프로세싱 유닛 (1)) 에 의해 액세스될 수 있는 임의의 다른 매체와 같은, 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들을 포함할 수도 있다. 시스템 메모리 (10) 는 일부 예들에 따른 비일시적 저장 매체일 수도 있다. "비일시적 (non-transitory)" 이라는 용어는, 저장 매체가 반송파 또는 전파되는 신호에 포함되지 않는 것을 나타낼 수도 있다. 하지만, "비일시적" 이라는 용어는 시스템 메모리 (10) 가 비-이동가능성이라거나 그것의 콘텐츠가 정적이라는 것을 의미하도록 해석되어서는 아니된다. 하나의 예로서, 시스템 메모리 (10) 는 그것이 통신가능하게 커플링되는 임의의 디바이스로부터 제거되고 다른 디바이스로 이동될 수도 있다. 다른 예로서, 시스템 메모리 (10) 와 실질적으로 유사한 메모리는 도 1 에서 묘사된 컴퓨팅 디바이스 (2) 와 같은 컴퓨팅 디바이스 내로 삽입될 수도 있다.
일부 예들에서, 시스템 메모리 (10) 는, 실행될 때 프로세싱 유닛 (1) 으로 하여금 이 개시물에서의 프로세싱 유닛 (1) 에 따른 기능들을 수행하게 하게 하는 명령들을 포함할 수도 있다. 이에 따라, 시스템 메모리 (10) 은, 실행될 때 하나 이상의 프로세서들 (예컨대, 프로세싱 유닛 (1)) 로 하여금 하나 이상의 기능들을 수행하게 하는 명령들을 저장한 컴퓨터 판독가능 저장 매체일 수도 있다.
트랜시버 (3) 는 컴퓨팅 디바이스 (2) 와 다른 디바이스 또는 네트워크 사이의 무선 또는 유선 통신을 허용하기 위한 회로를 포함할 수도 있다. 트랜시버 (3) 는 변조기들, 복조기들, 증폭기들 및 유선 또는 무선 통신을 위한 다른 이러한 회로를 포함할 수도 있다. 일부 예들에서, 트랜시버 (3) 는 프로세싱 유닛 (1) 과 통합될 수도 있거나 통합되지 않을 수도 있다. 예를 들어, 트랜시버 (3) 는 프로세싱 유닛 (1) 과 동일한 집적 회로 (IC) 의 일부일 수도 있고, 프로세싱 유닛 (1) 의 일부 또는 전부를 포함할 수도 있는 IC 또는 IC 들의 외부에 있을 수도 있고, 또는, 프로세싱 유닛 (1) 의 일부 또는 전부를 포함할 수도 있는 IC 또는 IC 들의 외부에 있는 IC 에 형성될 수도 있다. 예를 들어, 트랜시버 (3) 는 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서 (DSP) 들, 애플리케이션 특정적 집적 회로 (ASIC) 들, 필드 프로그래머블 게이트 어레이 (FPGA) 들, 산술 로직 유닛 (ALU) 들, 이산 로직, 소프트웨어, 하드웨어, 펌웨어 또는 이들의 임의의 조합과 같은 다양한 적합한 인코더 회로 중 임의의 것으로서 구현될 수도 있다.
사용자 인터페이스 (4) 의 예들은, 비제한적으로, 트랙볼, 마우스, 키보드, 및 임의의 다른 입력 디바이스를 포함할 수도 있다. 예를 들어, 사용자 인터페이스 (4) 는 디스플레이 (8) 의 일부로서 통합될 수도 있는 터치 스크린을 포함할 수도 있다. 디스플레이 (8) 는 액정 디스플레이 (LCD), 음극선관 (CRT) 디스플레이, 플라즈마 디스플레이, 터치-감지 디스플레이, 존재-감지 디스플레이, 또는 임의의 다른 타입의 디스플레이를 포함할 수도 있다. 사용자 인터페이스 (4) 가 소프트웨어 (예컨대, 그래픽 사용자 인터페이스) 를 이용하여 부분적으로 또는 전체적으로 구현되는 예들에서, 소프트웨어는 프로세싱 유닛 (1) 또는 프로세싱 유닛 (1) 과는 상이한 프로세싱 유닛에 의해 실행될 수도 있고, 소프트웨어는 메모리 (예컨대, 하나 이상의 내부 메모리들 (6) 과 같은 온-칩 메모리 또는 시스템 메모리 (10) 와 같은 오프-칩 메모리) 상에 저장될 수도 있다. 프로세싱 유닛 (1) 은 사용자 인터페이스 (4) 의 하나 이상의 양태들을 구현하기 위해 메모리 상에 저장된 소프트웨어 명령들을 액세스 및 실행하도록 구성될 수도 있다.
디스플레이 프로세싱 유닛 (5) 은 타일-기반 아키텍처를 이용할 수도 있거나 이용하지 않을 수도 있다. 일부 예들에서, 타일 (tile) 은 하나 이상의 픽셀들인 높이 및 하나 이상의 픽셀들인 폭을 포함하는 픽셀들의 영역 표현이다. 이러한 예들에서, 타일들은 성질상 직사각형 또는 정사각형일 수도 있다. 다른 예들에서, 타일은 정사각형 또는 직사각형 이외의 다른 형상일 수도 있다. 디스플레이 프로세싱 유닛 (5) 은 적어도 하나의 메모리로부터 다수의 이미지 레이어들 (예컨대, 전경 및 배경) 을 페치하도록 구성될 수도 있다. 예를 들어, 디스플레이 프로세싱 유닛 (5) 은, 프로세싱 유닛 (예컨대, 일부 예들에서, 프로세싱 유닛 (1B) 과 같은 프로세싱 유닛 (1)) 이 픽셀 표현들의 형태로 그래픽 데이터를 출력하는 프레임 버퍼 및/또는 다른 메모리로부터 이미지 레이어들을 페치하도록 구성될 수도 있다. 다수의 이미지 레이어들은 전경 레이어들 및/또는 배경 레이어들을 포함할 수도 있다. 본 명세서에서 사용된 바와 같이, "이미지 (image)" 라는 용어는 오직 스틸 이미지만을 의미하도록 의도되지 아니한다. 그보다는, 이미지 또는 이미지 레이어는 스틸 이미지 (예컨대, 이미지 또는 블렌딩될 때의 이미지 레이어들은 이미지일 수도 있다) 또는 비디오 (예컨대, 이미지 또는 블렌딩될 때의 이미지 레이어들은 차례차례로 보여질 때 동화상 또는 비디오를 형성하는 이미지들의 시퀀스에서의 단일 이미지일 수도 있다) 와 연관될 수도 있다.
디스플레이 프로세싱 유닛 (5) 은 다수의 레이어들로부터의 픽셀들을 프로세싱하도록 구성될 수도 있다. 디스플레이 프로세싱 유닛 (5) 에 의해 수행될 수도 있는 예시적인 픽셀 프로세싱은 업-샘플링, 다운-샘플링, 스케일링, 회전, 및/또는 다른 픽셀 프로세싱을 포함할 수도 있다. 예를 들어, 디스플레이 프로세싱 유닛 (5) 은 전경 이미지 레이어들 및/또는 배경 이미지 레이어들과 연관된 픽셀들을 프로세싱하도록 구성될 수도 있다. 디스플레이 프로세싱 유닛 (5) 은 다수의 레이어들로부터의 픽셀들을 블렌딩하고, 그 블렌딩된 픽셀들을 타일 포맷으로 메모리 내로 다시 역으로 기입하도록 구성될 수도 있다. 그 다음에, 블렌딩된 픽셀들은 래스터 포맷으로 메모리로부터 판독되고 제시를 위해 디스플레이 (8) 에 전송될 수도 있다.
이제 프로세싱 유닛 (1) 을 참조하면, 프로세싱 유닛 (1) (예컨대, 프로세싱 유닛 (1A)) 은 다양한 타입들의 애플리케이션들을 실행하도록 구성될 수도 있다. 하나 이상의 애플리케이션들의 실행을 위한 명령들은 프로세싱 유닛 (1) 에 의해 액세스가능한 메모리 (예컨대, 하나 이상의 내부 메모리들 (6) 및/또는 시스템 메모리 (10)) 내에 저장될 수도 있다. 프로세싱 유닛 (1) 은 다른 프로세싱 유닛으로부터 하나 이상의 프로세싱 태스크들을 수신 및/또는 송신하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1A) (예컨대, CPU) 은 프로세싱 유닛 (1B) (예컨대, GPU) 에 하나 이상의 프로세싱 태스크들을 오프로딩하도록 구성될 수도 있다.
프로세싱 유닛 (1) 은 프로그래밍 언어, 애플리케이션 프로그램 인터페이스 (API), 라이브러리들, 및/또는 런타임 시스템을 포함할 수도 있는 컴퓨팅 플랫폼 (예컨대, 병렬적 프로그래밍을 위한 프레임워크) 에 따라 하나 이상의 프로세스들을 수행하도록 구성될 수도 있다. 다른 예들에서, 컴퓨팅 플랫폼은 컴퓨팅 표준 및/또는 컴퓨팅 사양을 지칭할 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은 OpenCL API 를 이용하여 OpenCL 컴퓨팅 플랫폼에 따라 하나 이상의 프로세스들을 수행하도록 구성될 수도 있다. 본 개시의 양태들은 OpenCL 컴퓨팅 플랫폼 및/또는 OpenCL API 들에 제한되지 않는다. 예를 들어, 프로세싱 유닛 (1) 은 임의의 병렬적 컴퓨팅 플랫폼, 임의의 혼성 컴퓨팅 플랫폼, 및 기타 등등에 따라서 하나 이상의 프로세스들을 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은 OpenGL 컴퓨팅 플랫폼, CUDA 컴퓨팅 플랫폼, HSA 파운데이션 컴퓨팅 플랫폼, Vulkan API, 및 기타 등등에 따라 하나 이상의 프로세스들을 수행하도록 구성될 수도 있다. 추가적으로, 이 개시물에서 설명된 기법들은 API 에 따라 기능하도록 요구되지 않는다.
도 1 에서 도시되고 기술된 바와 같이, 컴퓨팅 디바이스 (2) 는 일 예시적인 프로세싱 시스템 아키텍처로서 지칭될 수도 있는 일 예시적인 시스템 (예컨대, 혼성 시스템) (11) 에서 나타낸 하나 이상의 프로세싱 유닛들 (1) 을 포함할 수도 있다. 도 2 는 혼성 프로세싱 아키텍처 (heterogeneous processing architecture) 에 따른 시스템 (11) 의 일 예를 보다 자세히 나타낸다. 일부 예들에서, 도 2 의 시스템 (11) 에서 나타낸 혼성 프로세싱 시스템 아키텍처는 OpenCL 컴퓨팅 플랫폼에 따라 구성될 수도 있다. 따라서, 본원에서 기술된 임의의 모습에 관련하여 사용된 용어들은 특정 컴퓨팅 플랫폼 (예컨대, OpenCL, OpenGL, CUDA 등) 에 관련될 수도 있지만, 그 예는 특정 컴퓨팅 플랫폼에 제한되지 않음이 이해될 것이다. 예를 들어, 도 2 의 예는 OpenCL 전문용어를 사용하여 기술되지만, 도 2 의 예는 또한 다른 컴퓨팅 플랫폼들 (예컨대, CUDA) 에 적용된다, 비록 그들 다른 컴퓨팅 플랫폼들이 동일 또는 유사한 컴포넌트들을 기술하기 위해 상이한 전문용어를 사용함에도 불구하고 말이다. 예를 들어, OpenCL 에서의 "계산 유닛 (compute unit)" 이라는 용어는 CUDA 에서는 "스트리밍 멀티프로세서" 또는 "멀티프로세서" 를 그리고 일반 컴퓨터 용어에서는 "코어" 를 지칭할 수도 있다. 다른 예로서, OpenCL 에서의 "작업-항목 (work-item)", "서브그룹 (subgroup)", "작업-그룹 (work-group)", "ND범위 (NDRange)", "로컬 메모리 (local memory)" 및 "전용 메모리 (private memory)" 는 CUDA 에서 "스레드 (thread)", "워프 (warp)", "블록 (block)", "그리드 (grid)", "공유 메모리 (shared memory)" 및 "로컬 메모리 (local memory)" 를 각각 지칭할 수도 있다. 일부 예들에서, "스레드" 라는 용어는 "파이버 (fiber" 를 지칭할 수도 있고, 그 역도 성립한다. 다른 예로서, OpenCL 에서의 "프로세싱 엘리먼트 (processing element)" 라는 용어는 CUDA 에서는 "CUDA 프로세서" 를 그리고 일반 컴퓨터 용어에서는 "레인 (lane)" 을 지칭할 수도 있다.
본 명세서에서 사용된 임의의 용어의 의미는, 일부 예들에서, 임의의 컴퓨팅 플랫폼 (예컨대, OpenCL) 에서 전개된 바와 같이, 또는 임의의 용어가 임의의 컴퓨팅 플랫폼에서 사용되는 컨텍스트에 기초하여 임의의 명시적인 정의를 포함한다. 예를 들어, OpenCL Specification Version 2.2, Document Revision 06 은 "계산 유닛 (compute unit)" 을 "하나 이상의 프로세싱 엘리먼트들 및 로컬 메모리로 구성되는 것" 으로서 정의한다. 이에 따라, 본 명세서에서 사용되는 바와 같은 용어 "계산 유닛" 은 일부 예들에서, 하나 이상의 프로세싱 엘리먼트들 및 로컬 메모리를 지칭할 수도 있다. 다른 예들에서, 용어 "계산 유닛" 은 하나 이상의 프로세싱 엘리먼트들 및 로컬 메모리와는 상이한 무언가를 의미할 수도 있다. 일부 예들에서, 본 명세서에서 사용된 바와 같은 "작업-그룹" 이라는 용어는 OpenCL Specification Version 2.2, Document Revision 06 에 의해 정의된 바와 같이, 단일 계산 유닛 상에서 실행되는 관련된 작업-항목들의 모음을 지칭할 수도 있다. 일부 예들에서, 본 명세서에서 사용된 바와 같은 "서브그룹" 이라는 용어는 OpenCL Specification Version 2.2, Document Revision 06 에서 정의된 바와 같이 작업 그룹 내의 작업-항목들의 그룹핑을 지칭할 수도 있다. 일부 예들에서, 본 명세서에서 사용된 바와 같은 "작업-항목" 이라는 용어는 OpenCL Specification Version 2.2, Document Revision 06 에 의해 정의된 바와 같이, 커널의 병렬적 실행의 모음 중 하나를 지칭할 수도 있다. 다른 예로서, 본 명세서에서 사용된 바와 같은 "작업-항목" 이라는 용어는 다른 컴퓨터 용어에 따라 스레드 또는 파이버를 지칭할 수도 있다. 일부 예들에서, 작업-항목은 계산 유닛 상에서 실행되는 작업-그룹의 일부로서 하나 이상의 프로세싱 엘리먼트들에 의해 실행될 수도 있다.
도 2 의 예에서 도시된 바와 같이, 컴퓨팅 디바이스 (2) 는 호스트 (20) 및 하나 이상의 계산 디바이스들 (22) 로 구성될 수도 있다. 호스트 (20) 및 하나 이상의 계산 디바이스들 (22) 은 프로세싱 유닛 (1) 을 포함할 수도 있다. 예를 들어, 호스트 (20) 는 CPU (예컨대, 본원에서 기술된 프로세싱 유닛 (1) 의 일 타입) 일 수도 있고, 하나 이상의 계산 디바이스들 (22) 은 하나 이상의 GPU 들 및/또는 CPU 들 (예컨대, 본원에서 기술된 프로세싱 유닛 (1) 의 2 가지 타입들) 을 포함할 수도 있다. 호스트 (20) 는 하나 이상의 버스들을 통해 또는 하나 이상의 다른 통신 매체들을 통해 하나 이상의 계산 디바이스들 (22) 에 통신가능하게 커플링될 수도 있다. 각각의 계산 디바이스 (22) 는 하나 이상의 계산 유닛들 (24) 을 포함할 수도 있다. 각각의 계산 유닛 (24) 은 하나 이상의 프로세싱 엘리먼트들 (26) 을 포함할 수도 있다. 각각의 계산 유닛 (24) 은 메모리 (예컨대, 이 용어가 OpenCL 컴퓨팅 플랫폼 명세에 의해 정의되는 바와 같이 전용 메모리) 를 포함할 수도 있다. 예를 들어, 액세스가능한 메모리 공간은 각각의 계산 유닛에 할당될 수도 있다. 액세스가능한 메모리 공간은 하나 이상의 물리적 메모리들의 일부일 수도 있다. 일부 예들에서, 각각의 계산 유닛에 할당된 액세스가능한 메모리 공간은 범용 레지스터들 (general purpose registers) 과 같이 하나 이상의 레지스터들을 포함할 수도 있다. 달리 진술하면, 일부 예들에서, 각 계산 유닛의 메모리 (예컨대, 전용 메모리) 는 하나 이상의 레지스터들 (예컨대, 범용 레지스터 (GPR) 들) 을 이용하여 구현될 수도 있다. 계산 유닛과 연관된 메모리는 그 계산 유닛의 하나 이상의 프로세싱 엘리먼트들 (26) 에 의해 액세스가능할 수도 있다. 일부 예들에서, 하나 이상의 프로세싱 엘리먼트들 (26) 은 그 위에서 작업-항목이 실행하도록 구성될 수도 있는 하나 이상의 가상 스칼라 프로세서들을 지칭할 수도 있다.
일부 예들에서, 호스트 (20) 는 OpenCL API 를 이용하는 컨텍스트와 상호작용하도록 구성되는 바와 같이 기술될 수도 있다. 컨텍스트는 그 안에서 커널들이 실행되는 환경 및 동기화 및 메모리 관리가 정의될 수도 있는 영역을 지칭할 수도 있다. 일부 예들에서, 컨텍스트는 디바이스들 (예컨대, 2 개 이상의 프로세싱 유닛들 (1)), 그들 디바이스들에 액세스가능한 메모리, 메모리 오브젝트들 상에서 커널(들) 또는 오퍼레이션들의 실행을 스케줄링하기 위해 사용되는 대응하는 메모리 특성들 및 하나 이상의 커맨드-큐들의 셋트를 포함할 수도 있다.
도 3 은 예시적인 시스템 (예컨대, 혼성 시스템) (11) 에서 도 2 에서 도시된 컴포넌트들의 일 예를 보다 자세히 나타낸다. 예를 들어, 호스트 (20) 는 호스트 메모리 (32) 를 포함하는 것으로서 도시된다. 하나 이상의 계산 디바이스들 (22) 은 계산 디바이스 (22-1) 및 계산 디바이스 (22-N) 로서 도시되고, 여기서, 계산 디바이스 (22-N) 는 하나보다 많은 계산 디바이스 (22) 를 수반하는 예들에서 추가적인 계산 디바이스들의 임의의 넘버를 나타낸다. 하나 이상의 계산 유닛들 (24) 은 계산 유닛 (24-1) 및 계산 유닛 (24-N) 으로서 도시되고, 여기서, 계산 유닛 (24-N) 은 하나보다 많은 계산 유닛 (24) 을 수반하는 예들에서 추가적인 계산 유닛들의 임의의 넘버를 나타낸다. 각 계산 유닛 (24) 은 하나 이상의 프로세싱 엘리먼트들 (26) 을 포함할 수도 있다. 도 2 의 예에서, 계산 유닛 (24-1) 의 하나 이상의 프로세싱 엘리먼트들 (26) 은 프로세싱 엘리먼트 (26A-1) 및 프로세싱 엘리먼트 (26A-N) 로서 도시되고, 여기서, 프로세싱 엘리먼트 (26A-N) 는 계산 유닛 (24-1) 에 대해 하나보다 많은 프로세싱 엘리먼트들 (26) 을 수반하는 예들에서 추가적인 프로세싱 엘리먼트들의 임의의 넘버를 나타낸다. 유사하게, 계산 유닛 (24-N) 의 하나 이상의 프로세싱 엘리먼트들 (26) 은 프로세싱 엘리먼트 (26B-1) 및 프로세싱 엘리먼트 (26B-N) 로서 도시되고, 여기서, 프로세싱 엘리먼트 (26B-N) 는 계산 유닛 (24-N) 에 대해 하나보다 많은 프로세싱 엘리먼트들 (26) 을 수반하는 예들에서 추가적인 프로세싱 엘리먼트들의 임의의 넘버를 나타낸다.
도 2 의 예에서, 각각의 계산 디바이스 (22) 는 메모리 (예컨대, 이 용어가 OpenCL 컴퓨팅 플랫폼 명세에 의해 정의되는 바와 같이 로컬 메모리) 를 포함할 수도 있다. 예를 들어, 액세스가능한 메모리 공간 (27) 이 각각의 계산 디바이스에 할당될 수도 있다. 액세스가능한 메모리 공간 (27) 은 하나 이상의 물리적 메모리들 (예컨대, 하나 이상의 내부 메모리들 (6)) 의 일부일 수도 있다. 일부 예들에서, 각 계산 디바이스 (22-1 내지 22-N) 에 할당된 액세스가능한 메모리 공간 (27) 은 메모리 제어기를 통해 액세스가능할 수도 있고, 이는, 계산 디바이스의 계산 유닛에 의해 발행된 메모리 요청들이, 이러한 예들에서, 메모리 제어기에 의해 수신되고 프로세싱됨을 의미한다. 달리 진술하면, 계산 디바이스 (예컨대, 계산 디바이스들 (22-1 내지 22-N) 중 하나) 의 로컬 메모리에 대한 액세스는 메모리 제어기에 의해 제어될 수도 있다.
각 계산 유닛 (24) 은 메모리 (예컨대, 이 용어가 OpenCL 컴퓨팅 플랫폼 명세에 의해 정의되는 바와 같이 전용 메모리) 를 포함할 수도 있다. 예를 들어, 액세스가능한 메모리 공간 (28) 이 각각의 계산 유닛에 할당될 수도 있다. 메모리 공간 (28) (예컨대, 메모리 공간 (28A-1 내지 28A-N) 및 메모리 공간 (28B-1 내지 28B-N)) 은, 일부 예들에서, 전용 메모리에 대응할 수도 있다. 액세스가능한 메모리 공간 (28) 은 하나 이상의 물리적 메모리들 (예컨대, 하나 이상의 내부 메모리들 (6)) 의 일부일 수도 있다. 일부 예들에서, 각 계산 유닛 (24-1 내지 24-N) 에 할당된 액세스가능한 메모리 공간은 범용 레지스터들과 같은 하나 이상의 레지스터들을 포함할 수도 있다. 달리 진술하면, 일부 예들에서, 각 계산 유닛 (24-1 내지 24-N) (예컨대, 전용 메모리) 의 메모리는 하나 이상의 레지스터들 (예컨대, 범용 레지스터 (GPR) 들) 을 이용하여 구현될 수도 있다. 계산 유닛과 연관된 메모리는 그 계산 유닛의 하나 이상의 프로세싱 엘리먼트들 (26) 에 의해 액세스가능할 수도 있다. 계산 유닛과 연관된 메모리는 특정 프로세싱 엘리먼트들에 할당될 수도 있다. 예를 들어, 메모리 공간 (28A-1) 은 프로세싱 엘리먼트 (26A-1) 에 의한 사용을 위해 프로세싱 엘리먼트 (26A-1) 에 할당될 수도 있다. 유사하게, 메모리 공간 (28A-1 내지 28A-N) 은 프로세싱 엘리먼트들 (26A-N) 에 의한 사용을 위해 프로세싱 엘리먼트들 (26A-1 내지 26A-N) 에 각각 할당될 수도 있다. 유사하게, 메모리 공간 (28B-1) 은 프로세싱 엘리먼트 (26B-1) 에 의한 사용을 위해 프로세싱 엘리먼트들 (26B-1) 에 각각 할당될 수도 있다. 유사하게, 메모리 공간 (28B-1 내지 28B-N) 은 프로세싱 엘리먼트들 (26B-N) 에 의한 사용을 위해 프로세싱 엘리먼트들 (26B-1 내지 26B-N) 에 각각 할당될 수도 있다. 각각의 프로세싱 엘리먼트 (26) 에 할당된 메모리 공간은 중첩되지 않을 수도 있다. 예를 들어, 프로세싱 엘리먼트 (26A-1) 에 할당된 임의의 레지스터들은 프로세싱 엘리먼트 (26A-N) 에 할당되지 않을 수도 있다. 일부 예들에서, 하나 이상의 프로세싱 엘리먼트들 (26) 은 그 위에서 작업-항목이 실행되도록 구성될 수도 있는 하나 이상의 가상적 스칼라 프로세서들을 지칭할 수도 있다.
프로세싱 유닛 (1) 은 하나 이상의 배리어들을 이용하여 복수의 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 하나 이상의 배리어들을 실행함으로써 하나 이상의 배리어들을 이용하여 복수의 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다. 프로세싱 유닛 (1) 은 하나 이상의 배리어들 (예컨대, OpenCL 컴퓨팅 플랫폼에 의해 정의된 바와 같이 작업-그룹 배리어) 을 이용하여 작업-그룹의 복수의 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 하나 이상의 배리어들 (예컨대, OpenCL 컴퓨팅 플랫폼에 의해 정의된 바와 같이 작업-그룹 배리어) 을 이용하여 작업-그룹의 모든 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다. 다른 예로서, 프로세싱 유닛 (1) 은 하나 이상의 배리어들 (예컨대, OpenCL 컴퓨팅 플랫폼에 의해 정의된 바와 같이 서브그룹 배리어) 을 이용하여 서브그룹의 복수의 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 하나 이상의 배리어들 (예컨대, OpenCL 컴퓨팅 플랫폼에 의해 정의된 바와 같이 서브그룹 배리어 및/또는 명명된 배리어) 을 이용하여 서브그룹의 모든 작업-항목들에 대해 동기화를 수행하도록 구성될 수도 있다.
일부 예들에서, 제 1 배리어는 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들을 동기화하기 위해 프로세싱 유닛 (1) 에 의해 실행될 수도 있다. 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들의 동기화는, 데이터가 예를 들어 생산자-소비자 관계에서 소비될 준비가 된 것을 나타낼 수도 있다. 예를 들어, 제 1 서브그룹의 작업-항목들 중 하나 이상 및/또는 제 2 서브그룹의 작업-항목들 중 하나 이상은 실행 동안 데이터를 생성했을 수도 있고, 액세스가능한 메모리 로케이션에 그 생성된 데이터를 저장했을 수도 있다. 일단 동기화되면, 프로세싱 유닛 (1) 은, 예를 들어, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 프로세싱 유닛 (1) 은, 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들이 제 2 배리어를 지나서 실행에 있어서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들을 동기화하는 제 2 배리어를 실행하도록 구성될 수도 있다. 일부 예들에서, 제 2 배리어는 데이터 전송이 완료되는 것 (예컨대, 생성된 데이터가 소비자에 의해 소비됨) 을 보장하는 것으로서 기술될 수도 있다. 일단 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들이 제 2 배리어를 지나서 실행에 있어서 진행하면, 제 1 서브그룹의 하나 이상의 작업-항목들 및 제 2 서브그룹의 하나 이상의 작업-항목들에 대응하는 메모리 로케이션들 (예컨대, 메모리 로케이션들에 할당된 레지스터들) 은, 일부 예들에서, 예를 들어, 다른 서브그룹 및/또는 작업그룹에 대응할수도 있거나 대응하지 않을 수도 있는 상이한 작업-항목들에 재할당될 수도 있다. 본원에 기술된 기법들은, 프로세싱 유닛 (1) 으로 하여금, 2 개의 상이한 서브그룹들 사이의 데이터의 공유를 가능하게 하기 위해 하나 이상의 배리어들을 이용하고, 그 다음에, 서브그룹 간 데이터 전송 후에 레지스터를 재사용 (예컨대, 재할당) 함으로써, 제한된 메모리 리소스들 (예컨대, 레지스터들) 을 재사용하는 것을 가능하게 한다.
본 명세서에서 사용된 바와 같이, 배리어는, 일부 예들에서, 2 개 이상의 작업-항목들을 동기화하는 함수를 지칭할 수도 있다. 예를 들어, 배리어는, 2 개 이상의 작업-항목들의 각각의 작업-항목이 배리어에 도달 (예컨대, 배리어를 실행) 할 때까지 2 개 이상의 작업 항목들의 추가적인 실행을 중지시킴으로써 2 개 이상의 작업-항목들을 동기화할 수도 있다. 일단 2 개 이상의 작업-항목들이 배리어에 도달 (예컨대, 배리어를 실행) 하고 나면, 배리어는 개념적으로 리프팅되고, 작업-항목들은 그 다음에 실행을 계속할 수도 있다. 작업-그룹 배리어는, 일부 예들에서, 작업-그룹의 모든 작업-항목들을 동기화하는 함수를 지칭할 수도 있음이 이해된다. 예를 들어, 작업-그룹 배리어는, 작업-그룹의 모든 작업-항목들이 작업-그룹 배리어에 도달 (예컨대, 작업-그룹 배리어를 실행) 할 때까지 작업-그룹의 각각의 작업-항목의 실행을 중단 또는 그 외에 중지할 수도 있다. 일단 작업-그룹의 모든 작업-항목들이 작업-그룹 배리어에 도달 (예컨대, 작업-그룹 배리어를 실행) 하고 나면, 작업-그룹 배리어는 개념적으로 리프팅되고, 작업-그룹의 모든 작업-항목들은 그 다음에 실행을 계속할 수도 있다. 유사하게, 서브그룹 배리어는, 일부 예들에서, 서브그룹 (예컨대, 작업-그룹의 작업-항목들의 서브그룹) 의 모든 작업-항목들을 동기화하는 함수를 지칭할 수도 있음이 이해된다. 예를 들어, 서브그룹 배리어는, 서브그룹의 모든 작업-항목들이 서브그룹 배리어에 도달 (예컨대, 서브그룹 배리어를 실행) 할 때까지 서브그룹의 각각의 작업-항목의 실행을 중단 또는 그 외에 중지할 수도 있다. 일단 서브그룹의 모든 작업-항목들이 서브그룹 배리어에 도달 (예컨대, 서브그룹 배리어를 실행) 하고 나면, 서브그룹 배리어는 개념적으로 리프팅되고, 서브그룹의 모든 작업-항목들은 그 다음에 실행을 계속할 수도 있다.
본원에 기술된 임의의 단계, 기능, 특징, 방법 등을 수행하도록 구성되는 프로세싱 유닛 (1) 은, 일부 예들에서, 기술된 단계, 기능, 특징, 방법 등을 야기하는 하나 이상의 명령들을 실행하도록 구성되는 프로세싱 유닛 (1) 을 지칭할 수도 있다. 일부 예들에서, 하나 이상의 명령들은 프로세싱 유닛 (1) 에 대해 액세스가능한 메모리 상에 저장될 수도 있다. 일 예로서, 본원에 기술된 임의의 단계, 기능, 특징, 방법 등을 수행하도록 구성되는 프로세싱 유닛 (1) 에 대한 언급은, 일부 예들에서, 기술된 단계, 기능, 특징, 방법 등을 야기하는 하나 이상의 명령들을 실행하도록 구성되는 프로세싱 유닛 (1) 의 임의의 계산 디바이스, 계산 유닛, 및/또는 프로세싱 엘리먼트를 지칭할 수도 있다. 일부 예들에서, 하나 이상의 명령들은, 계산 디바이스(들), 계산 유닛(들), 및/또는 프로세싱 엘리먼트(들)에 대해 액세스가능한 메모리 상에 저장될 수도 있다. 프로세싱 유닛 (1) 은, 동일한 서브그룹에 대응하는 작업-항목들 사이의 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은, 서브그룹 내 데이터 전송을 수행하기 위해 호출, 실행, 또는 그 외에 사용될 수도 있는 서브그룹 내 데이터 전송 메커니즘으로 구성될 수도 있다.
본 명세서에서 사용된 바와 같이, 데이터 전송은 데이터를 이동시키는 것, 데이터를 복사하는 것, 데이터를 공유하는 것 등을 지칭할 수도 있다. 유사하게, 데이터 공유에 대한 언급은 데이터 전송, 데이터 이동, 데이터 복사 등을 지칭할 수도 있다. 예를 들어, 본 명세서에서 언급된 서브그룹 간 데이터 공유는 또한, 서브그룹 간 데이터 이동, 서브그룹 간 데이터 복사, 서브그룹 간 데이터 전송으로서 지칭될 수도 있다. 예를 들어, 서브그룹 간 데이터 전송은 서브그룹 간 데이터 공유와 같은 뜻이다. 다른 예로서, 서브그룹 간 데이터 전송은 서브그룹 간 데이터 복사와 같은 뜻이다. 다른 예로서, 본 명세서에서 언급된 서브그룹 내 데이터 공유는 또한, 서브그룹 내 데이터 이동, 서브그룹 내 데이터 복사, 서브그룹 내 데이터 전송으로서 지칭될 수도 있다. 예를 들어, 서브그룹 내 데이터 전송은 서브그룹 내 데이터 공유와 같은 뜻이다. 다른 예로서, 서브그룹 내 데이터 전송은 서브그룹 내 데이터 복사와 같은 뜻이다.
일부 예들에서, 서브그룹 내 데이터 전송 메커니즘은, 업계에서 OpenCL 컴퓨팅 플랫폼 명세 (예컨대, OpenCL Extension # 35) 에 의해 정의된 바와 같은 cl_intel_subgroups API 와 같은, 서브그룹 내 셔플 메커니즘을 지칭한 것을 포함할 수도 있다. 하지만, 서브그룹 내 데이터 전송 메커니즘은, 하나 이상의 배리어들이 사용되는지 여부에 무관하게 동일한 서브그룹에 속하는 작업-항목들 사이의 데이터의 전송을 오직 허용한다는 점에서 제한된다. 예를 들어, 비록 OpenCL 컴퓨팅 플랫폼의 cl_intel_subgroup 의 서브그룹 내 셔플 메커니즘이 동일 서브그룹에서의 작업-항목들이 로컬 메모리 또는 배리어들의 사용 없이 데이터를 공유하도록 허용함에도 불구하고, 서브그룹 내 데이터 전송 메커니즘은 상이한 서브그룹들에 속하는 작업-항목들 사이의 데이터의 공유를 허용하지 않는다.
이 개시물은, 상이한 서브그룹들의 작업-항목들 사이의 서브그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다 (예컨대, 프로세싱 유닛 (1) 은 이러한 하나 이상의 기법들로 구성될 수도 있다). 예를 들어, 이 개시물은 서브그룹 간 데이터 전송을 가능하게 하기 위해 소프트웨어, 하드웨어, 또는 이들의 조합에서 구현될 수도 있는 하나 이상의 새로운 함수들을 기술한다. 일부 예들에서, 그 하나 이상의 새로운 함수들은 API 를 포함할 수도 있다. 서브그룹 간 데이터 전송을 가능하게 하는 함수는 서브그룹 간 데이터 전송 함수, 서브그룹 간 복사 함수, 서브그룹 간 공유 함수 등으로서 지칭될 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송 함수는 레지스터들 (예컨대, 범용 레지스터들) 사이의 데이터 전송을 지칭할 수도 있다. 다른 예들에서, 서브그룹 간 데이터 전송 함수는 상이한 서브그룹들에 할당된 메모리 공간 (예컨대, 임의의 메모리 로케이션) 사이의 데이터 전송을 지칭할 수도 있다. 예를 들어, 상이한 서브그룹들에 할당된 메모리 공간은, 하나 이상의 레지스터들을 이용할 수도 있고 이용하지 않을 수도 있는, 계산 유닛의 전용 메모리에서 할당된 메모리 공간을 포함할 수도 있다.
본원에 기술된 하나 이상의 기법들이 소프트웨어 (예컨대, 본원에 기술된 임의의 함수들 및/또는 API) 를 이용하여 구현될 수도 있는 예들에서, 이러한 소프트웨어에 대응하는 명령들은, 프로세싱 유닛 (1) 에 의해 (예컨대, 프로세싱 유닛 (1) 의 프로세싱 엘리먼트에 의해) 실행될 때, 프로세싱 유닛 (1) 으로 하여금 기술된 피처들을 수행하게 하는, 프로세싱 유닛 (1) 에 대해 액세스가능한 메모리 (예컨대, 컴퓨터 판독가능 저장 매체로서 기술될 수도 있는 프로세싱 유닛 (1) 의 메모리) 상에 저장될 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은, 서브그룹 간 데이터 전송을 수행하기 위해 호출, 실행, 또는 그 외에 사용될 수도 있는 서브그룹 간 데이터 전송 메커니즘으로 구성될 수도 있다. 서브그룹 간 데이터 전송 메커니즘이 소프트웨어를 이용하여 구현되는 예들에서, 프로세싱 유닛 (1) 은, 프로세싱 유닛 (1) 에 대해 액세스가능한 메모리 (예컨대, 컴퓨터 판독가능 저장 매체로서 기술될 수도 있는 프로세싱 유닛 (1) 의 메모리) 상에 저장된, 서브그룹 간 데이터 전송 메커니즘에 대응하는 하나 이상의 명령들을 실행하도록 구성될 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송 함수는, 하나 이상의 배리어들 (예컨대, OpenCL 에서의 명명된 배리어들 및 HSA 에서의 fbarriers (예컨대, 혼성 시스템 아키텍처 파운데이션에 의해 정의된 fbarriers) 과 같은, 하나 이상의 서브그룹 배리어들) 과 함께 구현될 수도 있다. 서브그룹 배리어는 작업그룹 배리어보다 더 가볍고, 이는, 서브그룹들이, 예를 들어, 쌍으로 동기화할 수 있기 때문이고, 이는, 일부 서브그룹들이 서브그룹 배리어 상에서 대기 또는 중단되는 동안, 다른 서브그룹들이 실행을 진행할 수 있는 것을 의미한다. 이에 따라, 이 개시물은, 서브그룹들이 서브그룹 배리어를 이용하여 동기화되는 상이한 서브그룹들의 서브그룹들에 대응하는 작업-항목들 사이의 서브그룹 간 데이터 전송을 가능하게 하기 위한 하나 이상의 기법들을 기술한다 (예컨대, 프로세싱 유닛 (1) 은 이러한 하나 이상의 기법들로 구성될 수도 있다). 예를 들어, 작업-그룹은 16 개의 서브그룹들을 포함할 수도 있다. 하나의 예에서, 프로세싱 유닛 (1) 은 제 1 서브그룹 배리어를 이용하여 서브그룹들 1-8 을 동기화하도록 구성될 수도 있고, 제 2 서브그룹 배리어를 이용하여 서브그룹들 9-16 을 동기화하도록 구성될 수도 있다.
하나의 예에서, 서브그룹 간 데이터 함수는 다음과 같은 신택스를 가질 수도 있다: gentype copy(gentype variable, int subgroup_id, int named_barrier_id). 이 예에서, 서브그룹 간 데이터 함수는 3 개의 입력 파라미터들: variable, subgroup_id, 및 named_barrier_id 을 포함할 수도 있다. 변수 (variable) 는 레지스터 (예컨대, GPR) 에서 할당될 수도 있는 메모리 로케이션 (예컨대, 전용 메모리 로케이션) 을 지칭할 수도 있다. 변수가 레지스터 (예컨대, GPR) 를 지칭하는 일 예에서, 그러면 이 변수는 어느 레지스터가 복사될 또는 공유될 데이터를 포함하는지를 나타낼 수도 있다. 서브그룹_id (subgroup_id) 는 서브그룹에 할당된 또는 그 외에 서브그룹에 대응하는 식별 넘버 (예컨대, ID) 를 지칭할 수도 있다. 명명된_배리어_id (named_barrier_id) 는 배리어 (예컨대, OpenCL 컴퓨팅 플랫폼에 의해 정의된 것과 같은 명명된 배리어 또는 HSA 컴퓨팅 플랫폼에 의해 정의된 것과 같은 fbarrier) 에 할당된 또는 그 외에 배리어에 대응하는 ID 를 지칭할 수도 있다.
예를 들어, variable = bar, subgroup_id = 5, 및 named_barrier_id = bar3 인 예 foo = copy(bar, 5, bar3) 를 들어보자. 이 예에서, 그것으로부터 데이터가 복사될 소스 메모리 공간 (예컨대, 소스 레지스터) 은 bar 에 할당된 메모리 공간에 대응할 수도 있고, 그것에 데이터가 복사될 목적지 메모리 공간 (예컨대, 목적지 레지스터(들)) 은 foo 가 할당되는 메모리 공간에 대응할 수도 있다.
일부 예들에서, subgroup_id 및 named_barrier_id 양자는 서브그룹-균일 (subgroup-uniform) 일 수도 있고, 이는, 이들 2 개의 입력 파라미터들이 서브그룹에서의 각각의 작업-항목에 대해 동일한 값을 포함할 수도 있음을 의미한다. 다음과 같은 예시적인 코드가 이를 기술하기 위해 사용된다:
int foo;
if(sub_group_local_id() ==5 ){
subgroup_id = 3;
}
else{
subgroup_id = 7;
}
foo = copy(bar, subgroup_id, bar3);
이 예에서, subgroup_id 는, 작업-항목 #5 가 subgroup_id = 7 로부터 데이터를 복사하기를 원하는 한편, 동일한 서브그룹에서의 모든 다른 작업-항목들이 subgroup_id = 5 로부터 데이터를 복사하기를 원하기 때문에, 서브그룹-균일이 아니다. 하지만, 명명된 배리어 (즉, 특정된 named_barrier_id 에 대응하는 명명된 배리어) 는, 그것이 모든 작업-항목들에 대해 bar3 이기 때문에, 서브그룹-균일이다. subgroup_id 및/또는 named_barrier_id 는 서브그룹-균일일 수도 있거나 아닐 수도 있다.
다른 예에서, 서브그룹 간 데이터 전송은 movXw 명령 셋트 아키텍처 (Instruction Set Architecture; ISA) 명령을 이용하여 가능해질 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은, 다음과 같은 신택스: movXw Rd, Rs, srcSubgroupId 를 가질 수도 있는 movXw ISA 명령으로 상이한 서브그룹들의 상이한 작업-항목들에 대응하는 레지스터들 (예컨대, 범용 레지스터들) 사이에 데이터를 공유하도록 구성될 수도 있다. 하나 이상의 배리어들 (예컨대, 명명된 배리어들) 은 movXw 명령을 둘러쌀수도 있다. 예를 들어, 서브그룹 간 데이터 전송은 nbar ID, Rx 의 새로운 IDS 명령과 함께 movXw 를 이용하여 가능해질 수도 있고, 여기서, ID 는 배리어 식별자로서 작동하고, Rx 는 서브그룹들의 넘버를 명시한다. 하나의 예시적인 구현에서, 각각의 명명된 배리어 (예컨대, nbar) 는 배리어 식별자 (즉, ID) 에 의해 카운터와 연관될 수도 있다. 각각의 nbar ID 와 연관된 각각의 카운터는 0 으로 초기화될 수도 있다. 각각의 nbar ID 에 대해, 거기에 대응하는 카운터는 N 명령들 시에 1 만큼 증분될 수도 있다. 특정 nbar 에 대해, nbar 에 대응하는 카운터가 N 의 값에 도달할 때까지 nbar 는 서브그룹에 대응하는 작업-항목들의 실행을 차단 (예컨대, 중단) 할 수도 있다. 일단 N 의 값이 도달되면, 카운터는 0 으로 리셋될 수도 있고, 배리어에 의해 중단되었던 임의의 서브그룹들에 대응하는 작업-항목들은 릴리스된다 (예컨대, 작업-항목들은 그들의 실행에 있어서 진행할 수도 있다). 도 4 는 movXw 에 의해 서브그룹들 사이에 데이터를 전송하기 위해 사용되는 nbar 를 이용한 동기화의 하나의 예를 도시한다. 도 4 의 예에서, 서브그룹 2 의 R2 가 서브그룹 1 의 R0 로 복사된다.
다른 예에서, 서브그룹 간 데이터 함수는 다음과 같은 신택스를 가질 수도 있다:
gentype wg_shuffle
(
gentype var,
int srcSubgroupId,
int srcSubgroupLocalId,
named_barrier bar
)
wg_shuffle 함수는, 동기화를 위해 특정된 배리어 bar (예컨대, 명명된 배리어 bar) 를 이용하여 특정된 서브그룹 srcSubgroupId 및 그 서브그룹으로부터의 특정된 작업-항목 (srcSubgroupLocalId) 의 특정된 변수 var 로부터 데이터를 복사할 수도 있다. 일부 예들에서, wg_shuffle 함수는 다음과 같이 구현될 수도 있다:
{
gentype tmp, ret;
bar.wait();
tmp = inter_subgroup_copy( srcSubgroupId)
bar.wait();
ret = intra_subgroup_shuffle ( srcSubgroupLocalId, tmp);
return ret;
}
일부 예들에서, 프로세싱 유닛 (1) 은 단일의 하드웨어 명령을 이용하여 본원에 기술된 임의의 함수들 및/또는 구현 상세들을 구현하도록 구성될 수도 있다.
다른 예에서, 서브그룹 간 데이터 함수는 다음과 같은 신택스: gentype subgroup_exchange(gentype var, int srcSubgroupId) 를 가질 수도 있다. 이 예에서, 서브그룹 간 데이터 함수는 2 개의 입력 파라미터들: var 및 srcSubgroupId 을 포함할 수도 있다. var 은 레지스터 (예컨대, GPR) 에서 할당될 수도 있는 메모리 로케이션 (예컨대, 전용 메모리 로케이션) 을 지칭할 수도 있다. 본 명세서에서 사용된 바와 같이, 레지스터는 하드웨어 레지스터를 지칭할 수도 있다. 변수가 레지스터 (예컨대, GPR) 를 지칭하는 예들에서, 그러면 이 변수는 어느 레지스터가 카피되거나 공유될 데이터를 포함하는지를 나타낼 수도 있다. srcSubgroupId 는 서브그룹에 할당되거나 그 외에 서브그룹에 대응하는 식별 넘버 (예컨대, ID) 를 지칭할 수도 있다. 예를 들어, ID 들 0, 1, 및 2 를 갖는 3 개의 서브그룹들은 도 5 에 도시된 예에서 서브그룹 배리어 K 상에서 순환적 교환을 행할 수도 있다. 일부 예들에서, 서브그룹 내의 모든 작업-항목은 함수에 의해 특정된 데이터 전송에 참여하여야만 한다. 다른 예들에서, 데이터 전송 함수가 조건적 제어 플로우 내로 인베딩될 수도 있기 때문에, 서브그룹 내의 모든 작업-항목이 함수에 의해 특정된 데이터 전송에 참여하여야만 하는 것은 아니다. 이러한 예들에서, 비록 함수에 의해 특정된 데이터 전송이 서브그룹 내의 모든 작업-항목이 함수에 의해 특정된 데이터 전송에 참여하는 것처럼 보이도록 정의될 수도 있음지만, 일부 작업-항목들은 조건적 제어 플로우에서 특정 브랜치를 취할 수도 있고; 그리고, 따라서, 데이터 전송에 참여하지 않을 것이다.
일부 예들에서, srcSubgroupId 는 각각의 서브그룹에 걸쳐 균일할 수도 있고, 이는, srcSubgroupID 가 서브그룹에서 각각의 작업-항목에 대해 동일한 값을 포함할 수도 있음을 의미한다. 달리 진술하면, srcSubgroupId 가 서브그룹-균일인 경우, 이것은, 서븍룹에서의 모든 작업-항목들이 데이터를 동일한 소스 서브그룹으로부터 복사할 것이라는 것을 의미한다. 도 5 에서 도시된 예에서, 이 코드는, 3 개의 서브그룹들에 걸쳐 순환적 데이터 전송이 구현될 수도 있는 것을 나타낸다. 예를 들어, 서브그룹 1 로부터의 데이터는 서브그룹 1 로 복사될 수도 있고, 서브그룹 2 로부터의 데이터는 서브그룹 1 로 복사될 수도 있으며, 서브그룹 0 으로부터의 데이터는 서브그룹 2 로 복사될 수도 있다. 일부 예들에서, 순환적 데이터 전송은 단일 명령으로 구현될 수도 있다. 각각의 작업-항목은 논리적으로 모든 레지스터들의 그 자신의 복사본을 가질 수도 있음을 이해하여야 한다.
서브그룹들 사이의 데이터 전송 (예컨대, 교환) 은 방향 식별자들을 이용하여 구현될 수도 있다. 예를 들어, 서브그룹들 사이의 데이터 전송은 업 (up) 및 다운 (down) 식별자들을 이용하여 구현될 수도 있다. 이러한 예에서, 업은 모듈러 패턴에서 subgroup_id=N 으로부터 subgroup_id=N+1 로를 나타낼 수도 있고, 다운은 subgroup_id=N 으로부터 subgroup_id=N-1 로를 나타낼 수도 있다. 일부 예들에서, xor 패턴이 사용될 수도 있다. 본 명세서에서 사용된 바와 같이, xor 패턴은 데이터가 그룹들 (예컨대, 서브그룹들) 내에서 교환될 것이라는 것을 나타내는 데이터 패턴을 지칭할 수도 있다. 예를 들어, xor 1 은, 작업-항목들이 다음과 같은 패턴: 0↔1, 2↔3, 4↔5 등으로 데이터를 교환할 수도 있음을 의미한다.
일부 예들에서, 서브그룹 간 데이터 함수 및/또는 서브그룹 내 및 서브그룹 간 데이터 함수는 이들 방향 식별자들 및/또는 xor 패턴을 이용하여 구현될 수도 있다. 예를 들어, 서브그룹 간 데이터 함수는 다음과 같은 신택스를 가질 수도 있다: gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier *barrier_array ). 이 예에서, 서브그룹 간 데이터 함수는 4 개의 입력 파라미터들을 포함할 수도 있다: var, count, named_barrier, 및 barrier_array. var 는 레지스터 (예컨대, GPR) 에서 할당될 수도 있는 메모리 로케이션 (예컨대, 전용 메모리 로케이션) 을 지칭할 수도 있다. 변수가 레지스터 (예컨대, GPR) 를 가리키는 예들에서, 그러면 이 변수는 어느 레지스터가 복사될 또는 공유될 데이터를 포함하는지를 나타낼 수도 있다. count 는 롤-오버 (roll-over) 를 계산하기 위해 사용될 수도 있는 지수 2 의 상수를 나타낼 수도 있다. 예를 들어, 카운트가 8 이고 오퍼레이션이 "업 (up)" 인 경우에는, 교환 패턴은 "0=>1, 1=>2, ..., 7=>0, 8=>9, ..., 15=>8, 16=>17, ..." 일 것이다. barrier_array 는 사용될 명명된 배리어들의 어레이를 나타낼 수도 있다. 예를 들어, 오퍼레이션이 "업" 이고 서브그룹 사이즈가 32 이며, 카운트 (이전 파라미터) 가 8 인 경우에, 4 개의 명명된 배리어들이 사용될 필요가 있을 수도 있다 (예컨대, 8 개의 인접 서브그룹들의 각각의 그룹이 독립적인 명명된 배리어를 이용하고 있을 것이다).
이 개시물은, 동일한 서브그룹에 속하거나 속하지 않는 임의의 작업-항목들 사이의 데이터 전송을 가능하게 하기 위해 서브그룹 내 데이터 전송 기법들을 서브그룹 간 데이터 전송 기법들과 결합하기 위한 하나 이상의 기법들을 기술한다 (프로세싱 유닛 (1) 은 이러한 하나 이상의 기법들로 구성될 수도 있다). 예를 들어, 동일한 서브그룹에 속하거나 속하지 않는 임의의 작업-항목들 사이의 데이터 전송을 가능하게 하기 위해 본원에 기술된 서브그룹 간 데이터 전송 기법들은 서브그룹 내 데이터 전송 기법 (예컨대, cl_intel_subgroup) 과 함께 구현될 수도 있다. 다른 예로서, 이 개시물은 서브그룹 내 및 간 데이터 전송을 가능하게 하기 위해 소프트웨어, 하드웨어, 또는 이들의 조함으로 구현될 수도 있는 하나 이상의 새로운 기능들을 기술한다. 이러한 예에서, 이 개시물은 서브그룹 내 및/또는 간 데이터 전송을 가능하게 하기 위해 소프트웨어, 하드웨어, 또는 이들의 조함으로 구현될 수도 있는 단일 함수의 예들을 기술한다. 이 단일 함수는 다음과 같은 신택스를 가질 수도 있다: Gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, Int shuffle_cnt, Int subgroup_cnt). {} 는 BNF 표기법을 나타낸다. 이에 따라, 상기 식별된 단일 함수는, sub_group_shuffle_up_exchange_up(gentype var, Int shuffle_cnt, Int subgroup_cnt), sub_group_shuffle_up_exchange_down(gentype var, Int shuffle_cnt, Int subgroup_cnt), 및 sub_group_shuffle_xor_exhange_xor(gentype var, Int shuffle_cnt, Int subgroup_cnt) 와 같이, 이 단일 함수로부터의 9 가지 상이한 가능성들을 나타낸다. 셔플 (shuffle) 은 서브그룹 내 데이터 전송을 나타내기 위해 사용되고, exchange 는 서브그룹 간 데이터 전송을 나타내기 위해 사용된다.
상기 나타낸 바와 같이, 이 단일 함수는 방향 식별자들을 이용하여 구현될 수도 있다. 예를 들어, 서브그룹들 사이의 데이터 전송은 업 및 다운 식별자들을 이용하여 구현될 수도 있다. 이러한 예에서, 업은 모듈러 패턴에서 subgroup_id=N 으로부터 subgroup_id=N+1 로를 나타낼 수도 있고, 다운은 subgroup_id=N 으로부터 subgroup_id=N-1 로를 나타낼 수도 있다. 일부 예들에서, xor 패턴이 사용될 수도 있다.
프로세싱 유닛 (1) 은 상이한 서브그룹들에 대응하는 작업-항목들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은, 서브그룹 간 데이터 전송을 수행하기 위해 호출, 실행, 또는 그 외에 사용될 수도 있는 서브그룹 간 데이터 전송 메커니즘으로 구성될 수도 있다. 다른 예로서, 프로세싱 유닛 (1) 은 상이한 서브그룹들 및/또는 동일한 서브그룹들 사이의 서브그룹 간 및/또는 내 데이터 전송을 각각 수행하기 위해 호출, 실행, 또는 그 외에 사용될 수도 있는 데이터 전송 메커니즘으로 구성될 수도 있다. 본 명세서에서 사용된 바와 같이, 데이터 전송은 데이터 이동, 데이터 복사, 데이터 공유 등을 지칭할 수도 있다. 유사하게, 데이터 공유에 대한 언급은 데이터 전송, 데이터 이동, 데이터 복사 등을 지칭할 수도 있다.
도 6 은 본원에 기술된 기법들에 따른 서브그룹 프로세싱의 일 예를 나타낸다. 도 6 의 예에서, 프로세싱 유닛 (1) 은 하나 이상의 프로세싱 엘리먼트들 (예컨대, PE 1 내지 PE N, 여기서, N 은 정수) 상에서 하나 이상의 서브그룹들 (예컨대, 서브그룹 1 내지 서브그룹 M, 여기서, M 은 정수) 을 실행하도록 구성될 수도 있다. 보다 구체적으로, 프로세싱 유닛 (1) 은, 하나 이상의 프로세싱 엘리먼트들 (26) (예를 들어, 프로세싱 엘리먼트들 (1-N) 은 각각 계산 유닛 (24-1) 상의 프로세싱 엘리먼트들 (26A-1 내지 26A-N) 로부터의 프로세싱 엘리먼트일 수도 있다) 상에서 하나 이상의 작업-항목들을 실행하도록 구성될 수도 있고, 여기서, 하나 이상의 작업-항목들은 하나 이상의 서브그룹들에 대응한다. 도시된 바와 같이, 각 서브그룹은 하나 이상의 작업-항목들을 포함한다. 예를 들어, 도 6 에서 서브그룹 1 의 하나 이상의 작업-항목들은 작업-항목 1-1, 작업-항목 1-2, 및 작업-항목 1-Q 에 의해 표현되고, 여기서, Q 는 정수이다. 유사하게, 도 6 에서 서브그룹 2 의 하나 이상의 작업-항목들은 작업-항목 2-1, 작업-항목 2-2, 및 작업-항목 2-Q 에 의해 표현되고, 여기서, Q 는 정수이다. 유사하게, 도 6 에서 서브그룹 3 의 하나 이상의 작업-항목들은 작업-항목 3-1, 작업-항목 3-2, 및 작업-항목 3-Q 에 의해 표현되고, 여기서, Q 는 정수이다. 유사하게, 도 6 에서 서브그룹 M (여기서 M 은 정수이다) 의 하나 이상의 작업-항목들은 작업-항목 M-1, 작업-항목 M-2, 및 작업-항목 M-Q 에 의해 표현되고, 여기서, Q 는 정수이다.
각각의 작업-항목은 프로세싱 유닛 (1) 의 프로세싱 엘리먼트를 이용하여 프로세싱될 수도 있고, 각각의 프로세싱 엘리먼트는 하나 이상의 레지스터들 (예컨대, 범용 레지스터들) 의 뱅크 (bank) 를 포함할 수도 있다. 예를 들어, 프로세싱 엘리먼트들 1, 2, 및 N (이들의 각각은 본원에 기술된 동일 또는 상이한 계산 유닛 (24) 의 상이한 프로세싱 엘리먼트 (26) 일 수도 있다) 은 각각의 작업-항목에 대해 상이한 레지스터들을 포함하는 것으로서 도 6 에서 도시되고, 이는 상이한 레지스터 (예컨대, GPR) 가 각각의 작업-항목에 할당될 수도 있음을 의미한다. 프로세싱 엘리먼트 N (여기서 N 은 정수) 은 임의의 프로세싱 엘리먼트 넘버를 나타낸다. 예를 들어, 프로세싱 엘리먼트 1 은 작업-항목들 (1-1, 2-1, 3-1, 및 M-1) 에 각각 할당될 수도 있는 하나 이상의 레지스터들 (1-1, 1-2, 1-3, 및 1-P) (여기서, P 는 정수) 를 포함할 수도 있다. 유사하게, 프로세싱 엘리먼트 2 는 작업-항목들 (1-2, 2-2, 3-2, 및 M-2) 에 각각 할당될 수도 있는 하나 이상의 레지스터들 (2-1, 2-2, 2-3, 및 2-P) (여기서, P 는 정수) 를 포함할 수도 있다. 유사하게, 프로세싱 엘리먼트 M 은 작업-항목들 (1-Q, 2-Q, 3-Q, 및 M-Q) (여기서, M 및 Q 는 각각 정수) 에 각각 할당될 수도 있는 하나 이상의 레지스터들 (M-1, M-2, M-3, 및 M-P) (여기서, M 및 Q 는 각각 정수) 를 포함할 수도 있다.
프로세싱 유닛 (1) 은, 서브그룹 간 데이터 전송으로서 라벨링된 도 6 의 우측에 상 및 하 화살표들에 의해 나타내어진 바와 같이, 상이한 서브그룹들에서의 작업-항목들에 대응하는 레지스터들 사이에 데이터를 전송하기 위해 본원에 기술된 하나 이상의 기법들로 구성될 수도 있다. 프로세싱 유닛 (1) 은 서브그룹 내 데이터 전송으로서 라벨링된 도 6 의 하부에 화살표들에 의해 나타내어진 바와 같이, 동일한 서브그룹에서의 작업-항목들에 대응하는 레지스터들 사이에 데이터를 전송하기 위해 본원에 기술된 하나 이상의 기법들로 구성될 수도 있다. 달리 진술하면, 프로세싱 유닛 (1) 은 수평으로 또는 수직으로 데이터 전송을 수행하도록 구성될 수도 있다.
도 7 은 본 개시의 예시적인 방법을 나타내는 플로우차트이다. 도 7 의 방법은 하나 이상의 프로세싱 유닛들 (1) (예컨대, 하나 이상의 CPU 들, 하나 이상의 GPU 들, 하나 이상의 병렬 프로세싱 유닛들 (예컨대, 병렬적 프로세싱을 수행하도록 구성된 임의의 프로세싱 유닛), 하나 이상의 SoC 들, 또는 이들의 임의의 조합들) 에 의해 수행될 수도 있다. 도 7 은 이 개시물의 하나 이상의 기법들과 일치하는 하나의 예시적인 방법을 나타낸다.
프로세싱 유닛 (1) 은 제 1 서브그룹에 대응하는 작업-항목들 및 제 2 서브그룹에 대응하는 작업-항목들을 배리어로 동기화하도록 구성될 수도 있다 (702). 일부 예들에서, 프로세싱 유닛은 하나 이상의 계산 유닛들을 포함할 수도 있다. 하나 이상의 계산 유닛들의 각각은 하나 이상의 프로세싱 엘리먼트들을 포함할 수도 있다. 프로세싱 유닛은 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리를 포함할 수도 있다.
프로세싱 유닛 (1) 은 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다 (704). 일부 예들에서, 프로세싱 유닛 (1) 은 로컬 메모리를 이용하여 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송은 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것 또는 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함할 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송은, 제 1 서브그룹과 연관된 제 1 메모리 로케이션 (예컨대, 제 1 레지스터) (예컨대, 제 1 서브그룹에 할당된 제 1 메모리 로케이션, 제 1 서브그룹의 작업-항목에 할당된 제 1 메모리 로케이션 등) 으로부터 제 2 서브그룹과 연관된 제 2 메모리 로케이션 (예컨대, 제 2 레지스터) (예컨대, 제 2 서브그룹에 할당된 제 2 메모리 로케이션, 제 2 서브그룹의 작업-항목에 할당된 제 2 메모리 로케이션 등) 으로 데이터를 복사하는 것 또는 제 2 서브그룹과 연관된 제 2 메모리 로케이션 (예컨대, 제 2 레지스터) 으로부터 제 1 서브그룹과 연관된 제 1 메모리 로케이션 (예컨대, 제 1 레지스터) 으로 데이터를 복사하는 것을 포함할 수도 있다. 제 1 메모리 로케이션 및/또는 제 2 메모리 로케이션은 하나 이상의 레지스터들을 포함할 수도 있다. 예를 들어, 제 1 메모리 로케이션은 범용 레지스터일 수도 있고, 제 2 메모리 로케이션은 범용 레지스터일 수도 있다. 제 1 메모리 로케이션 및 제 2 메모리 로케이션은 프로세싱 유닛의 계산 유닛의 프로세싱 엘리먼트에 할당된 메모리 공간에 대응할 수도 있다. 예를 들어, 제 1 메모리 로케이션 및 제 2 메모리 로케이션은 프로세싱 엘리먼트에 할당된 전용 메모리 공간에 대응할 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송은 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들로부터 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들로 데이터를 복사하는 것 또는 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들로부터 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들로 데이터를 복사하는 것을 포함할 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송은, 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로 데이터를 복사하는 것 또는 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로 데이터를 복사하는 것을 포함할 수도 있다. 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 및 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 은 범용 레지스터들일 수도 있다. 하나 이상의 메모리 로케이션들은 프로세싱 유닛의 계산 유닛의 프로세싱 엘리먼트에 할당된 메모리 공간에 대응할 수도 있다. 예를 들어, 하나 이상의 메모리 로케이션들은 프로세싱 엘리먼트에 할당된 전용 메모리 공간에 대응할 수도 있다.
일부 예들에서, 제 1 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응할 수도 있고 (예컨대, 작업-항목들은 제 1 작업-그룹에 속할 수도 있는 제 1 서브그룹에 속할 수도 있다), 제 2 서브그룹에 대응하는 작업-항목들은 제 2 작업-그룹에 대응할 수도 있다 (예컨대, 작업-항목들은 제 2 작업-그룹에 속할 수도 있는 제 2 서브그룹에 속할 수도 있다). 다른 예들에서, 제 1 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응할 수도 있고 (예컨대, 작업-항목들은 제 1 작업-그룹에 속할 수도 있는 제 1 서브그룹에 속할 수도 있다), 제 2 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응할 수도 있다 (예컨대, 작업-항목들은 제 1 작업-그룹에 속할 수도 있는 제 2 서브그룹에 속할 수도 있다).
상술된 바와 같이, 프로세싱 유닛 (1) 은 제 1 서브그룹에 대응하는 작업-항목들 및 제 2 서브그룹에 대응하는 작업-항목들을 배리어로 동기화하도록 구성될 수도 있다. 일부 예들에서, 배리어는 명명된 배리어 또는 임의의 서브그룹 배리어일 수도 있다. 일부 예들에서, 명명된 배리어는 서브그룹 배리어의 하나의 타입일 수도 있다. 예를 들어, 명명된 배리어 및 서브그룹 배리어는 work_group_named_barrier (uint sub_group_count) 를 포함할 수도 있다. 이 예에서, sub_group_count 는 동기화될 작업 그룹에서의 서브그룹들의 수를 나타낼 수도 있고, 여기서, 제 1 서브그룹 및 제 2 서브그룹은 작업 작업-그룹에 속한다. 다른 예로서, 명명된 배리어 및 서브그룹 배리어는 OpenCL 컴퓨팅 플랫폼 명세 (예컨대, OpenCL C++ Specification, Version 1.0, Document Revision 22) 에 의해 정의된 바와 같이, cl_khr_sub_group_named_barrier 를 포함할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 서브그룹 간 데이터 전송 메커니즘을 이용하여 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함할 수도 있다. 소프트웨어 함수는 API 함수를 포함할 수도 있다. 일부 예들에서, 소프트웨어 함수는 하나 이상의 원자적 오퍼레이션들 (atomic operations) 을 포함할 수도 있다. 다른 예들에서, 소프트웨어 함수는 오직 일 원자적 오퍼레이션 (예컨대, 단일 원자적 오퍼레이션) 을 포함할 수도 있다. 다른 예들에서, 소프트웨어 함수는 오직 복수의 원자적 오퍼레이션들만을 포함할 수도 있다.
일부 예들에서, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송은 동시에 발생한다. 예를 들어, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 전송하는 것 및 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 전송하는 것은 동시에 발생할 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송 메커니즘에 대응하는 소프트웨어 함수 (예컨대, API 함수) 는 gentype copy(gentype variable, int subgroup_id, int named_barrier_id) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id) 을 포함할 수도 있다. 다른 예들에서, API 함수는 gentype subgroup_exchange(gentype var, int srcSubgroupId) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array ) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id) 를 포함할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 프로세싱 유닛의 임의의 메모리 제어기를 이용함이 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 프로세싱 유닛의 임의의 메모리 제어기에 메모리 요청을 전송함이 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 제 1 서브그룹의 제 1 작업-항목과 제 1 서브그룹의 제 2 작업-항목 사이에, 또는 제 2 서브그룹의 제 1 작업-항목과 제 2 서브그룹의 제 2 작업-항목 사이에 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있다. 서브그룹 내 데이터 전송은 상이한 서브그룹들 사이에 데이터를 전송하지 않는다. 예를 들어, 서브그룹 내 데이터 전송은 상이한 서브그룹들에 속하는 작업-항목들 사이에 데이터를 전송하지 않는다.
프로세싱 유닛 (1) 은 서브그룹 내 데이터 전송 메커니즘을 이용하여 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있다. 서브그룹 내 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함할 수도 있다. 소프트웨어 함수는 API 함수를 포함할 수도 있다. 일부 예들에서, API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함할 수도 있다.
도 8 은 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다. 도 8 의 방법은 하나 이상의 프로세싱 유닛들 (1) (예컨대, 하나 이상의 CPU 들, 하나 이상의 GPU 들, 하나 이상의 병렬 프로세싱 유닛들 (예컨대, 병렬적 프로세싱을 수행하도록 구성된 임의의 프로세싱 유닛), 하나 이상의 SoC 들, 또는 이들의 임의의 조합들) 에 의해 수행될 수도 있다. 도 8 은 이 개시물의 하나 이상의 기법들과 일치하는 하나의 예시적인 방법을 나타낸다.
프로세싱 유닛 (1) 은 복수의 서브그룹들을 하나 이상의 배리어들로 동기화하도록 구성될 수도 있다 (802). 일부 예들에서, 프로세싱 유닛은 하나 이상의 계산 유닛들을 포함할 수도 있다. 하나 이상의 계산 유닛들의 각각은 하나 이상의 프로세싱 엘리먼트들을 포함할 수도 있다. 프로세싱 유닛은 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리를 포함할 수도 있다. 일부 예들에서, 복수의 서브그룹들은 단일 작업-그룹에 속할 수도 있다. 일부 예들에서, 복수의 서브그룹들은 2 개의 서브그룹들, 3 개의 서브그룹들, 4 개의 서브그룹들, 5 개의 서브그룹들, 6 개의 서브그룹들, 7 개의 서브그룹들, 또는 8 개의 서브그룹들을 포함할 수도 있다. 다른 예들에서, 복수의 서브그룹들은 하나 이상의 서브그룹들을 포함할 수도 있다.
프로세싱 유닛 (1) 은 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다 (804). 일부 예들에서, 프로세싱 유닛 (1) 은 로컬 메모리를 이용함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 복수의 서브그룹들의 적어도 하나의 서브그룹으로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들로 데이터를 복사하는 것을 포함할 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송은 xor 패턴에 따라 복수의 서브그룹들의 적어도 하나의 서브그룹으로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들의 적어도 하나의 서브그룹과 복수의 서브그룹들의 하나 이상의 다른 서브그룹들 사이의 서브그룹 간 데이터 전송은 동시에 일어날 수도 있다.
프로세싱 유닛 (1) 은 복수의 서브그룹들의 하나 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 동시에 수행하도록 구성될 수도 있다. 예를 들어, 하나 이상의 서브그룹들 사이의 임의의 데이터 전송은 동시에 일어날 수도 있다. 프로세싱 유닛 (1) 은 상이한 서브그룹들의 2 개 이상의 작업-항목들 사이의 서브그룹 간 데이터 전송을 동시에 수행하도록 구성될 수도 있다. 예를 들어, 제 1 서브그룹의 하나 이상의 작업-항목들과, 그 제 1 서브그룹과는 상이한 하나 이상의 서브그룹들의 하나 이상의 작업-항목들 사이의 임의의 데이터 전송은 동시에 일어날 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송은, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 또는 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 2 개 이상의 서브그룹을 포함할 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송은, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 1 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 또는 제 3 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것 중 적어도 하나를 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 3 개 이상의 서브그룹들을 포함할 수도 있다.
일부 예들에서, xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 및 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 3 개 이상의 서브그룹들을 포함할 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송은, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 1 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 제 1 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것, 제 4 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 제 4 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 또는 제 4 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것 중 적어도 하나를 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 4 개 이상의 서브그룹들을 포함할 수도 있다.
일부 예들에서, xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것, 및 제 4 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 4 개 이상의 서브그룹들을 포함할 수도 있다.
일부 예들에서, xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것, 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것, 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것, 및 제 4 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들은 4 개 이상의 서브그룹들을 포함할 수도 있다.
일부 예들에서, 복수의 서브그룹들은 2 개, 3 개, 4 개, 5 개, 6 개, 7 개, 8 개, 또는 더 많은 서브그룹들을 포함할 수도 있다. 이러한 예들에서, 서브그룹 간 데이터 전송은: (1) 제 1 서브그룹으로부터, 복수의 서브그룹들의 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (2) 제 2 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (3) 제 3 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (4) 제 4 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (5) 제 5 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (6) 제 6 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (7) 제 7 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 또는 (8) 제 8 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 7 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 중 적어도 하나를 포함할 수도 있다.
일부 예들에서, 복수의 서브그룹들은 2 개, 3 개, 4 개, 5 개, 6 개, 7 개, 8 개, 또는 더 많은 서브그룹들을 포함할 수도 있다. 이러한 예들에서, 서브그룹 간 데이터 전송은: (1) 제 1 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (2) 제 2 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (3) 제 3 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (4) 제 4 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (5) 제 5 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (6) 제 6 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (7) 제 7 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; (8) 제 8 서브그룹과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 7 서브그룹과 연관된 적어도 하나의 메모리 로케이션 (예컨대, 레지스터) 으로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 중 적어도 하나를 포함할 수도 있다. 하나 이상의 메모리 로케이션들은 프로세싱 유닛의 계산 유닛의 프로세싱 엘리먼트에 할당된 메모리 공간에 대응할 수도 있다. 예를 들어, 하나 이상의 메모리 로케이션들은 프로세싱 엘리먼트에 할당된 전용 메모리 공간에 대응할 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송은 복수의 서브그룹들의 2 개 이상의 서브그룹들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 2 개 이상의 서브그룹들과 연관된 하나 이상의 다른 메모리 로케이션들 (예컨대, 하나 이상의 다른 레지스터들) 로 데이터를 복사하는 것을 포함할 수도 있다. 2 개 이상의 서브그룹들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 및 2 개 이상의 서브그룹들과 연관된 하나 이상의 다른 메모리 로케이션들 (예컨대, 하나 이상의 다른 레지스터들) 은 범용 레지스터들을 포함할 수도 있다. 하나 이상의 메모리 로케이션들은 프로세싱 유닛의 계산 유닛의 프로세싱 엘리먼트에 할당된 메모리 공간에 대응할 수도 있다. 예를 들어, 하나 이상의 메모리 로케이션들은 프로세싱 엘리먼트에 할당된 전용 메모리 공간에 대응할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 이 복수의 서브그룹들을 하나 이상의 배리어들과 동기화하도록 구성될 수도 있는 것은 프로세싱 유닛 (1) 이 복수의 서브그룹들의 각 서브그룹에 대응하는 하나 이상의 작업 항목들을 동기화하도록 구성되는 것을 포함할 수도 있다. 이러한 예들에서, 프로세싱 유닛 (1) 은, 2 개 이상의 서브그룹들의 2 개 이상의 작업-항목들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성됨으로써, 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있고, 여기서, 2 개 이상의 작업-항목들 중 적어도 2 개는 2 개 이상의 그룹들의 상이한 서브그룹들에 속한다.
일부 예들에서, 서브그룹 간 데이터 전송은 복수의 서브그룹들의 적어도 하나의 서브그룹의 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들의 하나 이상의 다른 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 로 데이터를 복사하는 것을 포함할 수도 있다. 이러한 예들에서, 복수의 서브그룹들의 적어도 하나의 서브그룹의 하나 이상의 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 및 복수의 서브그룹들의 하나 이상의 다른 서브그룹들의 하나 이상의 다른 작업-항목들과 연관된 하나 이상의 메모리 로케이션들 (예컨대, 하나 이상의 레지스터들) 은 범용 레지스터들을 포함할 수도 있다. 하나 이상의 메모리 로케이션들은 프로세싱 유닛의 계산 유닛의 프로세싱 엘리먼트에 할당된 메모리 공간에 대응할 수도 있다. 예를 들어, 하나 이상의 메모리 로케이션들은 프로세싱 엘리먼트에 할당된 전용 메모리 공간에 대응할 수도 있다.
상술된 바와 같이, 프로세싱 유닛 (1) 은 복수의 서브그룹들을 하나 이상의 배리어들로 동기화하도록 구성될 수도 있다. 하나 이상의 배리어들은 하나 이상의 서브그룹 배리어들을 포함할 수도 있다. 일부 예들에서, 하나 이상의 배리어들은 하나 이상의 명명된 배리어들 및/또는 하나 이상의 서브그룹 배리어들을 포함할 수도 있다. 일부 예들에서, 명명된 배리어는 서브그룹 배리어의 하나의 타입일 수도 있다. 프로세싱 유닛 (1) 은 복수의 서브그룹들을 하나 이상의 명명된 배리어들 및/또는 하나 이상의 서브그룹 배리어들로 동기화하도록 구성될 수도 있다. 일부 예들에서, 하나 이상의 명명된 배리어들 및/또는 하나 이상의 서브그룹 배리어들은 work_group_named_barrier (uint sub_group_count) 를 포함할 수도 있다. 이러한 예들에서, sub_group_count 는 동기화될 작업-그룹에서의 서브그룹들의 수를 나타낼 수도 있다. 다른 예로서, 하나 이상의 명명된 배리어들 및/또는 하나 이상의 서브그룹 배리어들은 OpenCL 컴퓨팅 플랫폼 명세 (예컨대, OpenCL C++ Specification, Version 1.0, Document Revision 22) 에 의해 정의된 바와 같이, cl_khr_sub_group_named_barrier 를 포함할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 서브그룹 간 데이터 전송 메커니즘을 이용하여 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함할 수도 있다. 소프트웨어 함수는 API 함수를 포함할 수도 있다. 일부 예들에서, 소프트웨어 함수는 하나 이상의 원자적 오퍼레이션들을 포함할 수도 있다. 다른 예들에서, 소프트웨어 함수는 오직 일 원자적 오퍼레이션 (예컨대, 단일의 원자적 오퍼레이션) 만을 포함할 수도 있다. 다른 예들에서, 소프트웨어 함수는 오직 복수의 원자적 오퍼레이션들만을 포함할 수도 있다.
일부 예들에서, 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송은 동시에 일어난다. 예를 들어, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 전송하는 것 및 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 정송하는 것은 동시에 일어날 수도 있다.
일부 예들에서, 서브그룹 간 데이터 전송 메커니즘에 대응하는 소프트웨어 함수 (예컨대, API 함수) 는 gentype copy(gentype variable, int subgroup_id, int named_barrier_id) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype subgroup_exchange(gentype var, int srcSubgroupId) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array ) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함할 수도 있다. 다른 예들에서, API 함수는 gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id) 를 포함할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 프로세싱 유닛의 임의의 메모리 제어기를 이용함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 프로세싱 유닛의 임의의 메모리 제어기에 메모리 요청을 전송함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 복수의 서브그룹들의 단일 서브그룹 내의 2 개 이상의 작업-항목들 사이에 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 복수의 서브그룹들의 각 서브그룹 내의 2 개 이상의 작업-항목들 사이에 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있고, 여기서, 서브그룹 내 데이터 전송은 상이한 서브그룹들에 속하는 작업-항목들 사이에 데이터를 전송하지 않는다.
프로세싱 유닛 (1) 은 서브그룹 내 데이터 전송 메커니즘을 이용하여 서브그룹 내 데이터 전송을 수행하도록 구성될 수도 있다. 서브그룹 내 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함할 수도 있다. 소프트웨어 함수는 API 함수를 포함할 수도 있다. 일부 예들에서, API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함할 수도 있다.
도 9 는 본 개시의 일 예시적인 방법을 나타내는 플로우차트이다. 도 9 의 방법은 하나 이상의 프로세싱 유닛들 (1) (예컨대, 하나 이상의 CPU 들, 하나 이상의 GPU 들, 하나 이상의 병렬 프로세싱 유닛들 (예컨대, 병렬적 프로세싱을 수행하도록 구성된 임의의 프로세싱 유닛), 하나 이상의 SoC 들, 또는 이들의 임의의 조합들) 에 의해 수행될 수도 있다. 도 9 는 이 개시물의 하나 이상의 기법들과 일치하는 하나의 예시적인 방법을 나타낸다.
프로세싱 유닛 (1) 은 제 1 작업-항목을 실행하도록 구성될 수도 있다 (902). 제 1 작업-항목은 제 1 서브그룹에 대응할 수도 있다. 프로세싱 유닛 (1) 은 제 2 작업-항목을 실행하도록 구성될 수도 있다 (904). 제 2 작업-항목은 제 2 서브그룹에 대응할 수도 있다. 프로세싱 유닛 (1) 은 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하도록 구성될 수도 있다 (906). 프로세싱 유닛 (1) 은 일단 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 1 배리어에 의해 동기화되면, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다 (908). 프로세싱 유닛 (1) 은 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하도록 구성될 수도 있다 (910). 예를 들어, 프로세싱 유닛 (1) 은, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 제 1 서브그룹의 각각의 작업-항목 및 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 2 배리어를 실행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은 하나 이상의 계산 유닛들을 포함할 수도 있다. 하나 이상의 계산 유닛들의 각각은 작업-항목들을 실행하기 위한 하나 이상의 프로세싱 엘리먼트들을 포함할 수도 있다. 프로세싱 유닛 (1) 은 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 (예컨대, 하나 이상의 내부 메모리들 (6) 의 일부로서의) 로컬 메모리를 포함할 수도 있다. 프로세싱 유닛 (1) 은 하나 이상의 프로세싱 엘리먼트들의 각각에 의해 액세스가능한 (예컨대, 하나 이상의 내부 메모리들 (6) 의 일부로서의) 전용 메모리를 포함할 수도 있다. 일부 예들에서, 프로세싱 유닛 (1) 은 로컬 메모리 또는 글로벌 메모리를 이용함이 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있고, 및/또는, 프로세싱 유닛 (1) 은 전용 메모리를 이용하여 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 제 1 서브그룹과 연관된 제 1 메모리 로케이션으로부터 제 2 서브그룹과 연관된 제 2 메모리 로케이션으로의 데이터 복사; 또는 제 2 서브그룹과 연관된 제 2 메모리 로케이션으로부터 제 1 서브그룹과 연관된 제 1 메모리 로케이션으로의 데이터 복사 중 적어도 하나를 수행하도록 구성됨으로써, 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 제 1 메모리 로케이션은 제 1 하드웨어 레지스터일 수도 있고, 제 2 메모리 로케이션은 제 2 하드웨어 레지스터일 수도 있다. 제 1 하드웨어 레지스터는 제 1 작업-항목과 연관될 수도 있고, 제 2 하드웨어 레지스터는 제 2 작업-항목과 연관될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로부터 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로의 데이터의 복사; 또는, 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로부터 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로의 데이터의 복사 중 적어도 하나를 수행하도록 구성됨으로써, 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 서브그룹 간 데이터 전송 메커니즘을 이용하도록 구성됨으로써, 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함할 수도 있다. 소프트웨어 함수는 애플리케이션 프로그래밍 인터페이스 (API) 함수일 수도 있다. 애플리케이션 프로그래밍 인터페이스 (API) 함수는, gentype copy(gentype variable, int subgroup_id, int named_barrier_id); gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id); gentype subgroup_exchange(gentype var, int srcSubgroupId); gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array ); gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt); 또는 gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id) 중 적어도 하나를 포함할 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 프로세싱 유닛의 또는 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기의 이용 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다. 유사하게, 프로세싱 유닛 (1) 은, 프로세싱 유닛의 또는 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기에의 메모리 요청의 전송 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
일부 예들에서, 프로세싱 유닛 (1) 은, 제 1 서브그룹의 제 2 작업-항목과 제 1 서브그룹의 제 3 작업-항목 사이의, 또는 제 2 서브그룹의 제 2 작업-항목과 제 2 서브그룹의 제 3 작업-항목 사이의 서브그룹 간 데이터 전송을 수행하도록 구성될 수도 있다.
프로세싱 유닛 (1) 은 이 개시물에서 기술된 하나 이상의 기법들을 수행하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛 (1) 은 이 개시물에서 기술된 임의의 기법 또는 기법들을 수행하도록 구성될 수도 있다.
다음의 넘버링된 예들은 본 개시의 하나 이상의 양태들을 예시할 수도 있다:
예 1. 프로세싱 유닛에 의해, 제 1 서브그룹에 대응하는 작업-항목들 및 제 2 서브그룹에 대응하는 작업-항목들을 배리어로 동기화하는 단계; 및 프로세싱 유닛에 의해, 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계를 포함하는, 방법.
예 2. 프로세싱 유닛은 하나 이상의 계산 유닛들을 포함하고, 하나 이상의 계산 유닛들의 각각은 하나 이상의 프로세싱 엘리먼트들을 포함하며, 프로세싱 유닛은 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리를 포함하는, 예 1 의 방법.
예 3. 로컬 메모리를 이용함이 없이 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예 2 의 방법.
예 4. 서브그룹 간 데이터 전송은 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것 또는 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함하는, 예 1 의 방법.
예 5. 서브그룹 간 데이터 전송은, 제 1 서브그룹과 연관된 제 1 레지스터로부터 제 2 서브그룹과 연관된 제 2 레지스터로 데이터를 복사하는 것 또는 제 2 서브그룹과 연관된 제 2 레지스터로부터 제 1 서브그룹과 연관된 제 1 레지스터로 데이터를 복사하는 것을 포함하는, 예 1 의 방법.
예 6. 제 1 레지스터는 범용 레지스터이고 제 2 레지스터는 범용 레지스터인, 예 5 의 방법.
예 7. 서브그룹 간 데이터 전송은, 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들로부터 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들로 데이터를 복사하는 것 또는 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들로부터 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들로 데이터를 복사하는 것을 포함하는, 예 1 의 방법.
예 8. 서브그룹 간 데이터 전송은, 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로부터 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로 데이터를 복사하는 것 또는 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로부터 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로 데이터를 복사하는 것을 포함하는, 예 1 의 방법.
예 9. 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들 및 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들은 범용 레지스터들인, 예 8 의 방법.
예 10. 제 1 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응하고, 제 2 서브그룹에 대응하는 작업-항목들은 제 2 작업-그룹에 대응하는, 예들 1, 7, 8, 또는 9 의 임의의 조합의 방법.
예 11. 제 1 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응하고, 제 2 서브그룹에 대응하는 작업-항목들은 제 1 작업-그룹에 대응하는, 예들 1, 7, 8, 또는 9 의 임의의 조합의 방법.
예 12. 배리어는 명명된 배리어 (named barrier) 인, 예 1 의 방법.
예 13. 명명된 배리어는, work_group_named_barrier (uint sub_group_count) 또는 cl_khr_sub_group_named_barrier 를 포함하는, 예 12 의 방법.
예 14. sub_group_count 는, 동기화될 작업-그룹에서의 서브그룹들의 수를 나타내고, 제 1 서브그룹 및 제 2 서브그룹은 작업 작업-그룹에 속하는, 예 13 의 방법.
예 15. 배리어는 서브그룹 배리어인, 예 1 의 방법.
예 16. 서브그룹 배리어는, work_group_named_barrier (uint sub_group_count) 또는 cl_khr_sub_group_named_barrier 를 포함하는, 예 15 의 방법.
예 17. sub_group_count 는 동기화될 작업-그룹에서의 서브그룹들의 수를 나타내고, 제 1 서브그룹 및 제 2 서브그룹은 작업 작업-그룹에 속하는, 예 16 의 방법.
예 18. 서브그룹 간 데이터 전송 메커니즘을 이용하여 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예들 1-17 의 임의의 조합의 방법.
예 19. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하는, 예 18 의 방법.
예 20. 소프트웨어 함수는 API 함수인, 예 19 의 방법.
예 21. API 함수는 gentype copy(gentype variable, int subgroup_id, int named_barrier_id) 를 포함하는, 예 20 의 방법.
예 22. API 함수는 gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id) 를 포함하는, 예 20 의 방법.
예 23. API 함수는 gentype subgroup_exchange(gentype var, int srcSubgroupId) 를 포함하는, 예 20 의 방법.
예 24. API 함수는 gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array ) 를 포함하는, 예 20 의 방법.
예 25. API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함하는, 예 20 의 방법.
예 26. API 함수는 gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id) 를 포함하는, 예 20 의 방법.
예 27. 프로세싱 유닛은 CPU 또는 GPU 인, 예 1 의 방법.
예 28. 프로세싱 유닛은, 단일 명령 다중 데이터 (SIMD) 프로세서, 다중 명령 다중 데이터 (MIMD) 프로세서, 단일 프로그램 다중 데이터 (SPMD) 프로세서, 또는 다중 프로그램 다중 데이터 (MPMD) 프로세서인, 예 1 의 방법.
예 29. 프로세싱 유닛의 임의의 메모리 제어기를 이용함이 없이 제 1 서브그룹과 제 2 서브그룹 사이에 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예 1 의 방법.
예 30. 프로세싱 유닛의 임의의 메모리 제어기에 메모리 요청을 전송함이 없이 제 1 서브그룹과 제 2 서브그룹 사이에 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예 1 의 방법.
예 31. 프로세싱 유닛에 의해, 제 1 서브그룹의 제 1 작업-항목과 제 1 서브그룹의 제 2 작업-항목 사이에, 또는 제 2 서브그룹의 제 1 작업-항목과 제 2 서브그룹의 제 2 작업-항목 사이에 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하는, 예 1 의 방법.
예 32. 서브그룹 내 데이터 전송 메커니즘을 이용하여 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하는, 예 31 의 방법.
예 33. 서브그룹 내 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하는, 예 32 의 방법.
예 34. 소프트웨어 함수는 API 함수인, 예 33 의 방법.
예 35. API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함하는, 예 34 의 방법.
예 36. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 하나 이상의 원자적 오퍼레이션들을 포함하는, 예 18 의 방법.
예 37. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 오직 일 원자적 오퍼레이션을 포함하는, 예 18 의 방법.
예 38. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 오직 복수의 원자적 오퍼레이션들을 포함하는, 예 18 의 방법.
예 39. 제 1 서브그룹과 제 2 서브그룹 사이의 서브그룹 간 데이터 전송은 동시에 일어나는, 예들 1-38 의 임의의 조합의 방법.
예 40. 프로세싱 유닛에 의해, 복수의 서브그룹들을 하나 이상의 배리어들로 동기화하는 단계; 및, 프로세싱 유닛에 의해, 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이에 서브그룹 간 데이터 전송을 수행하는 단계를 포함하는, 방법.
예 41. 복수의 서브그룹들은 단일 작업-그룹에 속하는, 예 40 의 방법.
예 42. 프로세싱 유닛은 하나 이상의 계산 유닛들을 포함하고, 하나 이상의 계산 유닛들의 각각은 하나 이상의 프로세싱 엘리먼트들을 포함하며, 프로세싱 유닛은 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리를 포함하는, 예 40 의 방법.
예 43. 로컬 메모리를 이용함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이에 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예 42 의 방법.
예 44. 서브그룹 간 데이터 전송은 복수의 서브그룹들의 적어도 하나의 서브그룹으로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들로 데이터를 복사하는 것을 포함하는, 예 40 의 방법.
예 45. 서브그룹 간 데이터 전송은 xor 패턴에 따라 복수의 서브그룹들의 적어도 하나의 서브그룹으로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들로 데이터를 복사하는 것을 포함하는, 예 40 의 방법.
예 46. 서브그룹 간 데이터 전송은 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 또는 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것 중 적어도 하나를 포함하는, 예 44 또는 45 의 방법.
예 47. 서브그룹 간 데이터 전송은, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 1 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 또는 제 3 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것 중 적어도 하나를 포함하는, 예 44 또는 45 의 방법.
예 48. xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 및, 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함하는, 예 45 의 방법.
예 49. 서브그룹 간 데이터 전송은, 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 1 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 제 1 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것; 제 4 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 제 4 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 또는, 제 4 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것 중 적어도 하나를 포함하는, 예 44 또는 45 의 방법.
예 50. xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것; 및, 제 4 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것을 포함하는, 예 45 의 방법.
예 51. xor 패턴에 따른 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터 제 2 서브그룹으로 데이터를 복사하는 것; 제 2 서브그룹으로부터 제 3 서브그룹으로 데이터를 복사하는 것; 제 3 서브그룹으로부터 제 4 서브그룹으로 데이터를 복사하는 것; 및 제 4 서브그룹으로부터 제 1 서브그룹으로 데이터를 복사하는 것을 포함하는, 예 45 의 방법.
예 52. 복수의 서브그룹들의 적어도 하나의 서브그룹과 복수의 서브그룹들의 하나 이상의 다른 서브그룹들 사이의 서브그룹 간 데이터 전송은 동시에 일어나는, 예 44 또는 45 의 방법.
예 53. 복수의 서브그룹들은 2 개, 3 개, 4 개, 5 개, 6 개, 7 개, 8 개, 또는 더 많은 서브그룹들을 포함하고, 여기서, 서브그룹 간 데이터 전송은: 제 1 서브그룹으로부터, 복수의 서브그룹들의 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 2 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 3 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 4 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 5 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 6 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 7 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 8 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 또는 제 8 서브그룹으로부터, 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 7 서브그룹 중 적어도 하나로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 중 적어도 하나를 포함하는, 예 40 의 방법.
예 54. 복수의 서브그룹들은 2 개, 3 개, 4 개, 5 개, 6 개, 7 개, 8 개, 또는 더 많은 서브그룹들을 포함하고, 여기서, 서브그룹 간 데이터 전송은: 제 1 서브그룹과 연관된 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 2 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 3 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 4 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 5 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 6 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 6 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 7 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 제 7 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 8 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 또는, 제 8 서브그룹과 연관된 하나 이상의 하나 이상의 레지스터들로부터 복수의 서브그룹들의 제 1 서브그룹, 제 2 서브그룹, 제 3 서브그룹, 제 4 서브그룹, 제 5 서브그룹, 제 6 서브그룹, 또는 제 7 서브그룹과 연관된 적어도 하나의 레지스터로 데이터를 복사하는 것, 여기서, 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹들의 각각은, 복수의 서브그룹들이, 복수의 서브그룹들에서 제 1, 제 2, 제 3, 제 4, 제 5, 제 6, 제 7, 및 제 8 서브그룹이 존재하도록 필요한 수의 서브그룹들을 포함하는 경우에 오직 이용가능함; 중 적어도 하나를 포함하는, 예 40 의 방법.
예 55. 하나 이상의 배리어들은 하나 이상의 명명된 배리어들을 포함하는, 예 40 의 방법.
예 56. 하나 이상의 명명된 배리어들은 work_group_named_barrier (uint sub_group_count) 또는 cl_khr_sub_group_named_barrier 를 포함하는, 예 55 의 방법.
예 57. sub_group_count 는 동기화될 작업-그룹에서의 서브그룹들의 수를 나타내는, 예 56 의 방법.
예 58. 하나 이상의 배리어들은 하나 이상의 서브그룹 배리어들을 포함하는, 예 40 의 방법.
예 59. 하나 이상의 서브그룹 배리어들은 work_group_named_barrier (uint sub_group_count) 또는 cl_khr_sub_group_named_barrier 를 포함하는, 예 58 의 방법.
예 60. sub_group_count 는 동기화될 작업-그룹에서의 서브그룹들의 수를 나타내는, 예 59 의 방법.
예 61. 서브그룹 간 데이터 전송 메커니즘을 이용하여 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예들 40-60 의 임의의 조합의 방법.
예 62. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하는, 예 61 의 방법.
예 63. 소프트웨어 함수는 API 함수인, 예 62 의 방법.
예 64. API 함수는 gentype copy(gentype variable, int subgroup_id, int named_barrier_id) 를 포함하는, 예 63 의 방법.
예 65. API 함수는 gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id) 를 포함하는, 예 63 의 방법.
예 66. API 함수는 gentype subgroup_exchange(gentype var, int srcSubgroupId) 를 포함하는, 예 63 의 방법.
예 67. API 함수는 gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array ) 를 포함하는, 예 63 의 방법.
예 68. API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함하는, 예 63 의 방법.
예 69. API 함수는 gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id) 를 포함하는, 예 63 의 방법.
예 70. 프로세싱 유닛은 CPU 또는 GPU 인, 예 40 의 방법.
예 71. 프로세싱 유닛은, 단일 명령 다중 데이터 (SIMD) 프로세서, 다중 명령 다중 데이터 (MIMD) 프로세서, 단일 프로그램 다중 데이터 (SPMD) 프로세서, 또는 다중 프로그램 다중 데이터 (MPMD) 프로세서인, 예 40 의 방법.
예 72. 프로세싱 유닛의 임의의 메모리 제어기를 이용함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하는 단계; 또는, 프로세싱 유닛의 임의의 메모리 제어기에 메모리 요청을 전송함이 없이 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 예 40 의 방법.
예 73. 프로세싱 유닛에 의해, 복수의 서브그룹들의 단일 서브그룹 내의 2 개 이상의 작업-항목들 사이에 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하는, 예 40 의 방법.
예 74. 프로세싱 유닛에 의해, 복수의 서브그룹들의 각 서브그룹 내의 2 개 이상의 작업-항목들 사이에 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하고, 서브그룹 내 데이터 전송은 상이한 서브그룹들에 속하는 작업-항목들 사이에 데이터를 전송하지 않는, 예 40 의 방법.
예 75. 서브그룹 내 데이터 전송 메커니즘을 이용하여 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하는, 예 73 또는 74 의 방법.
예 76. 서브그룹 내 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하는, 예 75 의 방법.
예 77. 소프트웨어 함수는 API 함수인, 예 76 의 방법.
예 78. API 함수는 gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt) 를 포함하는, 예 77 의 방법.
예 79. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 하나 이상의 원자적 오퍼레이션들을 포함하는, 예 61 의 방법.
예 80. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 오직 일 원자적 오퍼레이션을 포함하는, 예 61 의 방법.
예 81. 서브그룹 간 데이터 전송 메커니즘은 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하고, 소프트웨어 함수는 오직 복수의 원자적 오퍼레이션들을 포함하는, 예 61 의 방법.
예 82. 복수의 서브그룹들은 2 개의 서브그룹들, 3 개의 서브그룹들, 4 개의 서브그룹들, 5 개의 서브그룹들, 6 개의 서브그룹들, 7 개의 서브그룹들, 또는 8 개의 서브그룹들을 포함하는, 예들 40-81 의 임의의 조합의 방법.
예 83. 서브그룹 간 데이터 전송은 복수의 서브그룹들의 2 개 이상의 서브그룹들과 연관된 하나 이상의 레지스터들로부터 복수의 서브그룹들의 2 개 이상의 서브그룹들과 연관된 하나 이상의 다른 레지스터들로 데이터를 복사하는 것을 포함하는, 예들 40-82 의 임의의 조합의 방법.
예 84. 2 개 이상의 서브그룹들과 연관된 하나 이상의 레지스터들 및 2 개 이상의 서브그룹들과 연관된 하나 이상의 다른 레지스터들은 범용 레지스터들을 포함하는, 예 83 의 방법.
예 85. 복수의 서브그룹들을 하나 이상의 배리어들로 동기화하는 것은, 복수의 서브그룹들의 각 서브그룹에 대응하는 하나 이상의 작업-항목들을 동기화하는 것을 포함하는, 예들 40-84 의 임의의 조합의 방법.
예 86. 복수의 서브그룹들의 2 개 이상의 서브그룹들 사이에 서브그룹 간 데이터 전송을 수행하는 것은, 2 개 이상의 서브그룹들의 2 개 이상의 작업-항목들 사이에 서브그룹 간 데이터 전송을 수행하는 것을 포함하고, 2 개 이상의 작업-항목들의 적어도 2 개는 2 개 이상의 그룹들의 상이한 서브그룹들에 속하는, 예 85 의 방법.
예 87. 서브그룹 간 데이터 전송은, 복수의 서브그룹들의 적어도 하나의 서브그룹의 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로부터 복수의 서브그룹들의 하나 이상의 다른 서브그룹들의 하나 이상의 다른 작업-항목들과 연관된 하나 이상의 레지스터들로 데이터를 복사하는 것을 포함하는, 예 85 또는 86 의 방법.
예 88. 복수의 서브그룹들의 적어도 하나의 서브그룹의 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들 및 복수의 서브그룹들의 하나 이상의 다른 서브그룹들의 하나 이상의 다른 작업-항목들과 연관된 하나 이상의 레지스터들은 범용 레지스터들을 포함하는, 예 87 의 방법.
예 89. 복수의 서브그룹들의 하나 이상의 서브그룹들 사이의 서브그룹 간 데이터 전송은 동시에 일어나는, 예들 40-88 의 임의의 조합의 방법.
예 90. 2 개 이상의 작업-항목들 사이의 서브그룹 간 데이터 전송은 동시에 일어나는, 예들 40-88 의 임의의 조합의 방법.
예 91. 예들 1-39 의 임의의 조합을 포함하는 방법.
예 92. 예들 40-90 의 임의의 조합을 포함하는 방법.
예 93. 예들 1-90 의 임의의 조합을 포함하는 방법.
예 94. 이 개시물에서 기술된 하나 이상의 기법들을 포함하는 방법.
예 95. 이 개시물에서 기술된 임의의 디바이스.
예 96. 메모리; 및, 이 개시물에서 기술된 하나 이상의 기법들을 수행하도록 구성된 하나 이상의 프로세싱 유닛들을 포함하는 디바이스.
예 97. 메모리; 및, 예들 1-39 및 94 의 조합의 방법을 수행하도록 구성된 하나 이상의 프로세싱 유닛들을 포함하는 디바이스.
예 98. 메모리; 및, 예들 40-90 및 94 의 조합의 방법을 수행하도록 구성된 하나 이상의 프로세싱 유닛들을 포함하는 디바이스.
예 99. 메모리; 및, 예들 1-94 의 조합의 방법을 수행하도록 구성된 하나 이상의 프로세싱 유닛들을 포함하는 디바이스.
예 100. 예들 1-39 및 94 의 임의의 조합의 방법을 수행하기 위한 하나 이상의 수단들을 포함하는 장치.
예 101. 예들 40-90 및 94 의 임의의 조합의 방법을 수행하기 위한 하나 이상의 수단들을 포함하는 장치.
예 102. 예들 1-94 의 임의의 조합의 방법을 수행하기 위한 하나 이상의 수단들을 포함하는 장치.
예 103. 이 개시물에서 기술된 하나 이상의 기법들을 수행하기 위한 하나 이상의 수단들을 포함하는 장치.
예 104. 상기 하나 이상의 수단들은 하나 이상의 프로세싱 유닛들을 포함하는, 예 100, 101, 102, 또는 103 의 장치.
예 105. 상기 하나 이상의 프로세싱 유닛들은 하나 이상의 CPU 들 또는 하나 이상의 GPU 들 중 적어도 일방을 포함하는, 예 104 의 장치.
예 106. 상기 하나 이상의 프로세싱 유닛들은 단일 명령 다중 데이터 (SIMD) 프로세서, 다중 명령 다중 데이터 (MIMD) 프로세서, 단일 프로그램 다중 데이터 (SPMD) 프로세서, 또는 다중 프로그램 다중 데이터 (MPMD) 프로세서 중 적어도 하나를 포함하는, 예 104 의 장치.
예 107. 실행될 때 하나 이상의 프로세싱 유닛들로 하여금 예들 1-39 및 94 의 임의의 조합의 방법을 수행하게 하는 명령들을 저장한 컴퓨터-판독가능 저장 매체.
예 108. 실행될 때 하나 이상의 프로세싱 유닛들로 하여금 예들 40-90 및 94 의 임의의 조합의 방법을 수행하게 하는 명령들을 저장한 컴퓨터-판독가능 저장 매체.
예 109. 실행될 때 하나 이상의 프로세싱 유닛들로 하여금 예들 1-94 의 임의의 조합의 방법을 수행하게 하는 명령들을 저장한 컴퓨터-판독가능 저장 매체.
예 110. 실행될 때 하나 이상의 프로세싱 유닛들로 하여금 이 개시물에서 기술된 하나 이상의 기법들을 수행하게 하는 명령들을 저장한 컴퓨터-판독가능 저장 매체.
예 111. 이 개시물에서 기술된 임의의 프로세싱 유닛.
이 개시물에 따르면, 용어 "또는 (or)" 은 문맥상 달리 지시하지 않는 경우에 "및/또는 (and/or)" 으로 해석될 수도 있다. 추가적으로, "하나 이상의 (one or more)" 또는 "적어도 하나 (at least one)" 등과 같은 문구들은 본원에 개시된 일부 피처들에 대해 사용되었고 다른 것들에는 사용되지 않았을 수도 있지만; 이러한 언어가 사용되지 않은 피처들은 문맥상 달리 지시하지 않는 경우에 이러한 암시되는 의미를 가지는 것으로 해석될 수도 있다.
본 기법들의 다양한 양태들의 특정 조합들이 상기 설명되었지만, 이들 조합들은 단지 이 개시물에서 기술된 기법들의 예들을 나타내기 위해 제공된다. 이에 따라, 이 개시물의 기법들은 이들 예시적인 조합에 제한되어서는 아니되고, 이 개시물에 기술된 기법들의 다양한 양태들의 임의의 생각할 수 있는 조합을 포함할 수도 있다.
이 개시물에 기술된 기법들은, 적어도 부분적으로, 하드웨어, 소프트웨어, 펌웨어 또는 이들의 임의의 조합으로 구현될 수도 있다. 예를 들어, 기술된 기법들의 다양한 양태들은 하나 이상의 마이크로프로세서들, 디지털 신호 프로세서 (DSP) 들, 애플리케이션 특정적 집적 회로 (ASIC) 들, 필드 프로그래머블 게이트 어레이 (FPGA) 들, 또는 임의의 다른 등가의 집적 또는 이산 로직 회로, 및 이러한 컴포넌트들의 임의의 조합들을 포함하는 하나 이상의 프로세서들 내에서 구현될 수도 있다. 용어 "프로세서 (processor)" 또는 "프로세싱 회로 (processing circuitry)" 는 일반적으로, 다른 로직 회로와 조합하여 또는 단독으로, 전술한 로직 회로의 임의의 것, 또는 프로세싱을 수행하는 별개의 하드웨어와 같은 임의의 다른 등가 회로를 지칭할 수도 있다.
이러한 하드웨어, 소프트웨어, 및 펌웨어는 이 개시물에서 기술된 다양한 동작들 및 기능들을 지원하기 위해 동일 디바이스 내에 또는 별개의 디바이스 내에 구현될 수도 있다. 또한, 기술된 유닛들, 모듈들 또는 컴포넌트들의 임의의 것은 별개의 하지만 연동가능한 로직 디바이스들로서 함께 또는 별도로 구현될 수도 있다. 모듈들 또는 유닛들로서의 상이한 피처들의 묘사는, 상이한 기능적 양태들을 강조하도록 의도된 것이고, 이러한 모듈들 또는 유닛들이 별개의 하드웨어 또는 소프트웨어 컴포넌트들에 의해 실행되어야만 하는 것을 반드시 의미하는 것은 아니다. 그보다는, 하나 이상의 모듈들 또는 유닛들과 연관된 기능성은 별개의 하드웨어, 펌웨어, 및/또는 소프트웨어 컴포넌트들에 의해 수행되거나 공통의 또는 별개의 하드웨어 또는 소프트웨어 컴포넌트들 내에 집적될 수도 있다.
이 개시물에서 기술된 기법들은 또한, 명령들을 저장하는 컴퓨터-판독가능 저장 매체와 같은 컴퓨터-판독가능 매체에서 저장, 수록 또는 인코딩될 수도 있다. 컴퓨터-판독가능 매체에서 임베딩된 또는 인코딩된 명령들은, 예컨대, 그 명령들이 하나 이상의 프로세서들에 의해 실행될 때, 하나 이상의 프로세서들로 하여금 본원에 기술된 기법들을 수행하게 할 수도 있다. 컴퓨터 판독가능 저장 매체들은 랜덤 액세스 메모리 (RAM), 판독 전용 메모리 (ROM), 프로그래머블 판독 전용 메모리 (PROM), 소거가능 프로그래머블 판독 전용 메모리 (EPROM), 전기적으로 소거가능 프로그래머블 판독 전용 메모리 (EEPROM), 플래시 메모리, 하드 디스크, CD-ROM, 플로피 디스크, 카셋트, 자기적 매체들, 광학적 매체들, 또는 유형인 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
컴퓨터 판독가능 매체들은 상기 열거된 것들과 같은 유형의 저장 매체에 대응하는 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 컴퓨터 판독가능 매체들은 또한, 예컨대, 통신 프로토콜에 따라, 컴퓨터 프로그램의 한 장소로부터 다른 장소로의 전송을 용이하게 하는 임의의 매체를 포함하는 통신 매체들을 포함할 수도 있다. 이러한 방식으로, "컴퓨터 판독가능 매체들 (computer-readable media)" 이라는 문구는 일반적으로, (1) 비-일시적인 유형의 컴퓨터-판독가능 저장 매체들, 및 (2) 일시적인 신호 또는 반송파와 같은 비-유형의 컴퓨터-판독가능 통신 매체에 대응할 수도 있다.
다양한 양태들 및 예들이 설명되었다. 하지만, 다음의 청구항들의 범위로부터 벗어남이 없이 이 개시물의 구조 또는 기법들에 대해 변형들이 이루어질 수 있다.
Claims (30)
- 프로세싱 유닛에 의해, 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하는 단계;
상기 프로세싱 유닛에 의해, 제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하는 단계;
상기 프로세싱 유닛에 의해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하는 단계;
상기 프로세싱 유닛에 의해, 일단 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 상기 제 1 배리어에 의해 동기화되면, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계; 및
상기 프로세싱 유닛에 의해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 상기 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 상기 제 2 배리어를 실행하는 단계를 포함하는, 방법. - 제 1 항에 있어서,
상기 프로세싱 유닛은 하나 이상의 계산 유닛들을 포함하고, 상기 하나 이상의 계산 유닛들의 각각은 작업-항목들을 실행하기 위한 하나 이상의 프로세싱 엘리먼트들을 포함하며, 상기 프로세싱 유닛은 상기 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리를 포함하고, 상기 프로세싱 유닛은 상기 하나 이상의 프로세싱 엘리먼트들의 각각에 의해 액세스가능한 전용 메모리를 포함하는, 방법. - 제 2 항에 있어서,
상기 로컬 메모리 또는 글로벌 메모리의 이용 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계; 또는
상기 전용 메모리를 이용하여 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계
중 적어도 하나를 더 포함하는, 방법. - 제 1 항에 있어서,
상기 서브그룹 간 데이터 전송을 수행하는 단계는,
상기 제 1 서브그룹과 연관된 제 1 메모리 로케이션으로부터 상기 제 2 서브그룹과 연관된 제 2 메모리 로케이션으로 데이터를 복사하는 단계; 또는
상기 제 2 서브그룹과 연관된 상기 제 2 메모리 로케이션으로부터 상기 제 1 서브그룹과 연관된 상기 제 1 메모리 로케이션으로 데이터를 복사하는 단계
중 적어도 하나를 포함하는, 방법. - 제 4 항에 있어서,
상기 제 1 메모리 로케이션은 제 1 하드웨어 레지스터이고, 상기 제 2 메모리 로케이션은 제 2 하드웨어 레지스터인, 방법. - 제 5 항에 있어서,
상기 제 1 하드웨어 레지스터는 상기 제 1 작업-항목과 연관되고, 상기 제 2 하드웨어 레지스터는 상기 제 2 작업-항목과 연관되는, 방법. - 제 1 항에 있어서,
상기 서브그룹 간 데이터 전송을 수행하는 단계는,
상기 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로부터 상기 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 하드웨어 레지스터들로 데이터를 복사하는 단계; 또는
상기 제 2 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 하드웨어 레지스터들로부터 상기 제 1 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 하드웨어 레지스터들로 데이터를 복사하는 단계
중 적어도 하나를 포함하는, 방법. - 제 1 항에 있어서,
서브그룹 간 데이터 전송 메커니즘을 이용하여 상기 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하고, 상기 서브그룹 간 데이터 전송 메커니즘은 상기 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하며, 상기 소프트웨어 함수는 애플리케이션 프로그래밍 인터페이스 (API) 함수이고,
상기 애플리케이션 프로그래밍 인터페이스 (API) 함수는,
gentype copy(gentype variable, int subgroup_id, int named_barrier_id);
gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id);
gentype subgroup_exchange(gentype var, int srcSubgroupId);
gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array );
gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt); 또는
gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id)
중 적어도 하나를 포함하는, 방법. - 제 1 항에 있어서,
상기 프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기의 이용 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 방법. - 제 1 항에 있어서,
상기 프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기에의 메모리 요청의 전송 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 단계를 더 포함하는, 방법. - 제 1 항에 있어서,
상기 프로세싱 유닛에 의해, 상기 제 1 서브그룹의 제 2 작업-항목과 상기 제 1 서브그룹의 제 3 작업-항목 사이의, 또는 상기 제 2 서브그룹의 제 2 작업-항목과 상기 제 2 서브그룹의 제 3 작업-항목 사이의 서브그룹 내 데이터 전송을 수행하는 단계를 더 포함하는, 방법. - 디바이스로서,
상기 디바이스는 프로세싱 유닛을 구비하고,
상기 프로세싱 유닛은,
하나 이상의 계산 유닛들로서, 상기 하나 이상의 계산 유닛들의 각각은 하나 이상의 작업-항목들을 실행하기 위한 하나 이상의 프로세싱 엘리먼트들을 포함하는, 상기 하나 이상의 계산 유닛들;
상기 하나 이상의 계산 유닛들의 각각에 의해 액세스가능한 로컬 메모리; 및
상기 하나 이상의 프로세싱 엘리먼트들의 각각에 의해 액세스가능한 전용 메모리를 포함하고,
상기 프로세싱 유닛은,
제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하고;
제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하며;
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하고;
일단 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 상기 제 1 배리어에 의해 동기화되면, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하며; 그리고
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 상기 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 상기 제 2 배리어를 실행하도록
구성되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은,
상기 프로세싱 유닛에 의해 액세스가능한 글로벌 메모리 또는 상기 로컬 메모리의 이용 없는, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송; 또는
상기 전용 메모리를 이용한, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송
중 적어도 하나를 수행하도록 구성되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은,
상기 제 1 서브그룹과 연관된 제 1 메모리 로케이션으로부터 상기 제 2 서브그룹과 연관된 제 2 메모리 로케이션으로 데이터를 복사하는 것; 또는
상기 제 2 서브그룹과 연관된 상기 제 2 메모리 로케이션으로부터 상기 제 1 서브그룹과 연관된 상기 제 1 메모리 로케이션으로 데이터를 복사하는 것
중 적어도 하나를 수행하도록 구성됨으로써, 상기 서브그룹 간 데이터 전송을 수행하도록 구성되는, 디바이스. - 제 14 항에 있어서,
상기 제 1 메모리 로케이션은 제 1 하드웨어 레지스터이고, 상기 제 2 메모리 로케이션은 제 2 하드웨어 레지스터인, 디바이스. - 제 15 항에 있어서,
상기 제 1 하드웨어 레지스터는 상기 제 1 작업-항목과 연관되고, 상기 제 2 하드웨어 레지스터는 상기 제 2 작업-항목과 연관되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은,
상기 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로부터 상기 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로 데이터를 복사하는 것; 또는
상기 제 2 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 레지스터들로부터 상기 제 1 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 레지스터들로 데이터를 복사하는 것
중 적어도 하나를 수행하도록 구성됨으로써, 상기 서브그룹 간 데이터 전송을 수행하도록 구성되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은, 서브그룹 간 데이터 전송 메커니즘을 이용하도록 구성됨으로써 상기 서브그룹 간 데이터 전송을 수행하도록 구성되고, 상기 서브그룹 간 데이터 전송 메커니즘은 상기 프로세싱 유닛에 의해 실행가능한 소프트웨어 함수를 포함하며, 상기 소프트웨어 함수는 애플리케이션 프로그래밍 인터페이스 (API) 함수이고,
상기 API 함수는,
gentype copy(gentype variable, int subgroup_id, int named_barrier_id);
gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id);
gentype subgroup_exchange(gentype var, int srcSubgroupId);
gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array );
gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt); 또는
gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id)
중 적어도 하나를 포함하는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은,
상기 프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기의 이용 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은,
상기 프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기에의 메모리 요청의 전송 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하도록 구성되는, 디바이스. - 제 12 항에 있어서,
상기 프로세싱 유닛은, 상기 제 1 서브그룹의 제 1 작업-항목과 상기 제 1 서브그룹의 제 2 작업-항목 사이의, 또는 상기 제 2 서브그룹의 제 1 작업-항목과 상기 제 2 서브그룹의 제 2 작업-항목 사이의 서브그룹 내 데이터 전송을 수행하도록 구성되는, 디바이스. - 제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하는 수단;
제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하는 수단;
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하는 수단;
일단 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 상기 제 1 배리어에 의해 동기화되면, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 수단; 및
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 상기 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 상기 제 2 배리어를 실행하는 수단을 포함하는, 장치. - 제 22 항에 있어서,
상기 서브그룹 간 데이터 전송을 수행하는 수단은,
상기 제 1 서브그룹과 연관된 제 1 메모리 로케이션으로부터 상기 제 2 서브그룹과 연관된 제 2 메모리 로케이션으로 데이터를 복사하는 수단; 또는
상기 제 2 서브그룹과 연관된 상기 제 2 메모리 로케이션으로부터 상기 제 1 서브그룹과 연관된 상기 제 1 메모리 로케이션으로 데이터를 복사하는 수단
중 적어도 하나를 포함하는, 장치. - 제 23 항에 있어서,
상기 제 1 메모리 로케이션은 제 1 하드웨어 레지스터이고, 상기 제 2 메모리 로케이션은 제 2 하드웨어 레지스터인, 장치. - 제 24 항에 있어서,
상기 제 1 하드웨어 레지스터는 상기 제 1 작업-항목과 연관되고, 상기 제 2 하드웨어 레지스터는 상기 제 2 작업-항목과 연관되는, 장치. - 제 22 항에 있어서,
상기 서브그룹 간 데이터 전송을 수행하는 수단은,
상기 제 1 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로부터 상기 제 2 서브그룹에 대응하는 하나 이상의 작업-항목들과 연관된 하나 이상의 레지스터들로 데이터를 복사하는 수단; 또는
상기 제 2 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 레지스터들로부터 상기 제 1 서브그룹에 대응하는 상기 하나 이상의 작업-항목들과 연관된 상기 하나 이상의 레지스터들로 데이터를 복사하는 수단
중 적어도 하나를 포함하는, 장치. - 제 22 항에 있어서,
상기 서브그룹 간 데이터 전송을 수행하는 수단은 애플리케이션 프로그래밍 인터페이스 (API) 함수를 실행하는 수단을 포함하고,
상기 API 함수는,
gentype copy(gentype variable, int subgroup_id, int named_barrier_id);
gentype generalized_shuffle(gentype variable, int fiber_id, int subgroup_id, int named_barrier_id);
gentype subgroup_exchange(gentype var, int srcSubgroupId);
gentype sub_group_exchange_{up|down|xor}(gentype var, int count, named_barrier*barrier_array );
gentype sub_group_shuffle_{up|down|xor}_exchange_{up|down|xor}(gentype var, int shuffle_cnt, int subgroup_cnt); 또는
gentype generalized_shuffle(gentype variable, int workitem_id, int subgroup_id, int named_barrier_id)
중 적어도 하나를 포함하는, 장치. - 제 22 항에 있어서,
프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기의 이용 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 수단을 더 포함하는, 장치. - 제 22 항에 있어서,
프로세싱 유닛의 또는 상기 프로세싱 유닛에 의해 액세스가능한 임의의 메모리 제어기에의 메모리 요청의 전송 없이 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하는 수단을 더 포함하는, 장치. - 명령들을 저장한 비일시적 컴퓨터 판독가능 저장 매체로서,
상기 명령들은, 실행될 때, 하나 이상의 프로세서들로 하여금,
제 1 서브그룹에 대응하는 제 1 작업-항목을 실행하게 하고;
제 2 서브그룹에 대응하는 제 2 작업-항목을 실행하게 하며;
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 제 1 배리어를 실행하게 하고;
일단 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 상기 제 1 배리어에 의해 동기화되면, 상기 제 1 서브그룹과 상기 제 2 서브그룹 사이의 서브그룹 간 데이터 전송을 수행하게 하고; 그리고
상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목이 제 2 배리어를 지나서 진행하도록 허용하기 전에 상기 서브그룹 간 데이터 전송이 완료되는 것을 보장하기 위해, 상기 제 1 서브그룹의 각각의 작업-항목 및 상기 제 2 서브그룹의 각각의 작업-항목을 동기화하는 상기 제 2 배리어를 실행하게 하는, 비일시적 컴퓨터 판독가능 저장 매체.
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201662328228P | 2016-04-27 | 2016-04-27 | |
US62/328,228 | 2016-04-27 | ||
US15/258,207 US10223436B2 (en) | 2016-04-27 | 2016-09-07 | Inter-subgroup data sharing |
US15/258,207 | 2016-09-07 | ||
PCT/US2017/019648 WO2017189085A1 (en) | 2016-04-27 | 2017-02-27 | Inter-subgroup data sharing |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20190003512A KR20190003512A (ko) | 2019-01-09 |
KR102014670B1 true KR102014670B1 (ko) | 2019-08-26 |
Family
ID=60158924
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020187030686A KR102014670B1 (ko) | 2016-04-27 | 2017-02-27 | 서브그룹 간 데이터 공유 |
Country Status (8)
Country | Link |
---|---|
US (1) | US10223436B2 (ko) |
EP (1) | EP3449368B1 (ko) |
JP (1) | JP6700422B2 (ko) |
KR (1) | KR102014670B1 (ko) |
CN (1) | CN109074289B (ko) |
BR (1) | BR112018071982A2 (ko) |
ES (1) | ES2894372T3 (ko) |
WO (1) | WO2017189085A1 (ko) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11409579B2 (en) * | 2020-02-24 | 2022-08-09 | Intel Corporation | Multiple independent synchonization named barrier within a thread group |
KR102501187B1 (ko) * | 2020-04-03 | 2023-02-17 | 서울대학교산학협력단 | 배리어 구현 방법 및 시스템 |
US12067428B2 (en) * | 2020-12-21 | 2024-08-20 | Intel Corporation | Thread synchronization mechanism |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090100196A1 (en) | 2007-10-12 | 2009-04-16 | International Business Machines Corporation | Generic shared memory barrier |
US20130326524A1 (en) | 2012-06-01 | 2013-12-05 | Advanced Micro Devices, Inc. | Method and System for Synchronization of Workitems with Divergent Control Flow |
US20150187042A1 (en) | 2013-12-26 | 2015-07-02 | Intel Corporation | Using a global barrier to synchronize across local thread groups in general purpose programming on gpu |
US9128736B1 (en) | 2008-03-28 | 2015-09-08 | Emc Corporation | Common scheduling and synchronization primitives |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3402566B2 (ja) * | 1997-03-18 | 2003-05-06 | 株式会社日立製作所 | マルチプロセッサ |
JP3858492B2 (ja) * | 1998-12-28 | 2006-12-13 | 株式会社日立製作所 | マルチプロセッサシステム |
JP2009176116A (ja) * | 2008-01-25 | 2009-08-06 | Univ Waseda | マルチプロセッサシステムおよびマルチプロセッサシステムの同期方法 |
US8677106B2 (en) | 2009-09-24 | 2014-03-18 | Nvidia Corporation | Unanimous branch instructions in a parallel thread processor |
US9645854B2 (en) * | 2010-12-15 | 2017-05-09 | Advanced Micro Devices, Inc. | Dynamic work partitioning on heterogeneous processing devices |
US20120198458A1 (en) * | 2010-12-16 | 2012-08-02 | Advanced Micro Devices, Inc. | Methods and Systems for Synchronous Operation of a Processing Device |
JP5707265B2 (ja) | 2011-07-20 | 2015-04-22 | ルネサスエレクトロニクス株式会社 | 演算制御装置及び演算制御方法並びにプログラム、並列プロセッサ |
US8607247B2 (en) * | 2011-11-03 | 2013-12-10 | Advanced Micro Devices, Inc. | Method and system for workitem synchronization |
US8935513B2 (en) * | 2012-02-08 | 2015-01-13 | International Business Machines Corporation | Processor performance improvement for instruction sequences that include barrier instructions |
US9329877B2 (en) | 2012-03-18 | 2016-05-03 | Microsoft Technology Licensing, Llc | Static verification of parallel program code |
US20130332937A1 (en) | 2012-05-29 | 2013-12-12 | Advanced Micro Devices, Inc. | Heterogeneous Parallel Primitives Programming Model |
WO2014002178A1 (ja) * | 2012-06-26 | 2014-01-03 | 東芝三菱電機産業システム株式会社 | データ収集装置及びデータ収集プログラム |
US9292359B2 (en) * | 2012-07-27 | 2016-03-22 | Intel Corporation | System and method for memory management |
US9218223B2 (en) * | 2013-08-13 | 2015-12-22 | Qualcomm Incorporated | Barrier synchronization with dynamic width calculation |
JP6200824B2 (ja) | 2014-02-10 | 2017-09-20 | ルネサスエレクトロニクス株式会社 | 演算制御装置及び演算制御方法並びにプログラム、OpenCLデバイス |
-
2016
- 2016-09-07 US US15/258,207 patent/US10223436B2/en active Active
-
2017
- 2017-02-27 ES ES17711835T patent/ES2894372T3/es active Active
- 2017-02-27 JP JP2018555945A patent/JP6700422B2/ja active Active
- 2017-02-27 CN CN201780024279.9A patent/CN109074289B/zh active Active
- 2017-02-27 EP EP17711835.3A patent/EP3449368B1/en active Active
- 2017-02-27 BR BR112018071982-0A patent/BR112018071982A2/pt unknown
- 2017-02-27 KR KR1020187030686A patent/KR102014670B1/ko active IP Right Grant
- 2017-02-27 WO PCT/US2017/019648 patent/WO2017189085A1/en active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090100196A1 (en) | 2007-10-12 | 2009-04-16 | International Business Machines Corporation | Generic shared memory barrier |
US9128736B1 (en) | 2008-03-28 | 2015-09-08 | Emc Corporation | Common scheduling and synchronization primitives |
US20130326524A1 (en) | 2012-06-01 | 2013-12-05 | Advanced Micro Devices, Inc. | Method and System for Synchronization of Workitems with Divergent Control Flow |
US20150187042A1 (en) | 2013-12-26 | 2015-07-02 | Intel Corporation | Using a global barrier to synchronize across local thread groups in general purpose programming on gpu |
Also Published As
Publication number | Publication date |
---|---|
US20170316076A1 (en) | 2017-11-02 |
CN109074289A (zh) | 2018-12-21 |
EP3449368B1 (en) | 2021-09-22 |
ES2894372T3 (es) | 2022-02-14 |
US10223436B2 (en) | 2019-03-05 |
CN109074289B (zh) | 2023-07-18 |
JP2019515384A (ja) | 2019-06-06 |
EP3449368A1 (en) | 2019-03-06 |
JP6700422B2 (ja) | 2020-05-27 |
WO2017189085A1 (en) | 2017-11-02 |
KR20190003512A (ko) | 2019-01-09 |
BR112018071982A2 (pt) | 2019-02-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9436504B2 (en) | Techniques for managing the execution order of multiple nested tasks executing on a parallel processor | |
US10101977B2 (en) | Method and system of a command buffer between a CPU and GPU | |
US9442755B2 (en) | System and method for hardware scheduling of indexed barriers | |
US8639882B2 (en) | Methods and apparatus for source operand collector caching | |
US9164690B2 (en) | System, method, and computer program product for copying data between memory locations | |
US20130198760A1 (en) | Automatic dependent task launch | |
US9626216B2 (en) | Graphics processing unit sharing between many applications | |
JP2010244529A (ja) | デッドロックを起こさないパイプライン処理のためのシステム及び方法 | |
US10572399B2 (en) | Memory request arbitration | |
US20140373028A1 (en) | Software Only Inter-Compute Unit Redundant Multithreading for GPUs | |
CN104025185A (zh) | 用于使用gpu控制器来预加载缓存的机制 | |
KR102014670B1 (ko) | 서브그룹 간 데이터 공유 | |
US9471307B2 (en) | System and processor that include an implementation of decoupled pipelines | |
TW201337829A (zh) | 暫存器檔案型讀取 | |
CN116775518A (zh) | 用于高效访问多维数据结构和/或其他大型数据块的方法和装置 | |
CN116774968A (zh) | 具有一组线程束的高效矩阵乘法和加法 | |
TW201432573A (zh) | 工作佇列型圖形處理單元工作創建 | |
US20230315655A1 (en) | Fast data synchronization in processors and memory | |
US20230289189A1 (en) | Distributed Shared Memory | |
CN116775519A (zh) | 用于高效访问多维数据结构和/或其他大型数据块的方法和装置 | |
CN115775198A (zh) | 多核gpu中的重叠几何形状处理 | |
CN116775265A (zh) | 协作组阵列 | |
US20220206851A1 (en) | Regenerative work-groups |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant |