KR20220127326A - 협력 워크-스틸링 스케줄러 - Google Patents

협력 워크-스틸링 스케줄러 Download PDF

Info

Publication number
KR20220127326A
KR20220127326A KR1020227029373A KR20227029373A KR20220127326A KR 20220127326 A KR20220127326 A KR 20220127326A KR 1020227029373 A KR1020227029373 A KR 1020227029373A KR 20227029373 A KR20227029373 A KR 20227029373A KR 20220127326 A KR20220127326 A KR 20220127326A
Authority
KR
South Korea
Prior art keywords
task
memory
execution unit
data
worker thread
Prior art date
Application number
KR1020227029373A
Other languages
English (en)
Inventor
마이클 챔피그니
Original Assignee
레이던 컴퍼니
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 레이던 컴퍼니 filed Critical 레이던 컴퍼니
Publication of KR20220127326A publication Critical patent/KR20220127326A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3877Concurrent instruction execution, e.g. pipeline or look ahead using a slave processor, e.g. coprocessor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/5044Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering hardware capabilities
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/509Offload

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)
  • Multi Processors (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)
  • Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
  • Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)

Abstract

중앙 처리 유닛(CPU) 및 그래픽 처리 유닛(GPU)를 구비한 컴퓨팅 시스템에서 사용하는 방법은, 제1 메모리 포션(portion) 및 제2 메모리 포션을 (i) 상기 CPU 상에서 실행되는 워크-스틸링(work-stealing) 스케줄러(scheduler)의 워커(worker) 쓰레드(thread) 및 (ii) 상기 GPU의 일부분인 실행(execution) 유닛에 할당(assign)하는 단계; 상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 단계; 상기 워커 쓰레드에 의해, 상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 단계; 상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 단계; 상기 컷오프 조건이 만족된 경우, 상기 태스크에 대응하는 제1 데이터를 상기 제2 메모리 포션에 저장하는 단계; 상기 제1 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)하는 단계; 및 제1 값을 상기 제1 메모리 포션에 저장하는 단계를 포함한다.

Description

협력 워크-스틸링 스케줄러
협력 워크-스틸링 스케줄러가 개시된다.
GPU 장치는 응답 시간(예: 대기 시간)이 아닌 계산 쓰루풋(throughput)에 최적화되어 있다. GPU의 아키텍처 및 관련 소프트웨어의 기존 설계 선택은, 산술 연산(arithemetic operation)의 높은 지속된(sustained) 쓰루풋을 지향한다. 특히, GPU는 대규모 데이터 세트의 병렬 처리를 위해 다수의 ALU(산술 논리 장치)에 대한 칩 공간을 최대화하는 소프트웨어 관리 스크래치패드(scratchpad) 메모리와 비교적 작고 단순한 캐시를 가지고 있다. 그러나, 현재 GPU의 벌크 싱크로(bulk synchronous) 프로그래밍 모델은 일정 수준의 태스크 스케줄링이 필요한 유연한 애플리케이션을 호스팅하는 데 적용 가능성을 제한한다. 알려진 GPU 스케줄링 정책은 하드웨어에 정의되어 있고, GPU 멀티-프로세서에서 수동 알고리즘 배치(placement)를 허용하지 않는다. 예를 들어, 생산자-소비자 패턴과 같은 멀티-프로세서 동기화가 필요한 응용 프로그램을, 동일한 멀티-프로세서에서 실행하게 되면 교착(deadlock) 상태가 발생할 수 있다. 기존 시스템에서는 로컬 GPU 캐시를 더 잘 활용하는 것과 같은 로컬리티(locality)의 이점을 얻기 위해 동일한 멀티-프로세서에서 유사한 태스크를 공동 스케줄링(co-scheduled)할 수 있는 작업을 처리하기 위한 환경을 제공하는 것도 어렵다.
엔비디아(NVIDIA) 사의 컴퓨터 통합 디바이스 아키텍쳐(Compute Unified Device Architecture; CUDA) 프레임워크는 GPU 자체의 전역 장벽을 통해 동기화될 수 있는 GPU에서 협력(cooperative) 쓰레드(thread) 그리드를 론칭(launch)하는 기능을 제공한다(CPU 상의 배리어와 동기화할 필요 없음). 이 기능을 통해 사용자는 GPU에 대한 커널(kernels) 파이프라인(즉, GPU 프로그램)을 스케줄링할 수 있다. 그러나, 기성(off-the-shelf) GPU 스케줄러는 여전히 전체 GPU 디바이스에서 정의되지 않은(undefined) 방식으로 쓰레드 블록을 예약하여, GPU 다중 프로세서에 쓰레드 블록의 수동 배치를 막고 있다. 이러한 제한 때문에 GPU 리소스를 충분히 활용하지 못할 수 있다.
일 실시예에서, 중앙 처리 유닛(CPU) 및 그래픽 처리 유닛(GPU)를 구비한 컴퓨팅 시스템에서의 사용 방법은, 제1 메모리 포션(portion) 및 제2 메모리 포션을 (i) 상기 CPU 상에서 실행되는 워크-스틸링(work-stealing) 스케줄러(scheduler)의 워커(worker) 쓰레드(thread) 및 (ii) 상기 GPU의 일부분인 실행(execution) 유닛에 할당(assign)하는 단계; 상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 단계; 상기 워커 쓰레드에 의해, 상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 단계; 상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 단계를 포함한다.
일 실시예에서, 상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함한다.
일 실시예에서, 상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함한다.
일 실시예에서, 상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함한다.
일 실시예에서, 상기 방법은, 상기 실행 유닛에 의해 제2 값이 상기 제1 메모리 포션에 저장된 경우, 상기 태스크가 완료된 것을 검출하는 단계를 더 포함하고, 상기 검출하는 단계는 상기 워커 쓰레드에 의해 수행된다.
일 실시예에서, 상기 방법은, 상기 제2 메모리 포션으로부터, 상기 실행 유닛에 의해 상기 태스크의 실행 결과로 생성된 제2 데이터를 리트리빙하는 단계를 더 포함하고, 상기 제2 데이터는, 상기 실행 유닛에 의해 상기 제1 메모리 포션에 저장된 제2 값을 검출한 것에 응답하여, 상기 워커 쓰레드에 의해 리트리빙된다.
일 실시예에서, 상기 방법은, 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하는 단계 - 상기 제1 데이터는, 상기 워커 쓰레드에 의해 상기 제1 메모리 포션에 저장된 제1 값을 검출한 것에 응답하여, 상기 실행 유닛에 의해 리트리빙됨 -; 및 상기 태스크를 실행하는 단계 - 상기 태스크는 상기 제1 데이터에 기초하여 상기 실행 유닛에 의해 실행됨 -를 더 포함한다.
일 실시예에서, 상기 방법은, 상기 태스크의 실행 결과로 상기 실행 유닛에 의해 생성된 제2 데이터를 상기 제2 메모리 포션에 저장하는 단계; 상기 제2 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 릴리즈 명령(memory fence release instruction)을 발행하는 단계; 및 상기 태스크가 완료되었음을 나타내는 제2 값을 상기 제1 메모리 포션에 저장하는 단계 - 상기 제2 값은 상기 메모리 펜스 릴리즈 명령이 발행된 이후 상기 실행 유닛에 의해 저장됨 -를 더 포함한다.
일 실시예에서, 시스템이 제공되는데, 상기 시스템은, 실행 유닛을 구비한 그래픽 처리 유닛(GPU); 제1 메모리 포션(portion) 및 제2 메모리 포션을 구비한 랜덤 억세스 메모리(RAM); 워크-스틸링(work-stealing) 스케줄러(scheduler)를 실행하도록 구성된 중앙 처리 유닛(CPU) - 상기 워크-스틸링 스케줄러는 워커 쓰레드(worker thread)를 구비하고, 워커 쓰레드는: 상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 동작; 상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 동작; 상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 동작; 상기 컷오프 조건이 만족된 경우, 상기 태스크에 대응하는 제1 데이터를 상기 제2 메모리 포션에 저장하는 동작; 상기 제1 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)하는 동작; 및 상기 메모리 펜스 획득 명령이 발행된 이후, 제1 값을 상기 제1 메모리 포션에 저장하는 동작을 수행하도록 구성되고, 상기 제1 값을 상기 제1 메모리 포션에 저장함으로 인해, 상기 실행 유닛이 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하고 상기 제1 데이터에 기초하여 상기 태스크를 실행하도록 한다.
일 실시예에서, 상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함한다.
일 실시예에서, 상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함한다.
일 실시예에서, 상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함한다.
일 실시예에서, 상기 워커 쓰레드는, 상기 실행 유닛에 의해 제2 값이 상기 제1 메모리 포션에 저장된 경우, 상기 태스크가 완료된 것을 검출하는 동작을 수행하도록 더 구성된다.
일 실시예에서, 상기 워커 쓰레드는, 상기 제2 메모리 포션으로부터, 상기 실행 유닛에 의해 상기 태스크의 실행 결과로 생성된 제2 데이터를 리트리빙하는 동작을 수행하도록 더 구성되고, 상기 제2 데이터는, 상기 실행 유닛에 의해 상기 제1 메모리 포션에 저장된 제2 값을 검출한 것에 응답하여 리트리빙된다.
일 실시예에서, 상기 실행 유닛은: 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하는 동작 - 상기 제1 데이터는, 상기 워커 쓰레드에 의해 상기 제1 메모리 포션에 저장된 제1 값을 검출한 것에 응답하여 리트리빙됨 -; 및 상기 제1 데이터에 기초하여 상기 태스크를 실행하는 동작을 수행하도록 더 구성된다.
일 실시예에서, 상기 실행 유닛은: 상기 태스크의 실행 결과로 상기 실행 유닛에 의해 생성된 제2 데이터를 상기 제2 메모리 포션에 저장하는 동작; 상기 제2 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 릴리즈 명령(memory fence release instruction)을 발행하는 동작; 및 상기 태스크가 완료되었음을 나타내는 제2 값을 상기 제1 메모리 포션에 저장하는 동작 - 상기 제2 값은 상기 메모리 펜스 릴리즈 명령이 발행된 이후 저장됨 -을 수행하도록 더 구성된다.
본 개시의 측면들에 따르면, 하나 또는 그 이상의 프로세서 실행가능한 명령어들을 저장하도록 구성된 비-일시적(non-transitory) 컴퓨터 판독가능 기록 매체가 제공되는데, 상기 컴퓨터 판독가능 기록 매체는, 적어도 하나의 프로세서에 의해 처리되는 경우, 상기 프로세서로 하여금 워커 쓰레드(worker thread)를 구비한 워크-스틸링(work-stealing) 스케줄러(scheduler)를 실행시키도록 하고, 상기 워커 쓰레드는 그래픽 처리 유닛(GPU)의 한 부분인 실행 유닛과 제1 메모리 포션 및 제2 메모리 포션을 공유하도록 배열되며, 상기 워커 쓰레드는: 상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 동작; 상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 동작을 수행하도록 배치된다.
일 실시예에 있어서, 상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함한다.
일 실시예에 있어서, 상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함한다.
일 실시예에 있어서, 상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함한다.
전술한 특징들은 후술하는 도면의 설명으로부터 더욱 명확히 이해될 수 있을 것이다.
도 1은 본 개시의 측면들에 따른, 컴퓨팅 시스템의 예가 도시된 다이어그램이다.
도 2a는 본 개시의 측면들에 따른, 워크-스틸링(work-stealing) 스케줄러(scheduler)의 예가 도시된 다이어그램이다.
도 2b는 본 개시의 측면들에 따른, 도 2a에 도시된 워크-스틸링(work-stealing) 스케줄러(scheduler)에 의해 사용되는 큐의 예가 도시된 다이어그램이다.
도 3a는 본 개시의 측면들에 따른, 그래픽 처리 유닛(GPU)의 예가 도시된 다이어그램이다.
도 3b는 본 개시의 측면들에 따른, 도 3a의 GPU의 한 부분인 실행 유닛의 예가 도시된 다이어그램이다.
도 4a는 본 개시의 측면들에 따른, 도 2a의 워크-스틸링 스케줄러의 동작을 예시한 다이어그램이다.
도 4b는 본 개시의 측면들에 따른, 공유 메모리 섹션의 예가 도시된 다이어그램이다.
도 5a는 본 개시의 측면들에 따른, 처리 방법의 예가 도시된 플로우차트이다.
도 5b는 본 개시의 측면들에 따른, 처리 방법의 예가 도시된 플로우차트이다.
도 6a는 본 개시의 측면들에 따른, 처리 방법의 예가 도시된 플로우차트이다.
도 6b는 본 개시의 측면들에 따른, 처리 방법의 예가 도시된 플로우차트이다.
도 6c는 본 개시의 측면들에 따른, 처리 방법의 예가 도시된 플로우차트이다.
워크-스틸링(work-stealing)은 중앙 처리 유닛(CPU)에서 널리 사용되는 효율적인 동적 스케줄링 정책이다. 워크-스틸링 스케줄러는, 처리 코어(core)에서 실행되는 워커 쓰레드(worker thread)와 각각 연결된 이중 종단 큐(double-ended queres)(이하 "데크(deque)")의 세트에 걸쳐 태스크를 분산함으로써 병렬 프로세서에서 로드 밸런싱을 수행한다. 각 데크는 해당 데크와 관련된 로컬 쓰레드가 직렬(serial) 실행(즉, 스택 순서(stack order))과 동일한 순서로 워크(즉, 태스크)을 스케줄링 및 스케줄링 취소(de-schedule)할 수 있도록 하는 푸시 앤 팝 작업(push and pop operation)을 지원할 수 있다. 각 데크는 로컬 데크에서 실행할 태스크가 바닥날 때 비-로컬 쓰레드(씨프(thief) 쓰레드라고도 함)가 사용하는 스틸링 작업(steal operation)을 지원할 수도 있다. 스틸링 작업은 시프 쓰레드에 의한 실행을 위해 빅텀(victim)의 데크 반대쪽 종단(로컬 쓰레드에 상대적임)에서 태스크를 제거할 수 있다. 태스크가 실행될 때 태스크 실행은 로컬 데크에 배치되는 추가 태스크를 자주 생성할 수 있다.
워크-스틸링 스케줄러는 런타임에서 디렉트 비순환 그래프(directed acyclic graph; DAG)를 형성하는 작업을 생성 및 처리한다. 그들은 분리-및-정복 반복(divide-and-conquer recurrences)으로 표현되는 알고리즘을 실행하고, 여기에서, 각 부모 태스크(parent task)에 대해 하나 또는 그 이상의 세분화된(finger-grained) 자식 태스크(child tasks)이 생성(즉, 포크됨(forked))된다. 이러한 알고리즘은 또한 쓰레드가 포크된(forked) 자식 태스크가 실행 종료까지 기다려야 하는(즉, 조인함) 위치를 나타낸다. 반복의 기본 사례(순차 컷오프라고 불림)에서, 분리될 작업이 너무 작아서 자식 태스크로 수익성있게(profitably) 파티셔닝(partitioned)되는데, 이 지점에서 순차(sequential) 알고리즘이 실행된다(즉, 리프(leaf) 태스크). 수익성은 자식 태스크를 파티셔닝하고 스케줄링하는데 얼마나 많은 오버헤드가 필요한지를 측정한 것이다. 특히, 모든 알고리즘 작업은 리프 태스크에서 수행된다.
본 개시에 따르면, 스케줄러 오버헤드가 그 태스크를 실제 실행하는 비용을 좌지우지하는(dominate) 순차 컷오프에 도달할 때까지 태스크를 회귀적으로(recursively) 분리하는 워크-스틸링 스케줄러의 일부를 실행하는 CPU에서, 개선된 워크-스틸링 스케줄러가 개시된다. 이 점에서, 개선된 워크-스틸링 스케줄러는 CPU 상에서 순차 코드를 실행하는 대신, 사용가능한(available) GPU(그래픽 처리 유닛)에서 실행을 위해 작업을 오프로드(offload) 한다. 예를 들어, 일부 구현에서, 본 개시는 GPU를 지원하고 기존의 일반-목적 워크-스틸링 스케줄러의 실행 시맨틱(semantics)을 유지하는, 이기종(heterogeneous) 협력(cooperative) 워크-스틸링 스케줄러 설계를 제시함으로써, 기존의 워크-스틸링 스케줄러(CPU만 활용)에 대한 개선(enhancement)을 제공할 수 있다.
도 1은 본 개시의 측면들에 따른 컴퓨팅 시스템(100)의 예가 도시된 다이어그램이다. 컴퓨팅 시스템(100)은 중앙 처리 유닛(CPU)(109), 그래픽 처리 유닛(GPU)(120), 메모리(130), 및 공유 메모리(140)를 포함할 수 있다. CPU(109)는 x86 프로세서, RISC(Reduced Instruction Set Computer) 프로세서, ARM 기반 프로세서 등과 같은 임의의 적합한 유형의 프로세서를 포함할 수 있다. 본 일예에 따르면, CPU(109)는 워크-스틸링 스케줄러(200)(도 2에 도시됨)의 서로 다른 워커 쓰레드(220)를 병렬로 실행하도록 배열된 복수의 CPU 코어(110A-110D)를 포함한다. 비록 도 1의 예에서, CPU(109)는 4개의 CPU 코어를 구비하지만, CPU가 임의의 수의 코어(예를 들어, 1개, 8개 등)를 갖는 대안적인 구현이 가능하다.
GPU(120)는 CPU(109)의 주소 공간으로부터 GPU(120)의 주소 공간으로 메모리 범위(range)를 직접 매핑하는 능력을 갖는 임의의 적합한 유형의 그래픽 처리 유닛을 포함할 수 있고, 이를 통해 단일 가상 주소 공간이 공유된다. 일부 구현에서, GPU(120)는 컴퓨트 통합 디바이스 아키텍처(Compute Unified Device Architecture; CUDA) 프레임워크를 지원하는 GPU를 포함할 수 있다. 추가적으로 또는 대안적으로, 일부 구현들에서, GPU(120)는 OpenCL(Open Computing Language) 프레임워크를 지원하는 GPU를 포함할 수 있다. GPU(120)는 복수의 GPU 코어를 포함할 수 있다. 본 일예에 따르면, GPU(120)는 1024개의 GPU 코어를 포함하지만, 본 개시는 GPU(120) 상에 제공되는 임의의 특정 개수의 GPU 코어(132)에 제한되지 않는다는 것이 이해될 것이다.
메모리(130)는, 예를 들어, DDR SDRAM(Double Data Rate Synchronous Dynamic Random-Access Memory)과 같은 임의의 적합한 유형의 랜덤 액세스 메모리(RAM)를 포함할 수 있다. 공유 메모리(140)는 GPU(120)의 메모리 공간에 각각 매핑되는 메모리(130)의 일부를 포함할 수 있다. 공유 메모리(140)는 GPU(120)의 메모리 공간에 매핑되므로, CPU(109) 및 GPU(120) 각각은 공유 메모리(140)에 직접 억세스할 수 있다. 예를 들어, 일부 구현에서 공유 메모리(140)는 CUDA 프레임워크 또는 OpenCL 프레임워크를 사용하여 GPU(120)의 메모리 공간에 매핑될 수 있다. 일부 구현에서, GPU(120)는 공유 메모리(140)에 대한 포인터를 억셉트(accept)하고 이 포인터를 사용하여 GPU 커널 내에서 공유 메모리(140)를 직접 참조(reference)하도록 배열(arrange)될 수 있다. 유사하게, CPU 코어(110)의 적어도 일부는 또한 포인터를 사용하여 공유 메모리(140)를 직접 참조하도록 배열될 수 있다.
도 2a는 CPU(109) 상에서 실행되는 워크-스틸링 스케줄러(200)의 예가 도시된 다이어그램이다. 워크-스틸링 스케줄러(200)는 임의의 적합한 유형의 병렬 컴퓨팅 소프트웨어 및/또는 마이크로코드의 일부일 수 있다. 워크-스틸링 스케줄러(200)는 복수의 큐(210) 및 복수의 워커 쓰레드(220)를 포함할 수 있다. 각각의 워커 쓰레드(220)는 서로 다른 큐(210)와 연관될 수 있다. 본 일예에 따르면, 워커 쓰레드(220A)는 큐(210A)와 연관되고; 워커 쓰레드(220B)는 큐(210B)와 연관되고; 워커 쓰레드(220C)는 큐(210C)와 연관되고; 워커 쓰레드(220D)는 큐(210D)와 연관된다. 도 2bdp 관하여 아래에서 더 논의되는 바와 같이, 큐(210)는 태스크를 저장하고 리트리빙(retrieve)하도록 쓰레드(220)에 의해 사용된다. 도 2a의 일예에 따르면, 큐(210) 각각은 더블 종단(double-ended) 큐이다. 그러나, 태스크를 저장하기 위한 다른 유형의 큐 및/또는 다른 유형의 데이터 구조가 있는 대체 구현이 가능하다. 본 일예에서, 워크-스틸링 스케줄러(200)가 소프트웨어로 구현되지만, 워크-스틸링 스케줄러(200)가 하드웨어 및/또는 소프트웨어(또는 마이크로코드) 또는 하드웨어의 조합으로 구현되는 대안적인 구현이 가능하다.
도 2b는 본 개시의 측면들에 따른 큐(210)의 다이어그램이다. 도면 넘버링에서 시사하는 바와 같이, 큐(210)는 워크-스틸링 스케줄러(200)의 일부인 큐(210A-B) 중 임의의 것과 동일하거나 유사할 수 있다. 예시된 바와 같이, 큐(210)는 하나 또는 그 이상의 태스크를 저장하도록 배열될 수 있다. 각각의 태스크는 수행이 요망되는 특정 작업을 나타낼 수 있다. 큐(210) 내의 모든 태스크는 워크-스틸링 스케줄러(200)에 의해 구현된 병렬 컴퓨팅 알고리즘을 통해 실행되고 있는 특정 액션에 대한 디렉트 비순환 그래프(directed acyclic graph; DAG)의 일부일 수 있다. 본 개시의 전체에서 사용되는 것과 같이, 문맥에 따라, "태스크"라는 용어는 작업(operation) 또는 작업에 대응하는 디스크립터(descriptor)를 지칭할 수 있다. 예를 들어, 일부 구현에서 "태스크"라는 용어는 작업을 실행하는 데 필요한 임의의 적합한 유형의 데이터를 나타낼 수 있다. 예를 들어, "태스크"는 작업에 대응하는 옵코드(opcode), 작업을 실행하기 위한 입력 파라미터, 작업과 관련된 함수 호출(function calls)에 대한 아규먼트(arguments), 실행되는 작업을 위해 참조할 필요가 있는 다른 데이터에 대한 포인터, 및/또는 작업을 실행하는 데 필요한 기타 적절한 유형의 데이터 중 하나 이상을 포함할 수 있다.
도 3a는 본 개시의 측면들에 따른 GPU(120)의 논리적 구성의 일예가 도시된 다이어그램이다. 본 일예에 따르면, GPU(300)는 실행 유닛(또는 타일)(310A), 실행 유닛(또는 타일)(310B), 실행 유닛(310C)(또는 타일), 및 실행 유닛(또는 타일)(310D)을 실행하도록 배열된다. 비록 도 3a의 일예에서, GPU(120)는 4개의 실행 유닛을 구현하도록 배열되지만, 본 개시는 GPU(120) 상의 임의의 특정 개수의 실행 유닛을 구현하는 것으로 제한되지 않는다는 것이 이해될 것이다. 일부 구현에서, 임의의 실행 유닛(310)은 NVIDIA CUDA(TM) 프레임워크에서 "블록(block)" 또는 "랩(wrap)"으로 알려진 것을 포함할 수 있다. 일부 구현들에서, 각각의 실행 유닛(310)은 동기화(synchronization) 포인트로서 사용하는 실행 유닛의 GPU 코어들에 대한 하드웨어 배리어(barrier) 메커니즘을 포함할 수 있다. 본 개시의 원리 및 아이디어에 따라 사용될 수 있는 실행 유닛의 예는, 미국 특허 출원 16/372,618로 발명의 명칭이 "ACCELERATING DATAFLOW SIGNAL PROCESSING APPLICATIONS ACROSS HEATEROGENEOUS CPU/GPU SYSTEMS"인 출원에서 찾을 수 있고, 이의 개시 내용은 여기에 참조로 완전히 포함된다.
도 3b는 본 개시의 측면들에 따른 실행 유닛(310)의 일예가 도시된 다이어그램이다. 도면 넘버링이 시사하는 바와 같이, 실행 유닛(310)은 위에서 논의된 도 3a와 관련하여 실행 유닛들(310A-D) 중 임의의 것과 동일하거나 유사할 수 있다. 도 3b에 도시된 바와 같이, 실행 유닛(310)은 GPU 코어(132)의 세트, 및 세트 내의 모든 GPU 코어(132) 간에 공유되는 동기화 배리어(320)를 포함할 수 있다. 본 일예에 따르면, 실행 유닛(310)은 32개의 GPU 코어(132)를 포함하지만, 실행 유닛(310)이 임의의 개수의 GPU 코어(132)(예를 들어, 1, 4, 8, 16, 64 등)를 포함하는 대안적인 구현이 가능하다. 비록 도 3b의 예에서 실행 유닛(310)은 동기화 배리어를 포함하지만, 다른 유형의 동기화 메커니즘이 대신 사용되는 대안적인 구현이 가능하다. 간결하게 말하면, 본 개시는 실행 유닛(310)에 있는 임의의 특정 유형의 동기화 메커니즘에 제한되지 않는다.
실행 유닛(310)는 워크-스틸링 스케줄러(200)에서 워커 쓰레드 (220)를 대신하여 작업을 실행하는 데 사용될 수 있다. 실행 유닛(310)의 GPU 코어(132) 중 하나는 프라이머리(primary) 상태가 할당될 수 있고, 여기에서 "실행 유닛(310)의 프라이머리 GPU 코어"라고 참조된다. 예를 들어, 일부 구현에서, '0'순위를 갖는 GPU 코어(실행 유닛(310) 내의)는 실행 유닛(310)의 프라이머리 GPU 코어로 지정 될 수 있다. 실행 유닛(310)의 나머지 GPU 코어(132)는 세컨더리(secondary) 상태가 할당될 수 있고, 여기에서 "실행 유닛(310)의 세컨더리 GPU 코어"라고 참조된다. 실행 유닛(310)의 프라이머리 GPU 코어(132)는: (i) 워커 쓰레드(220) 중 주어진 어느 하나로부터 태스크를 획득하고, (ii) 태스크를 태스크 부분으로 분리하고, (iii) 태스크 부분 중 어느 하나를 실행하고 남은 태스크 부분들을 세컨더리 GPU 코어로 제공하고, 및 (iv) 태스크가 완료되면 워커 쓰레드에 통보한다(notify).
특정한 일예에서, 동기화 배리어(320)는 하드웨어에서 구현될 수 있고, 실행 유닛(310)에서 GPU 코어(132) 사이의 공유(shared) 동기화 지점으로 사용되도록 배열될 수 있다. 특히, 동기화 배리어(320)는 각각의 GPU 코어(132)(예로, 각각의 세컨더리 GPU 코어(320) 및/또는 프라이머리 GPU 코어(132))로 하여금 이들이 개별 태스크 포션을 마치고 배리어(320)에 도달한 이후에 대기 상태에 진입하도록 할 수 있다. 대기 상태로 진입함으로 인해, GPU 코어(132)로 하여금 다음 태스크의 일부를 즉시 실행하도록 시작하는 것 및 잠재적으로 워커 쓰레드(220) 중 어느 하나에 의해 리트리빙되는 현재 태스크에 대한 완료 데이터 이전에, 현재 태스크에 대한 완료 데이터가 저장되는 태스크 레지스터(register)(예로, 도 4b에 도시된 태스크 레지스터 참조)를 오버라이팅(overwritting)하는 것을 효율적으로 방지할 수 있다. 본 일예에서 동기화 배리어(320)가 하드웨어에서 구현되지만, 동기화 배리어(320)가 소프트웨어 또는 하드웨어 및 소프트웨어의 조합으로 구현되는 대체 구현예가 가능하다. 간결하게 말하면, 본 개시는 동기화 배리어(320)의 특정 구현에만 국한되지 않는다.
도 4a는 본 개시의 측면에 따른 컴퓨팅 시스템(100)의 동작을 예시하는 개략적인 다이어그램이다. 본 개시의 측면에 따르면, 공유 메모리는 M개의 섹션들(410)로 분리(divide)되고, 여기서 M은 워크-스틸링 스케줄러(200)에 할당된 실행 유닛들(310)의 수(즉, 본 일예에서 4)와 동일한 양의 정수이다. 공유 메모리 섹션(410)은 각각의 워커 쓰레드(220)와 각 실행 유닛(310) 사이에서 데이터를 교환하는데 사용될 수 있다. 도 4b에 도시된 바와 같이, 섹션(410) 각각은 도어벨 레지스터 및 작업 레지스터(430)를 포함한다. 도어벨 레지스터(420)는 한 워드 크기(wide)일 수 있고, 태스크 레지스터(430)에 태스크가 저장되었을 때 시그널링하는데 사용될 수 있다. 태스크 레지스터(430)는 특정 태스크를 저장하도록 구성될 수 있다. 위에서 언급한 바와 같이, 본 개시 전체에서 사용되는 용어 "태스크"는 실행 유닛이 동작(operation)을 수행하는데 필요한 임의의 데이터를 지칭할 수 있다. 예를 들어, 태스크 레지스터(230)에 저장된 "태스크"는 특정 연산과 관련된 연산 코드, 연산을 실행하기 위한 입력 파라미터, 연산과 관련된 함수 호출에 대한 아규먼트(arguments), 실행될 동작을 위해 참조될 필요가 있는 다른 데이터에 대한 포인터 중 하나 또는 그 이상을 포함할 수 있다.
도 4a로 돌아가면, 실행 유닛(310) 각각은 공유 메모리 섹션(410) 중 하나를 할당(allocate) 받을 수 있다. 보다 구체적으로, 실행 유닛(310A)은 CPU 코어(110A)(및/또는 워커 쓰레드(220A))로부터 데이터를 송수신하는 실행 유닛(310A)에 의해 사용되는, 공유 메모리 섹션(410A)을 할당 받을 수 있다. 실행 유닛(310B)은 CPU 코어(110B)(및/또는 워커 쓰레드(220B))로부터 데이터를 송수신하는 실행 유닛(310B)에 의해 사용되는, 공유 메모리 섹션(410B)을 할당 받을 수 있다. 실행 유닛(310C)은 CPU 코어(110C)(및/또는 워커 쓰레드(220C))로부터 데이터를 송수신하는 실행 유닛(310C)에 의해 사용되는, 공유 메모리 섹션(410C)을 할당 받을 수 있다. 그리고, 실행 유닛(310D)은 CPU 코어(110D)(및/또는 워커 쓰레드(220D))로부터 데이터를 송수신하는 실행 유닛(310D)에 의해 사용되는, 공유 메모리 섹션(410D)을 할당 받을 수 있다.
또한, 각각의 CPU 코어(110)(및/또는 각각의 워커 쓰레드(220))는 각각의 공유 메모리 섹션(410)에 할당될 수 있다. 보다 구체적으로, CPU 코어(110A)(및/또는 워커 쓰레드(220A))는 실행 유닛(310A)으로부터 데이터를 송수신하기 위해 CPU 코어(110A)(및/또는 워커 쓰레드(220A))에 의해 사용되는 공유 메모리 섹션(410A)이 할당될 수 있다. CPU 코어(110B)(및/또는 워커 쓰레드(220B))는 실행 유닛(310B)으로부터 데이터를 송수신하기 위해 CPU 코어(110B)(및/또는 워커 쓰레드(220B))에 의해 사용되는 공유 메모리 섹션(410B)이 할당될 수 있다. CPU 코어(110C)(및/또는 워커 쓰레드(220C))는 실행 유닛(310C)으로부터 데이터를 송수신하기 위해 CPU 코어(110C)(및/또는 워커 쓰레드(220C))에 의해 사용되는 공유 메모리 섹션(410C)이 할당될 수 있다. 그리고, CPU 코어(110D)(및/또는 워커 쓰레드(220D))는 실행 유닛(310D)으로부터 데이터를 송수신하기 위해 CPU 코어(110D)(및/또는 워커 쓰레드(220D))에 의해 사용되는 공유 메모리 섹션(410D)이 할당될 수 있다.
각각의 CPU 코어(110)(및/또는 각각의 워커 쓰레드(220))는 각각의 실행 유닛(310)에 매핑될 수 있다. 도 4a의 일예에 따르면, CPU 코어(110A)(및/또는 워커 쓰레드(220A))는 실행 유닛(310A)에 매핑되고; CPU 코어(110B) 및/또는 워커 쓰레드(220B)는 실행 유닛(310B)에 매핑되고; CPU 코어(110C) 및/또는 워커 쓰레드(220C))는 실행 유닛(310C)에 매핑되고; CPU 코어(110D)(및/또는 워커 쓰레드(220A))는 실행 유닛(310D)에 매핑된다. CPU 코어(110) 중 어느 하나 및 대응하는 실행 유닛 간의 매핑은, 동일한 공유 메모리 섹션(410)을 CPU 코어 및 대응하는 실행 유닛(310)에 할당함으로써 달성될 수 있다. 그러나, 본 개시는 CPU 코어를 개별(respective) 실행 유닛에 매핑하는 특정 방법에 제한되지 않음이 이해되어야 한다.
일부 구현에서, 각각의 CPU 코어(110)(및/또는 워커 쓰레드(220))는 CPU 코어(110) 및/또는 워커 쓰레드(220)에 매핑되는 실행 유닛(310) 상의 태스크를 실행할 수 있다. 예를 들어, CPU 코어 110A(및/또는 워커 쓰레드(220A))는 실행 유닛(310A)에서 태스크를 실행할 수 있고; CPU 코어(110B)(및/또는 워커 쓰레드(220B))는 실행 유닛(310B)에서 태스크를 실행할 수 있고; CPU 코어(110C)(및/또는 워커 쓰레드(220C))는 실행 유닛(310C)에서 태스크를 실행할 수 있고; CPU 코어(110D)(및/또는 워커 쓰레드(220D))는 실행 유닛(310D)에서 태스크를 실행할 수 있다. 예를 들어, 워커 쓰레드(220) 중 임의의 주어진(given) 하나가 태스크에 대한 순차 컷오프(cutoff) 조건이 충족된 것을 검출(detect)한 경우, 상기 주어진 워커 쓰레드(220)는 워커 쓰레드(220)에 매핑되는 각각의 실행 유닛(310)을 식별할 수 있다. 워커 쓰레드(220)는 주어진 워커 쓰레드(220)와 각각의 실행 유닛(310) 모두에 할당된 공유 메모리 섹션(410)을 이용하여 각각의 실행 유닛(310)에 태스크를 제공할 수 있다. 다음으로, 각각의 실행 유닛(310)은 태스크를 실행하고, 태스크 실행의 결과로 생성된 데이터를 공유 메모리 섹션(410)에 다시 배치할 수 있다. 그리고 마지막으로, 주어진 워커 쓰레드는, 공유 메모리 섹션으로부터 태스크를 실행한 결과로 생성된 데이터를 리트리빙(retreive)할 수 있다.
비록 도 4a의 예에서, 각각의 CPU 코어(110)(및/또는 워커 쓰레드(220))는 단일 공유 메모리 섹션(410)에 할당되지만, 임의의 CPU 코어(110)에 다중 공유 메모리 섹션(410)이 할당되는 대안적인 구현이 가능하다. 비록 도 4b의 예에서, 각각의 CPU 코어(110)(및/또는 워커 쓰레드(220))는 단일 실행 유닛(310)에 매핑되지만, CPU 코어(110)(및/또는 워커 쓰레드(220)) 중 임의의 하나가 다수의(multiple) 실행 유닛에 매핑되는 대안적인 구현이 가능하다. 이러한 구현에서, 각각의 CPU 코어(110)(및/또는 워커 쓰레드)는 동일한 수의 실행 유닛(310)에 매핑될 수 있다. 만일 실행 유닛(310)의 개수가 CPU 코어(110)(및/또는 워커 쓰레드(220))의 개수에 의해 이븐하게(evenly) 나눠지지 않으면, CPU 코어(110)(및/또는 워커 쓰레드(220)) 중 하나는 더 적은 수의 실행 유닛(310)에 매핑될 수 있다.
도 5a는 본 개시의 측면들에 따른, 워크-스틸링 스케줄러(200)의 동작을 시작하기 위한 프로세스(500A)의 일예의 플로우차트이다. 본 일예에 따르면, 프로세스(500A)는 CPU 코어(110A)에 의해 수행된다. 그러나, 프로세스(500A)가 CPU 코어(110) 중 다른 하나에 의해 수행되는 대안적인 구현이 가능하다.
단계(502)에서, CPU 코어(110A)는 워크-스틸링 스케줄러(200)의 큐(210) 및 워커 쓰레드(220)를 인스턴스화(instantiate)한다. 단계 504에서, CPU 코어(110A)는 공유 메모리(140) 및 복수의 공유 메모리 섹션(410)을 공유 메모리(140) 내에서 할당(allocate)한다. 단계(506)에서, CPU 코어(110A)는 각각의 워커 쓰레드(220A)를 CPU(109)의 CPU 코어(110) 중 다른 하나에 할당(assign)한다. 위에서 언급한 바와 같이, 단계(506)을 실행한 결과, 워커 쓰레드(220A)는 CPU 코어(110A)에 할당되고, 워커 쓰레드(220B)는 CPU 코어(110B)에 할당되고, 워커 쓰레드(220C)는 CPU 코어(110C)에 할당되고, 워커 쓰레드(220D)는 CPU 코어(110D)에 각각 할당된다. 단계(508)에서, 코어(110A)는 워커 쓰레드(220) 각각을 실행 유닛(310) 중 개별 실행 유닛(310)에 매핑한다. 위에서 언급한 바와 같이, 단계(508)를 실행한 결과, 워커 쓰레드(220A)(및/또는 CPU 코어(110A))는 실행 유닛(310A)에 매핑된다. 워커 쓰레드(220B)(및/또는 CPU 코어(110B))는 실행 유닛(310B)에 매핑된다. 워커 쓰레드(220C)(및/또는 CPU 코어(110C))는 실행 유닛(310C)에 매핑된다. 그리고 워커 쓰레드(220D)(및/또는 CPU 코어(110D))는 실행 유닛(310D)에 매핑된다. 일부 구현에서, 워커 쓰레드(220) 중 임의의 하나와 임의의 실행 유닛(310) 사이의 매핑은 동일한 공유 메모리 섹션(410)을 워커 쓰레드(220) 및 실행 유닛(310)에 할당함으로써 수행될 수 있다. 단계(510)에서, CPU 코어(110A)는 실행을 시작한다. 일부 구현에서, 워커 쓰레드(220) 중 임의의 하나는 프로세스(500B)에 따라 실행될 수 있으며, 이는 도 5b를 참조하여 아래에서 더 논의된다.
도 5b는 본 개시의 측면들에 따른, 프로세스(500A)의 단계(510)에 의해 명시된 바와 같이 워크-스틸링 스케줄러의 워커 쓰레드를 실행하기 위한 프로세스(500B)의 일예의 플로우차트이다. 도 5b의 예에 따르면, 프로세스(500B)는 워커 쓰레드(220A)에 의해 수행되지만, 대안적으로 프로세스(500B)는 워커 쓰레드(220) 중 임의의 하나에 의해 수행될 수 있다는 것이 이해될 것이다. 단계(522)에서, 워커 쓰레드(220A)는 큐(210A)로부터의 태스크를 리트리빙(retrieve)(및/또는 제거)한다. 단계(524)에서, 워커 쓰레드(220A)는 미리 정해진 컷오프 조건을 만족하는지 판단한다. 조건이 충족되면, 프로세스(500B)는 단계(526)으로 진행한다. 그렇지 않고 조건이 충족되지 않으면, 프로세스(500B)는 단계(528)로 진행한다. 단계(526)에서, 프로세스(500B)는 태스크를 추가 태스크로 분리(divide)하고, 태스크를 큐(210A)에 다시 추가한다. 단계(528)에서, 워커 쓰레드(220A)는 GPU(120)의 실행 유닛(310A)을 사용하여 태스크를 실행한다. 태스크가 실행되는 방식은 도 6a 내지 도 6c를 참조하여 더 논의된다. 구체적으로, 도 6a는 실행 유닛(310A)에서 태스크를 실행할 목적으로 워커 쓰레드(220A)에 의해 수행되는 프로세스의 일예를 제공한다. 도 6b는 태스크의 서로 다른 포션(portions)의 실행을 조정(coordinate)할 목적으로, 실행 유닛(310A)의 프라이머리(primary) GPU 코어에 의해 수행되는 프로세스(600B)의 일예를 제공한다. 그리고 도 6c는 태스크 포션을 실행할 목적으로 실행 유닛(310A)에서 프라이머리 GPU 코어 및 세컨더리(secondary) GPU 코어 중 임의의 하나에 의해 수행되는 프로세스(600C)의 일예를 제공한다.
도 6a는 프로세스(500B)의 단계(528)에 의해 지정된 GPU를 사용하여 태스크를 실행하기 위한 프로세스(600A)의 플로우차트이다. 단계(602)에서, 워커 쓰레드(220A)는 태스크(예로, 단계(522)에서 리트리빙된 태스크)를 공유 메모리 섹션(410A)의 태스크 레지스터(430)에 저장한다. 단계(604)에서, 워커 쓰레드(220A)는 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)한다. 단계(606)에서, 워커 쓰레드(220A)는 공유 메모리 섹션(410A)의 도어벨(doorbell) 레지스터(420)에 제1 값(예를 들어, '1')을 저장한다. 도 6b를 참조하여 아래에서 더 논의되는 바와 같이, 도어벨 레지스터(420)에 제1 값을 저장하는 것은 실행 대기 중인 태스크 레지스터(430)에 태스크가 있음을 실행 유닛(310A)에 효과적으로 통지(notify)한다. 단계(608)에서, 워커 쓰레드(220A)는 공유 메모리 섹션(410A)의 도어벨 레지스터(420)가 제2 값(예를 들어, '0')으로 설정되었는지 여부를 검출한다. 도어벨 레지스터(420)가 제2 값으로 설정되어 있으면 프로세스(600A)는 단계(610)으로 진행하고, 도어벨 레지스터(420)가 제2 값으로 설정되어 있지 않으면 단계(608)을 다시 실행한다. 다시 말해, 단계(606)에서, 워커 쓰레드(220A)는 단계(610)으로 진행하기 전에 도어벨 레지스터(420)가 (실행 유닛(310A)에 의해) 제2 값으로 설정될 때까지 대기한다. 도 6b를 참조하여 아래에서 더 논의되는 바와 같이, 도어벨 레지스터(420)가 제2 값으로 설정되면, 이는 실행 유닛(310A)에 의해 태스크가 완료되었음을 워커 쓰레드(220A)에 효과적으로 통지한다. 단계(610)에서, 워커 쓰레드(220A)는, 공유 메모리 섹션(410A)의 태스크 레지스터(430)로부터, 실행 유닛(310A)의 하나 또는 그 이상의 GPU 코어에 의해 거기에 저장된 완료 상태 워드(completion status word)(및/또는 에러 코드)를 리트리빙한다.
도 6b는 프로세스(500B)의 단계(528)에 의해 지정된 태스크를 실행하기 위한 프로세스(600B)의 일예의 플로우차트이다. 단계(612)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 공유 메모리 섹션(410A)의 도어벨 레지스터(420)가 제1 값으로 설정되었는지 여부를 검출한다. 도어벨 레지스터(420)가 제1 값으로 설정되면, 프로세스(600B)는 단계(614)로 진행한다. 그렇지 않으면, 단계(612)가 다시 반복된다. 단계(614)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 공유 메모리 섹션(410A)의 태스크 레지스터(430)로부터 태스크를 리트리빙한다. 단계(616)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 태스크를 복수의 태스크 포션(portion)으로 분리한다. 단계(618)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 복수의 태스크 포션들 각각을 실행 유닛(310A) 내의 GPU 코어들 중 서로 다른 하나에 할당(assign)한다. 예를 들어, 프라이머리 GPU 코어는 실행 유닛(310A)에서 자신 및 세컨더리 GPU 코어 각각에 각각의 태스크 포션을 할당할 수 있다. 대안으로, 실행 유닛(310A)에 존재하는 GPU 코어보다 태스크 포션이 적은 경우, 프라이머리 GPU 코어(310A)는 실행 유닛(310A)의 GPU 코어 중 몇몇에만 각각의 태스크 포션을 할당할 수 있다. 단계(620)에서, 실행 유닛(310A)의 프라이머리 GPU 코어(132)는, (태스크 포션이 할당된) 실행 유닛(310)의 세컨더리 GPU 코어(132) 각각으로 하여금 각각의 태스크 포션의 실행을 시작하도록 한다. 단계(622)에서, 프라이머리 GPU 코어(132)는 자신에게 할당된 태스크 포션을 실행한다. 쉽게 이해될 수 있는 바와 같이, 일부 구현에서, 프라이머리 GPU 코어(132)는 태스크 포션을 자신에게 할당하지 않을 수 있고, 이 경우 단계(622)는 생략될 수 있다. 단계(622)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 실행 유닛(310A)의 GPU 코어(태스크 포선이 할당됨) 각각이 각각의 태스크 포션의 실행을 완료했는지 여부를 검출(detect)한다. 예를 들어, GPU 코어 각각이 각각의 태스크 포션의 실행을 완료했는지 여부를 검출하는 것은, GPU 코어 각각이 실행 유닛(310A)의 동기화 배리어(320)에 도달하고 현재 대기 상태에 있는지 여부를 검출하는 것을 포함할 수 있다. GPU 코어 각각이 각각의 태스크 포션의 실행을 완료한 경우, 프로세스(600B)는 단계(626)으로 진행한다. 그렇지 않으면, 단계(624)가 반복된다. 단계(626)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 메모리 펜스 릴리즈 명령(memory fence release instruction)을 발행한다. 단계(628)에서, 실행 유닛(310A)의 프라이머리 GPU 코어는 공유 메모리 섹션(410A)의 도어벨 레지스터(420)를 제2 값(예를 들어, '0')으로 세팅한다.
도 6c는 프로세스(500B)의 단계(506)에 의해 지정된 태스크를 실행하기 위한 프로세스(600B)의 일예의 플로우차트이다. 단계(642)에서, 실행 유닛(310A)의 GPU 코어(132)는 (단계(618)에서 할당된) 태스크 포션들 중 하나를 획득(obtain)한다. 단계(644)에서, GPU 코어(132)는 태스크 포션을 실행한다. 단계(646)에서, GPU 코어(132)는 공유 메모리 섹션(410A)의 태스크 레지스터에 완료 지시자(indicator)를 저장한다. 예를 들어, GPU 코어(132)가 성공적으로 태스크를 실행한 경우, GPU 코어(132)는 메모리 섹션(410) 태스크 레지스터 내 비트들 중 하나를 '1'로 설정할 수 있다. 다른 예로, GPU 코어(132)가 성공적으로 작업을 수행하지 못한 경우, GPU 코어(132)는 동일한 비트를 '0'으로 설정할 수 있다. 추가적으로 또는 대안적으로, 일부 구현들에서, GPU 코어(132)가 태스크를 성공적으로 실행하는 데 실패한 경우, GPU 코어(132)는 태스크 포션이 성공적으로 완료될 수 없는 이유를 식별하는 에러 코드를 태스크 레지스터에 저장할 수 있다. 본 일예에서 완료 표시기가 1-비트 크기(wide)지만, 완료 상태 지시자가 더 큰 크기를 갖는 대안적인 구현이 가능하다. 단계(648)에서, GPU 코어(132)는 실행 유닛(310A)의 동기화 배리어(320)가 배리어에 도달한 결과로서 대기 상태에 진입한다.
일부 구현들에서, 태스크가 완료될 때, 태스크의 완료 상태를 식별하는 워드(word)가 태스크 레지스터(430)(공유 메모리 섹션(410A)의)에 저장될 수 있다. 워드는 복수의 비트를 포함할 수 있다. 각각의 비트는 실행 유닛(310)의 다른 GPU 코어에 의해 태스크 레지스터에 저장될 수 있고, GPU 코어가 GPU 코어에 의해 실행된 태스크의 포션을 성공적으로 완료했는지 여부를 나타낼 수 있다. 비트가 '1'이면, GPU 코어가 작업의 해당 부분을 성공적으로 완료했음을 나타낼 수 있다. 그렇지 않고 비트가 '0'으로 세팅되면, GPU 코어가 태스크의 포션을 완료하지 못했음을 나타낼 수 있다. 따라서, 워드가 모두 '1'을 포함하는 경우, 이는 실행 유닛(310)에 의해 태스크가 성공적으로 완료되었음을 나타낼 수 있다. 대조적으로, 워드가 적어도 하나의 '0'을 포함하는 경우, 이는 태스크가 실행 유닛(310)에 의해 성공적으로 수행될 수 없음을 나타낼 수 있다. 도 1 내지 도 6c는 실행 유닛(310A)과 워커 쓰레드(220A) 사이에서 공유되는 유일한 메모리로서 공유 메모리 섹션(410A)을 도시하지만, 워커 쓰레드(220A)에 결과 데이터를 제공하는 데 사용되는 추가 메모리가 실행 유닛(310A)과 워커 쓰레드(220A) 사이에서 공유되는 대안적인 구현이 가능하다.
본 개시의 측면에 따르면, 메모리 펜스 획득 및 메모리 펜스 릴리즈 명령은, CPU(109)(및/또는 CPU(109)에서 실행되는 컴파일러)로 하여금 공유 메모리(410)의 도어벨 레지스트(420) 및 태스크 레지스터(430)에 데이터가 저장되는 순서를 강제하도록 하는 배리어 명령일 수 있다. 특히, 단계(604)에서 메모리 펜스 획득 명령을 발행하는 것은, (단계 602에서) 제1 값이 공유 메모리 섹션(410A)의 작업 레지스터(430)에 저장되기 전에, (단계(602)에서) 태스크가 공유 메모리 섹션(410A)의 태스크 레지스터(430)에 저장되었다는 것을 보장한다. 유사하게, 단계(626)에서 메모리 펜스 릴리즈 명령을 발행하는 것은, (단계 632에서) 공유 메모리 섹션(410A)의 도어벨 레지스터(420)가 제2 값으로 세팅되기 전에, (단계(624)에서) 태스크와 관련된 모든 완료 데이터가 공유 메모리 섹션(410A)의 태스크 레지스터(430)로 카피(copy) 되었다는 것을 보장한다. 본 개시에 따르면, (공유 메모리 섹션(410)의) 도어벨 및 태스크 레지스터에 대한 쓰기(writing)를 동기화하기 위해 메모리 펜스 명령어(아토믹 연산(atomic operations)과 반대됨)를 사용함으로써, 프로토콜(도 6a 내지 도 6c를 참조하여 설명되었음)의 오버헤드를 크게 감소시킬 수 있을 뿐 아니라, 태스크(단계(614)에서 획득된) 실행의 효율성을 개선한다는 점이 보여졌다.
일부 구현에서, 메모리 펜스 명령이 발행된 경우, 공유 메모리 섹션(410A)의 도어벨 레지스터(420)에서 제1 값(예를 들어, '1')을 보는 것은, 실행 유닛(310A)에 대해 유효한 태스크가 메모리 섹션(410)의 태스크 레지스터(430)에 존재함을 개런티(guarantee)할 수 있다. 유사하게, 메모리 펜스 릴리즈 명령이 발행되는 경우, 공유 메모리 섹션(410A)의 도어벨 레지스터(420)에서 두 번째 값(예: '0')을 보는 것은, CPU 코어(110A)(및/또는 워커 쓰레드(220A))에 대해 유효한 태스크가 메모리 섹션(410)의 태스크 레지스터(430)에 존재함을 개런티할 수 있다. 일부 구현에서, CPU 코어(110A)(및/또는 워커 쓰레드(220A))가 다수의 실행 유닛에 매핑되는 경우, CPU 코어(110A)(및/또는 워커 쓰레드(220A))는 태스크(단계(522)에서 획득됨)를 복수의 태스크(예로, 태스크 포션)로 분리하고, 실행 유닛(310) 중 서로 다른 하나로 각각의 태스크 포션을 실행할 수 있다(도 6a를 참조하여 논의된 방식으로).
도 5b 및 도 6a에 따르면, 단계(522)에서, 태스크가 큐(210A)로부터 리트리빙되고, 단계(602)에서, 태스크는 공유 메모리 섹션(410A)의 태스크 레지스터에 저장된다. 그러나, 단계(522) 및 단계(602)는 큐(210A)로부터 리트리빙된 동일한 데이터가 공유 메모리 섹션(410A)의 태스크 레지스터(430)에도 저장된다는 것만을 의미하는 것은 아니다. 예를 들어, 일부 구현에서, 하나 또는 그 이상의 제1 데이터 항목이 큐(210A)로부터 리트리빙될 수 있고(단계 522에서), 하나 또는 그 이상의 제2 데이터 항목이 태스크 레지스터(430)에 저장될 수 있다(단계 602에서). 이러한 구현에서, 제2 데이터 항목은 제1 데이터 항목과 동일하거나 다른 것일 수 있다. 추가적으로 또는 대안적으로, 일부 구현들에서, 제2 데이터 항목들 중 적어도 하나는 제1 데이터 항목들에 기초하여 적어도 부분적으로 생성될 수 있다.
일부 구현에서, 워크-스틸링 스케줄러(200)는 실행 유닛(310)의 태스크 레지스터(430)에 "연결해제(disconnect)" 옵코드(opcode)를 배치함으로써 실행 유닛(310) 중 하나 이상을 연결해제할 수 있다. "연결해제" 옵코드를 수신하면, 실행 유닛(및/또는 GPU(120)의 다른 하드웨어)의 프라이머리 GPU(132)는 워크-스틸링 스케줄러(200)로부터 실행 유닛을 분리할 수 있다.
본 개시는 워크-스틸링 스케줄러(200)에서 임의의 특정 병렬 처리 알고리즘을 사용하는 것에 제한되지 않는다. 이와 관련하여, 본 개시는 임의의 특정 컷오프 조건을 평가하는 것으로 제한되지 않는다는 것을 이해할 것이다(단계(524)에서). 비록 도 1 내지 도 6c의 일예는 워크-스틸링 스케줄러의 맥락에서 제시되었지만, 본 개시는 어떠한 특정 유형의 스케줄러에 제한되지 않는다.
여기에 설명된 프로세스는 도 1의 하드웨어 및 소프트웨어와 사용하는 것으로 제한되지 않는다; 프로세스들은 모든 컴퓨팅 또는 처리 환경과 컴퓨터 프로그램을 실행할 수 있는 모든 유형의 기계 또는 기계 세트에 적용 가능성(applicability)을 찾을 수 있다. 여기에 설명된 프로세스는 하드웨어, 소프트웨어, 또는 이 둘의 조합으로 구현될 수 있다. 여기에 설명된 프로세스는, 프로세서, 비일시적 기계 판독 가능 매체 또는 프로세서에 의해 판독 가능한 다른 제조 물품(휘발성 및 비휘발성 메모리 및/또는 스토리지 엘리먼트), 적어도 하나의 입력 장치, 및 하나 또는 그 이상의 출력 장치를 포함하는 프로그래머블 컴퓨터/기계 상에서 실행되는 컴퓨터 프로그램으로 구현될 수 있다. 프로그램 코드는, 여기에 설명된 프로세스 중 하나를 수행하고 출력 정보를 생성하도록, 입력 장치를 사용하여 입력된 데이터에 적용될 수 있다.
시스템은, 적어도 부분적으로, 데이터 처리 장치(예로, 프로그램 가능한 프로세서, 컴퓨터 또는 여러 컴퓨터)에 의한 실행 또는 그 작동 제어를 위해, 컴퓨터 프로그램 제품을 통해(예로, 비일시적 컴퓨터 판독 가능 매체와 같은 비일시적 기계 판독 가능 저장 매체에서) 구현될 수 있다. 이러한 각각의 프로그램은 컴퓨터 기반 시스템의 나머지와 함께 작동하기 위해 높은 수준의 절차적 또는 객체 지향 프로그래밍 언어로 구현될 수 있다. 그러나, 프로그램은 어셈블리, 기계어 또는 하드웨어 기술 언어(Hardware Description Language)로 구현될 수 있다. 언어는 컴파일된 언어 또는 해석된 언어일 수 있고, 독립 실행형 프로그램 또는 모듈, 컴포넌트, 서브루틴 또는 컴퓨팅 환경에서 사용하기에 적합한 다른 유닛을 포함하여 모든 형태로 배포될 수 있다. 컴퓨터 프로그램은 하나의 컴퓨터 또는 한 사이트의 여러 컴퓨터에서 실행되도록 배포되거나 여러 사이트에 배포되고 통신 네트워크에 의해 상호 연결될 수 있다. 컴퓨터 프로그램은 컴퓨터가 여기에 기재된 프로세스를 수행하기 위해 비일시적 기계 판독 가능 매체를 읽을 때 컴퓨터를 구성하고 운영하기 위해 범용 또는 특수 목적의 프로그래머블 컴퓨터가 읽을 수 있는 비일시적 기계 판독 가능 매체에 저장될 수 있다. 예를 들어, 여기에 기재된 프로세스는, 또한 컴퓨터 프로그램으로 구성된 비일시적 기계 판독 가능 저장매체로서 구현될 수 있고, 실행 시 컴퓨터 프로그램의 명령은 컴퓨터가 프로세스에 따라 작동하도록 한다. 비일시적 기계 판독 가능매체는 하드 드라이브, 콤팩트 디스크, 플래시 메모리, 비휘발성 메모리, 휘발성 메모리, 자기 디스켓 등을 포함할 수 있지만 이에 제한되지는 않고, 일시적인 신호 그 자체는 포함하지 않는다.
본 특허의 주제인 다양한 개념, 구조 및 기술을 예시하는 역할을 하는 바람직한 실시예를 설명했지만, 이제 이러한 개념, 구조 및 기술을 통합하는 다른 실시예가 사용될 수 있음이 명백해질 것이다. 따라서, 특허의 범위는 설명된 실시예에 제한되어서는 안 되고, 청구범위의 사상 및 범위에 의해서만 제한되어야 한다.

Claims (20)

  1. 중앙 처리 유닛(CPU) 및 그래픽 처리 유닛(GPU)를 구비한 컴퓨팅 시스템에서 사용 방법에 있어서,
    제1 메모리 포션(portion) 및 제2 메모리 포션을 (i) 상기 CPU 상에서 실행되는 워크-스틸링(work-stealing) 스케줄러(scheduler)의 워커(worker) 쓰레드(thread) 및 (ii) 상기 GPU의 일부분인 실행(execution) 유닛에 할당(assign)하는 단계;
    상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 단계;
    상기 워커 쓰레드에 의해, 상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 단계;
    상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 단계;
    상기 컷오프 조건이 만족된 경우, 상기 태스크에 대응하는 제1 데이터를 상기 제2 메모리 포션에 저장하는 단계 - 상기 제1 데이터는 상기 워커 쓰레드에 의해 상기 제2 메모리 포션에 저장됨 -;
    상기 제1 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)하는 단계; 및
    제1 값을 상기 제1 메모리 포션에 저장하는 단계 - 상기 제1 값은 상기 메모리 펜스 획득 명령이 발행된 이후 상기 워커 쓰레드에 의해 저장됨 -
    를 포함하고,
    상기 제1 값을 상기 제1 메모리 포션에 저장함으로 인해, 상기 실행 유닛이 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하고 상기 제1 데이터에 기초하여 상기 태스크를 실행하도록 하는,
    사용 방법.
  2. 제1항에 있어서,
    상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함하는,
    사용 방법.
  3. 제1항에 있어서,
    상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함하는,
    사용 방법.
  4. 제1항에 있어서,
    상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함하는,
    사용 방법.
  5. 제1항에 있어서,
    상기 실행 유닛에 의해 제2 값이 상기 제1 메모리 포션에 저장된 경우, 상기 태스크가 완료된 것을 검출하는 단계를 더 포함하고,
    상기 검출하는 단계는 상기 워커 쓰레드에 의해 수행되는,
    사용 방법.
  6. 제1항에 있어서,
    상기 제2 메모리 포션으로부터, 상기 실행 유닛에 의해 상기 태스크의 실행 결과로 생성된 제2 데이터를 리트리빙하는 단계를 더 포함하고,
    상기 제2 데이터는, 상기 실행 유닛에 의해 상기 제1 메모리 포션에 저장된 제2 값을 검출한 것에 응답하여, 상기 워커 쓰레드에 의해 리트리빙되는,
    사용 방법.
  7. 제1항에 있어서,
    상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하는 단계 - 상기 제1 데이터는, 상기 워커 쓰레드에 의해 상기 제1 메모리 포션에 저장된 제1 값을 검출한 것에 응답하여, 상기 실행 유닛에 의해 리트리빙됨 -; 및
    상기 태스크를 실행하는 단계 - 상기 태스크는 상기 제1 데이터에 기초하여 상기 실행 유닛에 의해 실행됨 -
    를 더 포함하는,
    사용 방법.
  8. 제7항에 있어서.
    상기 태스크의 실행 결과로 상기 실행 유닛에 의해 생성된 제2 데이터를 상기 제2 메모리 포션에 저장하는 단계;
    상기 제2 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 릴리즈 명령(memory fence release instruction)을 발행하는 단계; 및
    상기 태스크가 완료되었음을 나타내는 제2 값을 상기 제1 메모리 포션에 저장하는 단계 - 상기 제2 값은 상기 메모리 펜스 릴리즈 명령이 발행된 이후 상기 실행 유닛에 의해 저장됨 -
    를 더 포함하는.
    사용 방법.
  9. 시스템에 있어서,
    실행 유닛을 구비한 그래픽 처리 유닛(GPU);
    제1 메모리 포션(portion) 및 제2 메모리 포션을 구비한 랜덤 억세스 메모리(RAM);
    워크-스틸링(work-stealing) 스케줄러(scheduler)를 실행하도록 구성된 중앙 처리 유닛(CPU) - 상기 워크-스틸링 스케줄러는 워커 쓰레드(worker thread)를 구비하고, 워커 쓰레드는:
    상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 동작;
    상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 동작;
    상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 동작;
    상기 컷오프 조건이 만족된 경우, 상기 태스크에 대응하는 제1 데이터를 상기 제2 메모리 포션에 저장하는 동작;
    상기 제1 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)하는 동작; 및
    상기 메모리 펜스 획득 명령이 발행된 이후, 제1 값을 상기 제1 메모리 포션에 저장하는 동작
    을 수행하도록 구성되고,
    상기 제1 값을 상기 제1 메모리 포션에 저장함으로 인해, 상기 실행 유닛이 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하고 상기 제1 데이터에 기초하여 상기 태스크를 실행하도록 하는,
    시스템.
  10. 제9항에 있어서,
    상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함하는,
    시스템.
  11. 제9항에 있어서,
    상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함하는,
    시스템.
  12. 제9항에 있어서,
    상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함하는,
    시스템.
  13. 제9항에 있어서,
    상기 워커 쓰레드는,
    상기 실행 유닛에 의해 제2 값이 상기 제1 메모리 포션에 저장된 경우, 상기 태스크가 완료된 것을 검출하는 동작을 수행하도록 더 구성되는,
    시스템.
  14. 제9항에 있어서,
    상기 워커 쓰레드는,
    상기 제2 메모리 포션으로부터, 상기 실행 유닛에 의해 상기 태스크의 실행 결과로 생성된 제2 데이터를 리트리빙하는 동작을 수행하도록 더 구성되고,
    상기 제2 데이터는, 상기 실행 유닛에 의해 상기 제1 메모리 포션에 저장된 제2 값을 검출한 것에 응답하여 리트리빙되는,
    시스템.
  15. 제9항에 있어서.
    상기 실행 유닛은:
    상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하는 동작 - 상기 제1 데이터는, 상기 워커 쓰레드에 의해 상기 제1 메모리 포션에 저장된 제1 값을 검출한 것에 응답하여 리트리빙됨 -; 및
    상기 제1 데이터에 기초하여 상기 태스크를 실행하는 동작
    을 수행하도록 더 구성되는,
    시스템.
  16. 제15항에 있어서.
    상기 실행 유닛은:
    상기 태스크의 실행 결과로 상기 실행 유닛에 의해 생성된 제2 데이터를 상기 제2 메모리 포션에 저장하는 동작;
    상기 제2 데이터가 상기 제2 메모리 포션에 저장된 이후 메모리 펜스 릴리즈 명령(memory fence release instruction)을 발행하는 동작; 및
    상기 태스크가 완료되었음을 나타내는 제2 값을 상기 제1 메모리 포션에 저장하는 동작 - 상기 제2 값은 상기 메모리 펜스 릴리즈 명령이 발행된 이후 저장됨 -
    을 수행하도록 더 구성되는,
    시스템.
  17. 하나 또는 그 이상의 프로세서 실행가능한 명령어들을 저장하도록 구성된 비-일시적(non-transitory) 컴퓨터 판독가능 기록 매체에 있어서,
    적어도 하나의 프로세서에 의해 처리되는 경우, 상기 프로세서로 하여금 워커 쓰레드(worker thread)를 구비한 워크-스틸링(work-stealing) 스케줄러(scheduler)를 실행시키도록 하고, 상기 워커 쓰레드는 그래픽 처리 유닛(GPU)의 한 부분인 실행 유닛과 제1 메모리 포션 및 제2 메모리 포션을 공유하도록 배열되며, 상기 워커 쓰레드는:
    상기 워커 쓰레드와 연관된 큐(queue)로부터 태스크를 리트리빙(retrieve)하는 동작;
    상기 태스크의 컷오프(cutoff) 조건이 만족되었는지 여부를 검출(detect)하는 동작;
    상기 컷오프 조건이 만족되지 않은 경우, 상기 태스크를 두 개 또는 그 이상의 추가 태스크로 분리(divide)하고, 상기 두 개 또는 그 이상의 추가 태스크를 상기 큐에 추가하는 동작;
    상기 컷오프 조건이 만족된 경우, 상기 태스크에 대응하는 제1 데이터를 상기 제2 메모리 포션에 저장하는 동작;
    상기 제1 데이터가 상기 제2 메모리 포션 내에 저장된 이후, 메모리 펜스 획득 명령(memory fence acquire instruction)을 발행(issue)하는 동작; 및
    상기 메모리 펜스 획득 명령이 발행된 이후, 상기 제1 메모리 포션에 제1 값을 저장하는 동작
    을 수행하도록 배치되고,
    상기 제1 값을 상기 제1 메모리 포션에 저장함으로 인해, 상기 실행 유닛이 상기 제2 메모리 포션으로부터 상기 제1 데이터를 리트리빙하고 상기 제1 데이터에 기초하여 상기 태스크를 실행하도록 하는,
    컴퓨터 판독가능 기록 매체.
  18. 제17항에 있어서,
    상기 제1 메모리 포션은 도어벨(doorbell) 레지스터(register)를 포함하고, 상기 제2 메모리 포션은 태스크 레지스터를 포함하는,
    컴퓨터 판독가능 기록 매체.
  19. 제17항에 있어서,
    상기 실행 유닛은 다수의 GPU 코어(core) 및 상기 다수의 GPU 코어 사이에서 공유(share)되는 동기화 메커니즘(synchronization mechanism)을 포함하는,
    컴퓨터 판독가능 기록 매체.
  20. 제17항에 있어서,
    상기 제1 데이터는, 상기 태스크에 대응하는 하나 또는 그 이상의 옵코드(opcode) 및 상기 태스크를 실행하기 위한 아규먼트(argument)를 포함하는,
    컴퓨터 판독가능 기록 매체.
KR1020227029373A 2020-03-19 2021-03-01 협력 워크-스틸링 스케줄러 KR20220127326A (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US202062991871P 2020-03-19 2020-03-19
US62/991,871 2020-03-19
US17/152,021 2021-01-19
US17/152,021 US11340942B2 (en) 2020-03-19 2021-01-19 Cooperative work-stealing scheduler
PCT/US2021/020192 WO2021188287A1 (en) 2020-03-19 2021-03-01 Cooperative work-stealing scheduler

Publications (1)

Publication Number Publication Date
KR20220127326A true KR20220127326A (ko) 2022-09-19

Family

ID=77748143

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020227029373A KR20220127326A (ko) 2020-03-19 2021-03-01 협력 워크-스틸링 스케줄러

Country Status (6)

Country Link
US (1) US11340942B2 (ko)
EP (1) EP4121855A1 (ko)
JP (1) JP7450728B2 (ko)
KR (1) KR20220127326A (ko)
CN (1) CN114930292A (ko)
WO (1) WO2021188287A1 (ko)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11790590B2 (en) * 2021-03-31 2023-10-17 Advanced Micro Devices, Inc. Multi-accelerator compute dispatch
CN116339944B (zh) * 2023-03-14 2024-05-17 海光信息技术股份有限公司 任务处理方法、芯片、多芯片模块、电子设备和存储介质

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8854381B2 (en) * 2009-09-03 2014-10-07 Advanced Micro Devices, Inc. Processing unit that enables asynchronous task dispatch
US9645854B2 (en) 2010-12-15 2017-05-09 Advanced Micro Devices, Inc. Dynamic work partitioning on heterogeneous processing devices
CN106164881B (zh) 2013-03-15 2022-01-14 英特尔公司 异构计算系统中的工作窃取
US9361118B2 (en) * 2013-05-13 2016-06-07 Advanced Micro Devices, Inc. Method for memory consistency among heterogeneous computer components
KR101569093B1 (ko) * 2013-08-13 2015-11-13 삼성에스디에스 주식회사 분산 시스템에서 데이터를 처리하는 방법
GB2524085B (en) * 2014-03-14 2021-01-20 Advanced Risc Mach Ltd Exception handling in microprocessor systems
US9342384B1 (en) 2014-12-18 2016-05-17 Intel Corporation Function callback mechanism between a central processing unit (CPU) and an auxiliary processor
EP3079060B1 (en) 2015-04-08 2018-03-28 Huawei Technologies Co., Ltd. Load balancing for large in-memory databases
US9703605B2 (en) * 2015-09-04 2017-07-11 Mediatek, Inc. Fine-grained heterogeneous computing
US10360063B2 (en) 2015-09-23 2019-07-23 Qualcomm Incorporated Proactive resource management for parallel work-stealing processing systems
JP6988040B2 (ja) 2016-12-31 2022-01-05 インテル・コーポレーション ヘテロジニアスコンピューティングのためのシステム、方法及び装置
US10545244B2 (en) * 2017-06-15 2020-01-28 Microsoft Technology Licensing, Llc Cloud-offloaded position calculation with on-device acquisition
US10474490B2 (en) 2017-06-29 2019-11-12 Advanced Micro Devices, Inc. Early virtualization context switch for virtualized accelerated processing device

Also Published As

Publication number Publication date
WO2021188287A1 (en) 2021-09-23
US11340942B2 (en) 2022-05-24
JP7450728B2 (ja) 2024-03-15
CN114930292A (zh) 2022-08-19
JP2023509780A (ja) 2023-03-09
US20210294648A1 (en) 2021-09-23
EP4121855A1 (en) 2023-01-25

Similar Documents

Publication Publication Date Title
Chen et al. GFlink: An in-memory computing architecture on heterogeneous CPU-GPU clusters for big data
JP5934094B2 (ja) データ並列スレッドを有する処理論理の複数のプロセッサにわたるマッピング
US8640140B2 (en) Adaptive queuing methodology for system task management
Vajda Programming many-core chips
Kumar et al. Habaneroupc++ a coMPIler-free pgas library
US9354892B2 (en) Creating SIMD efficient code by transferring register state through common memory
KR20220127326A (ko) 협력 워크-스틸링 스케줄러
WO2017127180A1 (en) Random-access disjoint concurrent sparse writes to heterogeneous buffers
Chen et al. Exploring fine-grained task-based execution on multi-GPU systems
CN111164580B (zh) 用于缓存一致性的可重构的缓存架构及方法
WO2014170036A1 (en) Method and apparatus for exploiting data locality in dynamic task scheduling
JP2021034023A (ja) アクセラレータにおいてヘテロジニアスコンポーネントを設定する方法及び装置
JP2024500779A (ja) アドレスマッピング認識型タスク処理機構
Nomizu et al. Implementation of xcalablemp device acceleration extention with opencl
US8387009B2 (en) Pointer renaming in workqueuing execution model
Hoffmann et al. Dynamic task scheduling and load balancing on cell processors
US8914778B2 (en) Data placement for execution of an executable
Garg et al. Share-a-GPU: Providing simple and effective time-sharing on GPUs
Falt et al. Towards Efficient Locality Aware Parallel Data Stream Processing.
Bhimani et al. Design space exploration of GPU Accelerated cluster systems for optimal data transfer using PCIe bus
US9547522B2 (en) Method and system for reconfigurable virtual single processor programming model
Liang et al. Automatically Migrating Sequential Applications to Heterogeneous System Architecture
CN117331669A (zh) 基于锁语义实现应用透明的动态处理器缓存分区调度方法和系统
Scherger A gentle introduction to the associative computing (ASC) model of parallel computation
JPS5922155A (ja) マルチ・プロセツサ・システムの排他制御方法

Legal Events

Date Code Title Description
E902 Notification of reason for refusal