KR20180053359A - 다중-버전형 태스크들의 효율적 스케줄링 - Google Patents

다중-버전형 태스크들의 효율적 스케줄링 Download PDF

Info

Publication number
KR20180053359A
KR20180053359A KR1020187010433A KR20187010433A KR20180053359A KR 20180053359 A KR20180053359 A KR 20180053359A KR 1020187010433 A KR1020187010433 A KR 1020187010433A KR 20187010433 A KR20187010433 A KR 20187010433A KR 20180053359 A KR20180053359 A KR 20180053359A
Authority
KR
South Korea
Prior art keywords
task
versioned
processing unit
processor
version
Prior art date
Application number
KR1020187010433A
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 KR20180053359A publication Critical patent/KR20180053359A/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
    • 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/5038Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
    • 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/5061Partitioning or combining of resources
    • G06F9/5066Algorithms for mapping a plurality of inter-dependent sub-tasks onto a plurality of physical CPUs
    • 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/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Abstract

다중-프로세서 컴퓨팅 디바이스가 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하기 위한 방법들, 디바이스들, 시스템들, 및 비-일시적 프로세서-판독가능 저장 매체들. 일 실시형태의 방법은, 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 것으로서, 각각의 특수화된 버전은 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성되는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 것, 제 1 프로세싱 유닛이 다중-버전형 태스크의 대응하는 특수화된 버전을 즉시 실행하기 위해 이용가능한 경우에, 제 1 프로세싱 유닛에게 다중-버전형 태스크에 대한 소유권을 제공하는 것, 및, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 제공하는 것에 응답하여, 다중-버전형 태스크의 다른 특수화된 버전들을 폐기하는 것을 위한 프로세서-실행가능 동작들을 포함할 수도 있다. 방법의 다양한 동작들은 런타임 기능을 통해 수행될 수도 있다.

Description

다중-버전형 태스크들의 효율적 스케줄링
병렬적 프로그래밍은 반응적 그리고 고 성능 소프트웨어를 제공하기 위해 컴퓨팅 디바이스들이 계산들을 (태스크들로서 지칭되는) 작업의 작은 덩어리들로 쪼개기 위한 기법이다. 다중-코어 또는 다중-프로세서 컴퓨팅 디바이스 (예컨대, 이종 시스템-온-칩 (SOC)) 에서, 상이한 태스크들이 디바이스의 여러 프로세싱 유닛들에 할당 (또는 오프로딩) 될 수도 있고, 일부 태스크들은 태스크 종속성들로 인해 다른 것들이 종료된 후에 실행되도록 명시된다. 통상적으로, 런타임 엔진 (또는 태스크 스케줄러) 은 어느 프로세싱 유닛에 태스크가 할당될지를 결정하고, 이러한 결정들은 통상적으로 다양한 디바이스, 프로세싱 유닛, 및/또는 태스크 특성들 또는 조건들에 기초할 수도 있다.
일부 태스크들은 특정 프로세싱 유닛들에 지향되거나 그것들을 위해 설계될 수도 있다. 예를 들어, 제 1 태스크는 중앙 프로세싱 유닛 (CPU) 에 의한 실행을 위해 설계될 수도 있고, 제 2 태스크는 그래픽 프로세싱 유닛 (GPU) 상에서의 실행을 위해 설계될 수도 있으며, 제 3 태스크는 디지털 신호 프로세서 (DSP) 상에서의 실행을 위해 설계될 수도 있다. 상이한 프로세싱 유닛들을 위한 태스크들은 종종 상이한 프로그래밍 언어들로 또는 상이한 명세들을 이용하여 쓰여진다. 예를 들어, CPU 태스크로서 벡터 덧셈 계산을 구현하기 위한 코드 및 GPU 태스크로서 행렬 곱셈 계산을 구현하기 위한 코드는 상이한 언어들 및/또는 신택스 (syntax) 를 이용할 수도 있다. 컴퓨팅 디바이스에서 상이한 프로세싱 유닛들을 활용하기 위해서는, 공통의 일반-목적 태스크들의 상이한 버전들이 동시에 지원될 수도 있다. "다중-버전형" 태스크는 동일한 논리적 함수 또는 루틴의 다중 구현들과 연관되거나 그 외에 포함할 수도 있고, 각각의 구현은 특정 프로세싱 유닛에 의한 실행을 위해 특수화된다. 예를 들어, 벡터 덧셈 계산은 CPU 태스크 및 GPU 태스크로서 구현될 수도 있고, 이 양자는 상이한 언어들 및/또는 신택스를 이용한다.
다양한 실시형태들은, 다중-프로세서 컴퓨팅 디바이스가 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하기 위한 방법들, 디바이스들, 시스템들, 및 비-일시적 프로세서-판독가능 저장 매체들을 제공한다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스의 프로세서에 의해 수행되는 방법은, 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐 (task queue) 에서 다중-버전형 태스크 (multi-versioned task) 의 특수화된 버전 (specialized version) 을 인큐잉 (enqueuing) 하는 단계로서, 여기서, 각각의 특수화된 버전은 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성될 수도 있는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 단계, 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권 (ownership) 을 제공하는 단계로서, 여기서, 제 1 프로세싱 유닛은, 복수의 프로세싱 유닛들의 다른 프로세싱 유닛들이 다중-버전형 태스크의 다른 특수화된 버전들을 실행하기 위해 이용가능하기 전에, 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능할 수도 있는, 상기 다중-버전형 태스크에 대한 소유권을 제공하는 단계, 및, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 제공하는 것에 응답하여, 다중-버전형 태스크의 다른 특수화된 버전들을 폐기하는 단계를 포함할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 복수의 프로세싱 유닛들을 스케줄링하도록 구성된 런타임 기능 (runtime functionality) 을 실행하고 있을 수도 있다.
일부 실시형태들에서, 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 것은, 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전과 연관된 포인터를 인큐잉하는 것을 포함할 수도 있다. 일부 실시형태들에서, 각 포인터는 다중-버전형 태스크 및 다중-버전형 태스크의 특수화된 버전의 표시를 포함할 수도 있다. 일부 실시형태들에서, 다중-버전형 태스크의 특수화된 버전의 표시는 각 포인터의 최하위 4 비트들에 포함될 수도 있다. 일부 실시형태들에서, 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 제공하는 것은, 다중-버전형 태스크와 연관하여 데이터를 저장하는 것을 포함할 수도 있다.
일부 실시형태들은, 제 1 프로세싱 유닛의 태스크 큐로부터의 다음 태스크가 다중-버전형 태스크와 연관되는지 여부를 결정하는 것, 및, 다음 태스크가 다중-버전형 태스크와 연관된다고 결정하는 것에 응답하여, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 요청하는 것을 더 포함할 수도 있다. 일부 실시형태들은, 소유권을 요청하는 것에 응답하여, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 획득하는 것, 및, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 획득하는 것에 응답하여, 다음 태스크를 실행하는 것을 더 포함할 수도 있다. 일부 실시형태들에서, 제 1 프로세싱 유닛의 태스크 큐로부터의 다음 태스크가 다중-버전형 태스크와 연관되는지 여부를 결정하는 것은, 제 1 프로세싱 유닛의 태스크 큐로부터의 포인터에 대해 비트 마스크를 적용함으로써 식별자를 획득하는 것, 및, 식별자가 다중-버전형 태스크의 제 1 특수화된 버전에 대응한다고 결정하는 것에 응답하여, 다음 태스크가 다중-버전형 태스크와 연관된다고 결정하는 것을 포함할 수도 있다.
일부 실시형태들에서, 제 1 프로세싱 유닛의 태스크 큐로부터의 다음 태스크가 다중-버전형 태스크와 연관되는지 여부를 결정하는 것은, 제 1 프로세싱 유닛의 태스크 큐로부터의 포인터를 취출하는 것으로서, 이 포인터는 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 배치된 공통 다중-버전형 태스크 포인터인, 상기 포인터를 취출하는 것, 포인터가 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관되는지 여부를 결정하는 것, 및, 포인터가 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관된다고 결정하는 것에 응답하여, 다중-버전형 태스크의 특수화된 버전들의 리스트로부터 다중-버전형 태스크의 제 1 특수화된 버전을 식별하는 것으로서, 제 1 특수화된 버전은 제 1 프로세싱 유닛에 의해 실행될 다음 태스크일 수도 있는, 상기 다중-버전형 태스크의 제 1 특수화된 버전을 식별하는 것을 포함할 수도 있다.
일부 실시형태들은, 다음 태스크가 다중-버전형 태스크와 연관되지 않는다고 결정하는 것에 응답하여, 다음 태스크를 실행하는 것을 더 포함할 수도 있다. 일부 실시형태들은, 제 1 프로세싱 유닛에 대해 소유권을 요청하는 것에 응답하여, 다중-버전형 태스크에 대한 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 것, 및, 다중-버전형 태스크에 대한 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 것에 응답하여, 다음 태스크를 폐기하는 것을 더 포함할 수도 있다. 일부 실시형태들은, 제 1 프로세싱 유닛과 연관된 태스크 큐 내에 우선순위 태스크가 존재하는지 여부를 결정하는 것, 및, 제 1 프로세싱 유닛을 통해, 우선순위 태스크를 실행하는 것을 더 포함할 수도 있고, 여기서, 다음 태스크가 다중-버전형 태스크와 연관된다고 결정하는 것에 응답하여, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 요청하는 것은, 우선순위 태스크를 실행하는 것에 응답하여, 제 1 프로세싱 유닛에 대해 다중-버전형 태스크에 대한 소유권을 요청하는 것을 포함할 수도 있다. 일부 실시형태들에서, 프로세서는 제 1 프로세싱 유닛일 수도 있다.
추가적인 실시형태들은 상기 설명된 방법들의 동작들을 수행하기 위한 프로세서-실행가능 명령들로 구성된 컴퓨팅 디바이스를 포함한다. 추가적인 실시형태들은 상기 설명된 방법들의 동작들을 수행하기 위한 수단을 포함하는 컴퓨팅 디바이스를 포함한다. 추가적인 실시형태들은 컴퓨팅 디바이스로 하여금 상기 설명된 방법들의 동작들을 수행하게 하도록 구성된 프로세서-실행가능 명령들이 그 위에 저장된 비-일시적 프로세서-판독가능 매체를 포함한다.
본원에 통합되고 이 명세서의 일부를 구성하는 첨부 도면들은 예시적인 실시형태들을 나타내고, 상기 주어진 일반적인 설명 및 이하에서 주어지는 상세한 설명과 함께, 청구항들의 특징들을 설명하는 기능을 한다.
도 1 은 다양한 실시형태들에서 사용하기에 적합한 예시적인 다중-프로세서 컴퓨팅 디바이스 (예컨대, 이종 시스템-온-칩 (SoC)) 의 프로세싱 유닛들 및 태스크 큐들을 나타내는 컴포넌트 블록도이다.
도 2a 및 도 2b 는 다중-버전형 태스크의 특수화된 버전들의 종래의 조기-결합을 나타내는 컴포넌트 블록도들이다.
도 3a 내지 도 3c 는 다양한 실시형태들에 따른, 다중-프로세서 컴퓨팅 디바이스에 의한 다중-버전형 태스크의 특수화된 버전들의 예시적인 늦은-결합을 나타내는 컴포넌트 블록도들이다.
도 4a 는 다중-버전형 태스크들의 특수화된 버전들을 스케줄링하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 일 실시형태의 방법을 나타내는 프로세스 흐름도이다.
도 4b 는 다중-버전형 태스크들의 수행을 관리하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 일 실시형태의 방법을 나타내는 프로세스 흐름도이다.
도 5a 및 도 5b 는 다양한 실시형태들에 따른, 다중-버전형 태스크들의 특수화된 버전들을 생성 및 스케줄링 (또는 디스패치) 하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 루틴들을 위한 의사코드를 나타내는 도면들이다.
도 6 은 다양한 실시형태들에 따른, 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 일 실시형태의 방법을 나타내는 프로세스 흐름도이다.
도 7 은 다양한 실시형태들에 따른, 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 루틴들을 위한 의사코드를 나타내는 도면이다.
도 8 은 다중-버전형 태스크들의 특수화된 버전들 및 우선순위 태스크들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 일 실시형태의 방법을 나타내는 프로세스 흐름도이다.
도 9 는 일부 실시형태들에서 사용하기에 적합한 다중-프로세서 컴퓨팅 디바이스의 컴포넌트 블록도이다.
다양한 실시형태들이 첨부 도면들을 참조하여 상세하게 설명될 것이다. 가능하면, 동일한 참조 부호들은 동일 또는 유사한 부분들을 지칭하도록 도면들 전체에 걸쳐 사용될 것이다. 특정 예들 및 구현들에 대해 이루어진 언급들은 예시적인 목적들을 위한 것이고, 실시형태들 또는 청구항들의 범위를 제한하도록 의도되지 아니한다.
"예시적인" 이라는 단어는 본 명세서에서 "예, 실례, 또는 예시로서 기능하는" 것을 의미하기 위해 사용된다. "예시적인" 것으로서 본 명세서에서 설명된 임의의 구현은 다른 구현들에 비해 선호되거나 이로운 것으로서 반드시 해석될 필요는 없다.
"컴퓨팅 디바이스" 라는 용어는 적어도 하나의 프로세서가 구비된 전자 디바이스를 지칭하기 위해 본 명세서에서 사용된다. 컴퓨팅 디바이스들의 예들은, 모바일 디바이스들 (예컨대, 셀룰러 전화기들, 웨어러블 디바이스들, 스마트-폰들, 웹-패드들, 태블릿 컴퓨터들, 인터넷 가능 셀룰러 전화기들, Wi-Fi® 가능 전자 디바이스들, 퍼스널 디지털 어시스턴트 (PDA) 들, 랩톱 컴퓨터들 등), 퍼스널 컴퓨터들, 및 서버 컴퓨팅 디바이스들을 포함할 수도 있다. 다양한 실시형태들에서, 컴퓨팅 디바이스들은, 광역 네트워크 (WAN) 접속 (예컨대, 셀룰러 네트워크 접속 등) 및/또는 로컬 영역 네트워크 (LAN) 접속 (예컨대, Wi-Fi® 라우터를 통한 인터넷에 대한 유선/무선 접속 등) 을 확립하도록 구성된 네트워크 트랜시버(들) 및 안테나(들)와 같은, 다양한 메모리 및/또는 데이터 스토리지 및 네트워킹 능력들로 구성될 수도 있다.
"다중-프로세서 컴퓨팅 디바이스" 라는 용어는 2 개 이상의 프로세싱 유닛들로 구성된 컴퓨팅 디바이스들을 지칭하기 위해 본 명세서에서 사용된다. 다중-프로세서 컴퓨팅 디바이스들은 2 개 이상의 프로세싱 유닛들을 이용하여 다양한 태스크들 (예컨대, 루틴들, 함수들, 계산들, 명령 셋트들 등) 을 실행할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는, 특수화된 및/또는 일반-목적 작업부하들을 수행하도록 각각 구성된 상이한 프로세싱 유닛들을 갖는 이종 컴퓨팅 디바이스 (예컨대, 시스템-온-칩 (SoC)) 일 수도 있다. 이러한 프로세싱 유닛들은 다양한 프로세서 디바이스들, 코어, 복수의 코어들 등을 포함할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛들은 애플리케이션 프로세서(들) (예컨대, CPU) 및/또는 GPU 및 DSP 와 같은 특수화된 프로세싱 디바이스들을 포함할 수도 있고, 이들 중 임의의 것은 하나 이상의 내부 코어들을 포함할 수도 있다.
다양한 실시형태들은, 다중-프로세서 컴퓨팅 디바이스에 의해 다중-버전형 태스크들의 특별한 (또는 특수화된) 버전들을 효율적으로 스케줄링하기 위한 방법들, 디바이스들, 시스템들, 및 비-일시적 프로세서-판독가능 저장 매체들을 제공한다. 다양한 실시형태들의 개관으로서, 다중-버전형 태스크 (예컨대, 하나보다 많은 지원된 구현 또는 버전을 갖는 일반-목적 태스크) 가 실행되려고 할 때, 다중-버전형 태스크의 특수화된 버전이 각각의 지원되는 프로세싱 유닛 (예컨대, CPU, GPU, DSP 등) 에 대해 인큐잉될 수도 있다. 예를 들어, 행렬 곱 일반-목적 태스크의 다중 버전들이 CPU 및 GPU 와 함께 사용하기 위해 이용가능한 경우에, 컴퓨팅 디바이스는 CPU 의 태스크 큐에서 CPU 특수화된 버전을 인큐잉하고 그 뿐만 아니라 GPU 의 태스크 큐에서 GPU 특수화된 버전을 인큐잉할 수도 있다. 이러한 인큐잉은 지원되는 버전을 갖는 각각의 프로세싱 유닛에 대한 태스크 큐에서 포인터 (예컨대, 다중-버전의 태스크 및 특수화된 버전 양자를 나타내는 포인터) 를 배치하는 것을 포함할 수도 있다. 프로세싱 유닛들이 대응하는 태스크 큐들 내에서 태스크들을 실행함에 따라, 결국 제 1 프로세싱 유닛은 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능하게 될 수도 있다. 제 1 프로세싱 유닛은, 다중-버전형 태스크에 대한 소유권을 요청하기 위한 애플리케이션 프로그래머 인터페이스 (API) 호출을 만드는 등에 의해, 다중-버전형 태스크에 대한 소유권을 획득할 수도 있다. 일단 제 1 프로세싱 유닛에 의해 획득되고 나면, 특별한 다중-버전형 태스크에 대한 소유권을 후속하여 요청하는 임의의 다른 프로세싱 유닛은 소유권을 받지 못할 수도 있고, 따라서, 다중-버전형 태스크의 대응하는 특수화된 버전들을 실행하지 못할 수도 있다. 대신에, 이들 다른 프로세싱 유닛들은 특수화된 버번 포인터들을 단순히 디큐잉 및 폐기하고, 대기함이 없이 다른 태스크들을 프로세싱하는 것으로 진행할 수도 있다.
제 1 프로세싱 유닛에 의해 소유된 다중-버전형 태스크로, 다중-프로세서 컴퓨팅 디바이스는, 프로세싱 유닛이 제 1 특수화된 버전의 실행을 완료한 후에 마치도록 다중-버전형 태스크를 구성할 수도 있다. 예를 들어, 제 1 프로세싱 유닛은 "finish_after()" API 호출을 실행할 수도 있다. 이러한 "피니쉬 애프터" 동작은, 다중-버전형 태스크가, 제 1 프로세싱 유닛이 제 1 특수화된 버전의 실행을 마치는 것에 응답하여 끝나는 것으로서 다중-버전형 태스크가 마킹되는 것을 보장할 수도 있다. 이것은, 다중-버전형 태스크의 모든 버전들의 태스크 종속성들, 대기들, 및 수명이 함께 묶이는 것을 보장할 수도 있다. 달리 말하면, 주 다중-버전형 태스크는 하나의 특수화된 버전의 완료에 의해 자동적으로 충족될 수도 있다. 이러한 식으로, 다중-버전형 태스크들이 특수화된 버전들을 실제로 실행하기 위해 이용가능할 가장 빠른 프로세싱 유닛들에 의해 완료되는 것을 허용하기 위해 "늦은-결합 (late-binding)" 기법들이 제공된다.
일부 구현들에서, 프로세싱 유닛들의 태스크 큐들에서 특수화된 버전들의 임의의 표시를 명시적으로 배치할 필요성이 없을 수도 있다. 대신에, 다중-프로세서 컴퓨팅 디바이스는, 다중-버전형 태스크에 의해 지원되는 모든 프로세싱 유닛들 (다중-버전형 태스크의 특수화된 버전들이 존재하는 모든 프로세싱 유닛들) 의 태스크 큐들에서 공통의 다중-버전형 태스크 포인터를 배치함으로써 다중-버전형 기법들을 구현할 수도 있다. 예를 들어, DSP 는 태스크 포인터를 디큐잉할 수도 있고, 태스크에 대한 소유권을 획득할 수도 있다. DSP 는, 태스크가 대안들을 가지는지 여부 (즉, 태스크의 하나보다 많은 특수화된 버전들이 존재하는지 여부) 를 체크할 수도 있다. 대안들이 존재하는 경우에, 태스크는 다중-버전형 태스크로서 식별될 수도 있고, DSP 는 다중-버전형 태스크의 대안들 (또는 특수화된 버전들) 의 리스트를 스캔하고, DSP 들에 대해 대응하는 특수화된 버전을 실행할 수도 있다.
일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는, 실행될 태스크가 다중-버전형 태스크인지 여부를 결정하는 알고리즘을 수행할 수도 있다. 태스크가 다중-버전형 태스크가 아닌 경우에, 태스크는 통상적인 실행을 위해 프로세싱 유닛들의 태스크 큐에서 인큐잉될 수도 있다. 하지만, 태스크가 다중-버전형 태스크인 경우에, 다중-프로세서 컴퓨팅 디바이스는, 모든 지원되는 (또는 요청된) 다중-버전형 태스크의 특수화된 버전들 (예컨대, GPU, CPU, DSP 등을 위한 것) 을 위해 포인터들을 생성하고, 적절한 프로세싱 유닛들에 대응하는 태스크 큐들에서의 포인터들을 배치할 수도 있다. 예를 들어, 행렬 곱 태스크의 DSP 버전에 대한 포인터는 DSP 의 태스크 큐 내로 진입될 수도 있는 등이다. 일부 경우들에서, 프로세싱 유닛 아이덴티티들 또는 다른 버전 연관들은 포인터의 최하위 네 (4) 비트들에서 코어 식별자 (ID) 들을 인코딩하는 것과 같이, 포인터들 그 자체들 내에 저장될 수도 있다. 일부 실시형태들에서, 다중-버전형 태스크가 실행을 위해 론칭될 때, 그것이 준비될 때 (예컨대, 그것이 먼저것 종속성들을 가지지 않을 때) 또는 그것이 스케줄링 최적화들을 받는 경우에 더 일찍 중 어느 일방으로 태스크가 스케줄링을 위해 고려될 수도 있다.
일부 실시형태들에서, 다중-버전형 태스크는, 다중-버전형 태스크의 특수화된 버전들을 실행할 수도 있는 태스크, 인수들, 및 잠재적 프로세싱 유닛들 (예컨대, 코어들) 을 나타내는 API 호출을 통해 생성될 수도 있다. 다중-버전형 태스크는 프로그래머, 컴파일러, 또는 런타임 시스템에 의해 생성될 수도 있다. 일부 실시형태들에서, 특수화된 버전들이 API 호출에서 제시되는 순서는 상대적인 우선권 또는 우선순위를 나타낼 수도 있다. 이러한 API 호출에서의 각각의 특수화된 버전 (또는 구현) 을 위해, 다중-프로세서 컴퓨팅 디바이스는 (예컨대, 런타임 기능성을 통해), 지원되는 프로세싱 유닛의 태스크 큐에서 인큐잉될 태스크 (또는 태스크 포인터) 를 생성할 수도 있다. 예를 들어, CPU 또는 GPU 중 어느 일방에 의한 실행을 위해 재단되는 행렬 곱 태스크의 특수화된 버전들은, API 호출이 코드 내의 프로그래머에 의해 또는 컴파일러/런타임 시스템에 의해 유발되는 것에 응답하여, 적절한 태스크 큐들에서 인큐잉될 수도 있다.
다양한 실시형태들에서, 특정 프로세싱 유닛은 스레드 풀 (thread pool) 에서의 연관된 스레드를 통해, 인큐잉된 태스크들 (또는 태스크 포인터들) 을 프로세싱하도록 구성될 수도 있다. 예를 들어, DSP 스레드는 DSP 의 태스크 큐로부터 다중-버전형 태스크의 특수화된 버전에 대한 포인터를 디큐잉할 수도 있다. 다음은 이러한 스레드에 의한 동작들의 비제한적 예시이다. DSP 와 연관된 스레드는, 포인터 비트들 내의 임의의 버전 넘버들을 식별하기 위해 마스크를 적용하는 등에 의해, 디큐잉된 태스크들 (또는 포인터들) 이 다중-버전형 태스크들과 연관되는지 또는 아닌지 여부를 결정하기 위한 동작들을 수행할 수도 있다. 디큐잉된 태스크가 다중-버전형 태스크에 관련되지 않는 경우에, DSP 를 위한 스레드는 디큐잉된 태스크를 단순히 실행할 수도 있다. 하지만, 디큐잉된 태스크 (또는 포인터) 가 다중-버전형 태스크에 관련되는 경우에, DSP 스레드는 다중-버전형 태스크에 대한 소유권을 요청할 수도 있고, 따라서, 임의의 다른 스레드가 이미 다중-버전형 태스크에 대한 소유권을 획득하였는지 여부를 알 수도 있다. 소유권이 획득되는 경우에, DSP 스레드는, DSP 와 연관된 특수화된 버전 태스크의 실행 후에 마치도록 다중-버전형 태스크를 설정 (또는 다중-버전형 태스크가 설정되도록 요청) 할 수도 있고, 그 특수화된 버전을 실행할 수도 있다. 디큐잉된 태스크가 다중-버전의 것이지만 소유권이 스레드에 의해 획득될 수 없는 경우에, DSP 스레드는 단순히 디큐잉된 태스크 (예컨대, 태스크를 위한 디큐잉된 태스크 포인터) 를 폐기하고, DSP 스레드와 연관된 태스크 큐들에서 임의의 다른 태스크들을 프로세싱할 수도 있다.
다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛들은 각각 선천적으로 특정 타입들의 태스크들과 연관될 수도 있다. 예를 들어, GPU 는 터치 스크린 등 상에 디스플레이될 수도 있는 그래픽을 렌더링하기 위한 동작들을 수행하기 위해 SoC 모바일 디바이스 내에서 주로 사용될 수도 있다. 병렬적 프로세싱 스케줄링 (scheduling) 등으로 인해, 프로세싱 유닛들이 선천적인 (native) 동작들을 적절하게 우선순위화하는데 실패하는 경우에, 컴퓨팅 디바이스의 주 기능들은 고통받을 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛은, 다중-버전형 태스크들의 임의의 특수화된 버전들 전체 실행되어야 하는 임의의 우선순위 태스크들을 식별하기 위해 태스크 큐 내의 태스크들을 평가하도록 구성될 수도 있다. 예를 들어, 비록 GPU 에서 디큐잉되고 실행될 다음 태스크가 행렬 곱 태스크의 일 버전일 수도 있지만, GPU 는 큐에서 버전 태스크 뒤에 있는 태스크를 높은-우선순위 렌더링/디스플레이를 먼저 실행할 수도 있다. 이러한 방식으로, 프로세싱 유닛이 우선순위 태스크를 실행함에 따라 다른 프로세싱 태스크가 다중-버전형 태스크를 위해 이용가능하게 될 수도 있음에 따라, 프로세싱 유닛이 다중-버전형 태스크의 특수화된 버전에 대한 소유권을 획득할 기회를 상실할 가능성이 있을 수도 있다. 예를 들어, DSP 는 다중-버전형 태스크에 대한 소유권을 획득할 수도 있는 한편, GPU 는 다중-버전형 태스크에 대한 소유권을 요청하는 것 전에 디스플레이 동작을 완료한다. 일반-목적 다중-버전형 태스크들에 비해 선천적 작업부하들을 우선순위화함으로써, 프로세싱 유닛들은, 다중-버전형 태스크들을 실행하기 위해 여전히 경쟁하면서, 우선순위의, 선천적인 능력들 (예컨대, 렌더링, 신호 프로세싱 등) 을 유지할 수도 있다.
본 명세서에서 설명된 "늦은-결합" 스케줄링 기법들은 할당 시간에서 프로세싱 유닛들 상에서 상대적인 부하를 액세스하지 않고, 따라서, 다중-버전형 태스크에 대해 얻기에 실제로 가장 빠른 프로세싱 유닛이 태스크의 대응하는 버전을 실행하게 되는 것을 보장한다. 예를 들어, 비록 DSP 의 태스크 큐가 제 1 시간에서 GPU 보다 더 적은 인큐잉된 작업 항목들을 갖는 경우에도, 실시형태의 기법들을 구현하는 다중-프로세서 컴퓨팅 디바이스는 더 빠른 GPU 가 제 2 시간에서 다중-버전형 태스크의 대응하는 특수화된 버전을 실행하도록 허용할 수도 있다. 따라서, 실시형태의 기법들은 다중-프로세서 컴퓨팅 디바이스의 자원 소모 (예컨대, 메모리, 프로세싱 유닛들 등), 부하-균형, 및 열적 관리의 전체적인 효율성을 향상시키기 위해 유익하다. 예를 들어, 다중-버전형 태스크들의 버전들에 대해 늦은-결합을 제공함으로써, 실시형태의 기법들은 다중-프로세서 컴퓨팅 디바이스에서의 실행들을 위한 핫스팟들을 감소시키고, 어떤 개별적 프로세싱 유닛도 불균형적으로 과도하게 작업하지 않을 수도 있음에 따라 총 컴퓨팅 시스템에서의 더 높은 프로세싱을 허용할 수도 있다.
프로세싱 유닛들로 하여금 즉시적 실행을 시작하기 위해 실제로 이용가능할 때에만 일반-목적의, 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위한 권한을 획득하는 것을 가능하게 함으로써, 실시형태의 기법들은 태스크들의 적기 스케줄링을 제공한다. 이러한 방식에서, 실시형태의 기법들은 매 다중-버전형 태스크를 실행시키기 위해 최선의 프로세싱 유닛을 식별하기 위해 잠재적으로 부정확한 그리고 비용이 많이 드는 계산들 및/또는 측정들에 의존하지 않는다. 대신에, 프로세싱 유닛들은 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위해 경쟁하도록 구성되고, 이에 의해, 태스크들을 실행하는 것을 시작하기 위한 실제 능력에 기초하여 컴퓨팅 디바이스 전체에 걸쳐 작업 부하들을 퍼뜨린다. 이러한 기법들은 자연히, 통상적인 다중-버전 스케줄링 방식들과 함께 고려될 수도 있고 고려되지 않을 수도 있는 예기치않은 동작 조건들을 고려하고, 더 큰 성능, 더 낮은 에너지 소모, 및 더 낮은 메모리 소모를 초래한다.
실시형태의 기법들은, 태스크가 어느 프로세싱 유닛에 할당될 수도 있는지를 고르기 위해 프로세싱 유닛들의 작업부하들 및/또는 능력들을 가능하게는 예측하고 또는 현재 작업부하들을 계산할 수도 있는 종래의 기법들과 같은, 종래의 방식들과는 구별된다. 이러한 종래의 방식들은, 계획된 실행 시간들에 영향을 미칠 수도 있는 메모리로부터의 데이터 부하들과 같이, 태스크들의 실행 동안 프로세싱 유닛들에 의해 당면하게 될 수도 있는 동적 이벤트들을 고려하는데 종종 실패할 수도 있다. 일부 종래의 방식들은 또한 태스크들을 위한 최선의 목적들의 선험적 예측들을 수행하기 위해 프로파일들 또는 다른 사전계산된 데이터를 또한 사용할 수도 있다. 역으로, 실시형태의 기법들은 다중 버전들을 동시에 디스패치하고, 프로세싱 유닛들이 공통의 다중-버전의 태스크의 소유권을 위해 경쟁하도록 허용한다. 달리 말하면, 실시형태의 기법들은 다중-버전형 태스크들의 특수화된 버전들을 할당하기 위해 사전정의된 우선순위, 비용, 및/또는 예측 모델들을 이용하지 않고, 대신에, 다중-버전형 태스크를 실제로 실행하기 위해 처음 이용가능하게 되는 프로세싱 유닛에 기초하여 할당들을 실행한다.
또한, 일부 종래의 방식들과는 달리, 실시형태의 기법들은 가상 메모리 어드레스 공간 고려들 또는 특별한 태스크 큐들을 필요로하지 않는다. 특히, 일부 종래의 방식들은 모든 프로세싱 유닛들이 다중-버전형 태스크들을 훔칠 수도 있는 특별한 태스크 큐를 이용할 수도 있다. 이러한 특별 큐 방식들은, 상이한 조합들의 지원되는 구현들로 태스크들을 수용하기 위해 셀수 없는 큐들이 요구될 수도 있으므로, 유한한 자원을 갖는 시스템들에서 확장가능한 스케줄링을 위해 실현가능하지 않을 수도 있다. 예를 들어, 제 1 다중-버전형 태스크는 오직 CPU 및 GPU 구현들만을 가질 수도 있고, 제 2 다중-버전형 태스크는 CPU, GPU, 및 DSP 구현들을 가질 수도 있으며, 제 3 다중-버전형 태스크는 다수의 CPU 구현들을 포함할 수도 있으며, 각각은 별개의 특별한 태스크 큐를 필요로 한다. 이러한 종래의 기법들은, 프로세싱 유닛들에 대해 할당되고 실행될 수도 있는 임의의 태스크들을 식별하기 위해 각각의 특별 태스크 큐를 스캘하도록 프로세싱 유닛들에게 요구할 수도 있다. 실시형태의 기법들은 이러한 종래의 방식들보다 더 효율적이고, 단일-버전 태스크들을 위해 필요한 만큼 많은 태스크 큐들만을 필요로 한다.
다양한 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 태스크들을 다중-버전으로 또는 그 외에 스케줄링 또는 디스패칭하기 위해 다양한 동작들을 수행하기 위해 하나 이상의 런타임 기능들 (예컨대, 런타임 서비스, 루틴, 스레드, 로직, 또는는 다른 소프트웨어 에리먼트 등) 을 실행할 수도 있다. 이러한 런타임 기능은 오퍼레이팅 시스템들, 서비스들, 및/또는 다른 시스템-관련 소프트웨어를 실행하도록 구성된 범용 또는 애플리케이션들 프로세서와 같은, 컴퓨팅 디바이스의 프로세서에 의해 실행될 수도 있는 전용 런타임 기능을 포함할 수도 있다. 예를 들어, 애플리케이션 프로세서 상에서 실행되는 런타임 기능은 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위한 소유권을 프로세싱 유닛에 제공하도록 구성될 수도 있다. 개별 프로세싱 유닛들에서의 태스크들을 핸들링하기 위한 전용 기능들과 같이, 다른 런타임 기능들이 또한 사용될 수도 있다.
도 1 은 다양한 실시형태들과 함께 사용하기에 적합한 예시적인 다중-프로세서 컴퓨팅 디바이스 (101) (예컨대, 이종 시스템-온-칩 (SoC) 디바이스) 의 다양한 컴포넌트들을 나타내는 도 (100) 이다. 다중-프로세서 컴퓨팅 디바이스 (101) 는 (도 1 에서 "CPU_A" (102) 로서 지칭되는) 제 1 CPU (102), (도 1 에서 "CPU_B" (102) 로서 지칭되는) 제 2 CPU (112), GPU (122), 및 DSP (132) 와 같은 복수의 프로세싱 유닛들을 포함할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스 (101) 는 "ARM big.Little" 아키텍처를 이용할 수도 있고, 제 1 CPU (102) 는 비교적 높은 성능 능력들을 가지고 하지만 또한 비교적 높은 전력 요건들을 가지는 "빅 (big)" 프로세싱 유닛일 수도 있고, 제 2 CPU (112) 는 비교적 낮은 성능 능력들을 가지고 하지만 또한 제 1 CPU (102) 보다 비교적 낮은 전력 요건들을 가지는 "리틀 (little)" 프로세싱 유닛일 수도 있다.
다중-프로세서 컴퓨팅 디바이스 (101) 는 다양한 프로세싱 유닛들 (102, 112, 122, 132) 사이에 병렬적 프로세싱, 작업 공유, 및/또는 작업 "훔치기 (stealing)" 를 지원하도록 구성될 수도 있다. 특히, 프로세싱 유닛들 (102, 112, 122, 132) 의 임의의 조합은 실행을 위한 별개의 작업 항목들 (예컨대, 태스크들) 을 생성 및/또는 수신하도록 구성될 수도 있다. 프로세싱 유닛들 (102, 112, 122, 132) 의 각각은, 그 프로세싱 유닛들 (102, 112, 122, 132) 에 의해 실행될 태스크들 (및/또는 태스크들과 연관된 데이터) 을 임시로 저장 및 조직하기 위해 하나 이상의 큐들 (또는 태스크 큐들) 을 이용할 수도 있다. 예를 들어 그리고 도 1 을 참조하여, 제 1 CPU (102) 는 그 제 1 CPU (102) 에 의한 로컬 실행을 위해 태스크 큐들 (166, 168, 176) 로부터 태스크들을 취출 (retrieve) 할 수도 있고, 다른 디바이스들에 의한 실행을 위해 큐들 (170, 172, 174) 에서 태스크들을 배치할 수도 있다; 제 2 CPU (112) 는 그 제 2 CPU (112) 에 의한 로컬 실행을 위해 큐들 (174, 178, 180) 로부터 태스크들을 취출할 수도 있고, 다른 디바이스들에 의한 실행을 위해 큐들 (170, 172, 176) 에서 태스크들을 배치할 수도 있다; GPU (122) 는 큐들 (172) 로부터 태스크들을 취출할 수도 있다; DSP (132) 는 큐들 (170) 로부터 태스크들을 취출할 수도 있다. 일부 실시형태들에서, 일부 태스크 큐들 (170, 172, 174, 176) 은 소위 다중-생산자, 다중-소비자 큐들일 수도 있다; 일부 태스크 큐들 (166, 168, 178, 180) 은 소위 단일-생산자, 다중-소비자 큐들일 수도 있다; 하지만 또 다른 태스크 큐들은 소위 단일-생산자, 단일-소비자 큐들일 수도 있다. 일부 경우들에서, 태스크들은 특정 계산들을 쪼개는 작업부하들의 프로그래머들에 의한 지정들과 같이, 코드 내에서 표시자들에 기초하여 생성될 수도 있다. 또한, 프로세싱 유닛들 (102, 112, 122, 132) 의 임의의 조합은 통상적으로, 런타임 기능에 의한 배분을 위해 제출될 수도 있는 작업부하들 내에서 태스크들을 식별하는 것이 가능할 수도 있다.
일부 실시형태들에서, 런타임 기능 (예컨대, 런타임 엔진, 태스크 스케줄러 등) 은 프로세싱 유닛들 (102, 112, 122, 132) 에 태스크들을 디스패치하기 위한 목적지들을 결정하도록 구성될 수도 있다. 예를 들어, 프로세싱 유닛들 (102, 112, 122, 132) 의 임의의 것으로 오프로딩될 수도 있는 새로운 일반-목적 태스크를 식별하는 것에 응답하여, 런타임 기능은 태스크를 실행하기 위한 최선의 프로세싱 유닛(들)을 식별할 수도 있고, 이에 따라 태스크를 디스패치할 수도 있다. 이러한 런타임 기능은 제 1 CPU (102) 와 같이 메인 프로세시 또는 애플리케이션 프로세서 상에서 실행될 수도 있다. 특히, 런타임 기능은 하나 이상의 오퍼레이팅 시스템-가능 스레드들 (예컨대, "메인 스레드" (150)) 을 통해 수행될 수도 있다. 예를 들어, 런타임 기능의 결정들에 기초하여, 메인 스레드 (150) 는 다양한 태스크 큐들 (166, 170, 172, 180) 에 태스크 데이터를 제공할 수도 있다.
일부 실시형태들에서, 각각의 프로세싱 유닛 (102, 112, 122, 132) 은 서로에 대해 태스크들을 제공하는 것이 가능할 수도 있다. 예를 들어, DSP (132) 는 제 1 CPU (102), 제 2 CPU (112), 및/또는 GPU (122) 를 위해 태스크들을 생성할 수도 있고, 그 역이 가능할 수도 있다. 다른 예로서, GPU (122) 는 제 1 CPU (102), 제 2 CPU (112), 및/또는 DSP (132) 를 위해 태스크들을 생성할 수도 있고, 그 역이 가능할 수도 있다.
도 2a 및 도 2b 는 다중-프로세서 컴퓨팅 디바이스 (예컨대, 이종 시스템-온-칩 (SoC) 디바이스) 가 다중-버전형 태스크의 특수화된 버전의 종래의 "조기-결합 (early-binding)" 을 수행하는 시나리오를 나타낸다. 통상적으로, 다중-버전형 태스크를 위한 종래의 태스크 스케줄링은, 다중-버전형 태스크의 특별한 버전을 수행하기 위해 최선으로 이용가능한 것으로 예측되거나 수행할 수 있는 프로세싱 유닛을 선험적으로 식별할 수도 있다. 이러한 조기-결합 기법들은 종종, 프로세싱 유닛들의 속도 및/또는 효율성에 영향을 미치는 태스크 큐에서의 태스크들의 수, 태스크 사이즈, 및 다른 팩터들을 평가하는 등에 의해, 스케줄링 시에 적용가능한 프로세싱 유닛들 (예컨대, 코어들) 상에 존재하는 부하를 평가한다. 달리 말하면, 스케줄링 시에 가장 가벼운 부하를 갖는 프로세싱 유닛은 태스크를 할당받을 수도 있다. 예를 들어, GPU 의 현재 태스크 큐가 평가 시에 CPU 및 DSP 의 태스크 큐들보다 더 적은 작업 항목들을 포함한다고 결정하는 것에 응답하여, 스케줄러는 CPU 또는 DSP 대신에 GPU 에 다중-버전형 태스크의 일 버전을 할당할 수도 있다. 이들 평가들 (또는 예측들) 은, 할당받은 프로세싱 유닛이 다중-버전형 태스크의 특수화된 버전을 실행하기 위해 실제로 이용가능할 때보다 앞서 발생할 수도 있다.
하지만, 계산 자원의 이용가능성 및 프로그램에 대한 입력과 같은, 실행 속도들 및 다양한 런타임 조건들에서의 차이들로 인해, 현재의 또는 예측된 부하 평가들에 기초한 프로세싱 유닛들에 대한 태스크들의 선험적 할당들은 차선적일 수도 있다. 예를 들어, 비록 다중-버전형 태스크의 버전이 GPU 의 태스크 큐에서보다 관련 태스크 큐에서 더 적은 태스크들을 갖는 리틀 CPU 에 할당될 수도 있지만, GPU 는 후자의 비교적 약한 계산 전력 (예컨대, 더 낮은 주파수, 사이클-당-명령들 등) 으로 인해 리틀 CPU 보다 더 빨리 더 많은 태스크들을 마칠 수도 있다. 따라서, GPU 는 리틀 CPU 전에 다중-버전형 태스크를 실행했을 수 있을 것이다. 이러한 종래의 스케줄링 기법들은 근시안적이고 전체 시스템 성능에 악영향을 미칠 수도 있다.
종래의 조기-결합 기법들은, 특수화된 버전들의 할당들이 동적 부하 균형을 위해 재할당되지 않을 수도 있기 때문에, 다중-버전형 태스크들에 있어서 추가적으로 문제가 될 수도 있다. 특히, 대응하는 태스크 큐들에서 아무런 작업 항목들도 갖지 않는 이용가능한 프로세싱 유닛들이 다른 태스크 큐들로부터 작업 항목들을 취하는 것을 가능하게 하는 "작업 훔치기 (work stealing)" 정책들은, 태스크 큐들에서의 적용가능한 버전들이 특정 타입들의 프로세싱 유닛들 상에서 오직 실행될 수도 있음에 따라, 적용가능하지 않을 수도 있다. 예를 들어, 작업하기 위해 이용가능한 DSP 는, 특수화된 태스크가 CPU 를 위해 특별히 구성됨에 따라, CPU 의 태스크 큐로부터 다중-버전형 태스크의 특수화된 버전을 취하는 것이 가능하지 않을 수도 있다.
도 2a 는 제 1 시간에서의 다중-프로세서 컴퓨팅 디바이스 (101) 에 의한 (도 2a 에서 "Task_1" 로서 지칭되는) 다중-버전형 태스크 (201) 의 특별한 버전의 예시적인 조기-결합 스케줄링 (또는 디스패칭) 을 나타내는 도 (200) 를 포함한다. 다중-버전형 태스크 (201) 는, 다양한 프로세싱 유닛들이 실행 가능할 수도 있는 계산 (예컨대, 행렬 곱 계산 등) 과 같은 일반-목적 태스크일 수도 있다. 다중-버전형 태스크 (201) 는 공통의 계산, 프로세스, 및/또는 기능을 달성하도록 각각 구성되는 다중-버전형 태스크 (201) 의 복수의 특수화된 버전들을 포함하거나 그 외에 그것들과 연관될 수도 있다. 예를 들어, 다중-버전형 태스크 (201) 는, (도 2a 및 도 2b 에서 "CPU_A" 로서 지칭되는) 제 1 CPU (102) 상에서의 실행을 위해 구성된 제 1 특수화된 버전 (202a), (도 2a 및 도 2b 에서 "CPU_B" 로서 지칭되는) 제 2 CPU (112) 상에서의 실행을 위해 구성된 제 2 특수화된 버전 (202b), GPU (122) 상에서의 실행을 위해 구성된 제 3 특수화된 버전 (202c), 및 DSP (132) 상에서의 실행을 위해 구성된 제 4 특수화된 버전 (202d) 을 포함할 수도 있다.
임의의 제 1 시간에서, 프로세싱 유닛들 (102, 112, 122, 132) 의 현재 작업부하들에 기초하여 태스크들을 스케줄링하도록 구성된 종래의 부하-기반 스케줄러 모듈 (210) 은, 다중-버전형 태스크 (201) 가 실행을 위해 스케줄링될 준비가 된 것을 결정할 수도 있다. 부하-기반 스케줄러 모듈 (210) 은, 가장 적은 작업 부하 (예컨대, 큐들 태스크들의 최소 수) 를 갖는 프로세싱 유닛에 의한 실행을 위해 새로운 태스크들을 수신 및 패치하는 애플리케이션 프로세서를 통해 스레드를 통해 실행되는 스케줄러 기능일 수도 있다. 간단히, 부하-기반 스케줄러 모듈 (210) 은, 스레드 (예컨대, 메인 스레드 (150)) 를 통해 실행되도록 구성되는 단일 모듈 (예컨대, 소프트웨어, 컴포넌트(들), 명령들, 루틴(들), 로직 등) 로서 도 2a 및 도 2b 에서 도시된다. 하지만, 부하-기반 스케줄러 모듈 (210) 은 단일의 (또는 메인) 스레드에 의해 인에이블될 수도 있거나 인에이블되지 않을 수도 있는 기능들을 나타내거나 그 외에 포함할 수도 있다. 예를 들어, 일부 실시형태들에서, 부하-기반 스케줄러 모듈 (210) 은, 다중-프로세서 컴퓨팅 디바이스 (101) 에서 다중 스레드들에 걸쳐 인에이블되고 실행되는 로직, 컴포넌트들, 루틴들, 명령들, 및/또는 다른 기능들로 이루어질 수도 있다.
부하-기반 스케줄러 모듈 (210) 은, 프로세싱될 현재 큐잉되는 최소 수의 태스크들을 현재 갖는 프로세싱 유닛을 식별하는 등에 의해, 복수의 프로세싱 유닛들 (102, 112, 122, 132) 의 동작 상태들을 평가할 수도 있다. 예를 들어, 도 2a 에서의 예시에 관해, 부하-기반 스케줄러 모듈 (210) 은, 제 1 시간에서 제 1 CPU (102) 와 연관된 제 1 태스크 큐 (220a) 가 큐잉되는 4 개의 태스크들 (230a) 을 가질 수도 있고, 제 2 CPU (112) 와 연관된 제 2 태스크 큐 (220b) 가 큐잉되는 2 개의 태스크들 (230b) 을 가질 수도 있으며, GPU (112) 와 연관된 제 3 태스크 큐 (220c) 가 큐잉되는 5 개의 태스크들 (230c) 을 가질 수도 있고, 그리고, DSP (132) 와 연관된 제 4 태스크 큐 (220d) 가 큐잉되는 3 개의 태스크 큐들 (220a-220d) 을 가질 수도 있는 것을 식별할 수도 있다. 태스크 큐들 (220a-220d) 에서의 현재 큐잉되는 태스크들의 수에 기초하여, 부하-기반 스케줄러 모듈 (210) 은, 제 2 태스크 큐 (220b) 가 최소의 현재 큐잉되는 태스크들 (230b) 을 갖는 것으로 인해 다중-버전형 태스크 (201) 의 일 버전을 실행하기 위해 적절한 프로세싱 유닛으로서 제 2 CPU (112) 를 식별할 수도 있다. 부하-기반 스케줄러 모듈 (210) 은, 제 2 태스크 큐 (220b) 에 제 2 특수화된 버전 (202b) (또는 제 2 특수화된 버전 (202b) 의 표현) 을 배치함으로써 제 2 CPU (112) 에 다중-버전형 태스크 (201) 를 할당할 수도 있다.
하지만, 상이한 프로세싱 유닛들 (102, 112, 122, 132) 은, 상이한 레이트들로 동작들을 수행할 수도 있고, 및/또는, 부하-기반 스케줄러 모듈 (210) 에 의해 태스크들이 할당된 후에 다양한 예기치 못한 팩터들 또는 조건들에 의해 영향을 받을 수도 있음에 따라, 다중-버전형 태스크 (201) 는 다중-프로세서 컴퓨팅 디바이스 (101) 에 의해 차선적으로 실행될 수도 있다. 예를 들어, 부하-기반 스케줄러 모듈 (210) 의 결정들은, 발생할 수도 있고, 후속하여, 작업 항목들이 프로세싱 유닛들에 의해 실행되는 속도, 수행될 작업 항목들의 복잡성 등에 영향을 미칠 수도 있는 동적 디바이스 동작 조건들을 고려하는 것에 실패할 수도 있다. 랜덤 디바이스 실패들 또는 비효율성들과 같이, 종국적으로 상이한 프로세싱 유닛들 (102, 112, 122, 132) 로 하여금, 다른 프로세싱 유닛들이 예측가능하거나 측정될 수도 있거나 그러지 못할 수도 있기 전에, 이용가능하게 (또는 이용가능하지 않게) 되도록 할 수도 있는 일부 조건들. 달리 말하면, 프로세싱 유닛들 (102, 112, 122, 132) 의 프로세싱 능력들을 예측 및/또는 측정하는 것은 부정확 및/또는 모호할 수도 있고, 다라서, 차선적 태스크 할당들을 초래할 수도 있다.
도 2b 는 도 2a 에서 도시된 종래의 조기-결합 스케줄링으로 인한 제 2 시간에서의 컴퓨팅 디바이스 (101) 의 이러한 비효율적인 조건을 나타내는 도 (250) 를 포함한다. 특히, 프로세싱 유닛들 (102, 112, 122, 132) 이 대응하는 태스크 큐들 (220a-220d) 내의 태스크들을 프로세싱하는 기간 후에, GPU (122) 는 빈 태스크 큐 (220c) 로 인해 이용가능하게 되고 따라서 비활성이 될 수도 있다. 또한, 제 1 시간에서의 부하-기반 스케줄러 모듈 (210) 에 의한 부하 결정에도 불구하고, 다중-버전형 태스크 (201) 의 제 2 특수화된 버전 (202b) 은 제 2 시간에서 제 2 CPU (112) 에 의한 실행을 아직 시작하지 않았다. 달리 말하면, 제 1 시간에서 태스크 큐 (220b) 에서 최소의 태스크들을 가짐에도 불구하고, 제 2 CPU (112) 가 제 2 특수화된 버전 (202b) 의 실행을 시작할 수 없었던 동안 제 2 시간에서 GPU (122) 가 이용가능하게 되었음에 따라, 제 2 CPU (112) 는 다중-버전형 태스크 (201) 를 실행하기 위한 종국적 최선의 선택이 아니었다. 따라서, 종래의 선험적 "조기-결합" 정책들의 명백한 제한들로 인해, 다중-프로세서 컴퓨팅 디바이스들 내의 다중-버전형 태스크 스케줄링을 향상시키기 위한 기회가 존재한다.
도 3a 내지 도 3c 는, 도 2a 및 도 2b 에서 예시된 바와 같이, 다중-버전형 태스크들에 대한 선험적 스케줄링 정책들의 단점을 극복하기 위해 사용될 수도 있는 일부 실시형태들에 따른 예시적인 "늦은-결합" 기법을 예시한다. 특히, 실시형태의 늦은-결합 동작들은 프로세싱 유닛들의 실행의 상대적인 속도에 기초하여 다중-버전형 태스크들의 특수화된 버전들을 할당할 수도 있다. 이것은, 태스크들이 태스크 큐들 내에 배치되는 시간에서 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛들 상에서의 상대적인 부하에 상관 없이, 특수화된 버전을 실행하기 위해 준비될 가장 빠른 프로세싱 유닛이 다중-버전형 태스크를 수행할 수도 있다.
도 3a 내지 도 3c 에서 묘사된 컴포넌트들은 오직 예시적인 목적들을 위해 제공되는 것이고, 다양한 실시형태들에 따라 방법들을 구현하기 위해 적합한 임의의 특정 구조적 구현에 실시형태들 또는 청구항들을 제한하려는 의도는 아니다. 예를 들어, 태스크 큐들 (220a-220d) 은 다중-프로세서 컴퓨팅 디바이스들에서 다양한 데이터 구조들 및/또는 다른 균등적 구조들에서 나타내어질 수도 있다. 다른 예로서, 동시 스케줄러 모듈 (311) 은 다중-프로세서 컴퓨팅 디바이스의 하나 이상의 프로세싱 유닛들에 의해 지원될 수도 있는 하나 이상의 컴포넌트들, 로직, 디바이스들, 및/또는 다른 기능들을 나타낼 수도 있다.
도 3a 는 일반-목적 동작들 (예컨대, 계산 등) 을 수행하기 위해 생성될 수도 있는 다중-버전형 태스크 (301) 를 나타내는 도 (300) 를 포함한다. (도 3a 내지 도 3c 에서 "Task_2" 로서 지칭되는) 다중-버전형 태스크 (301) 는 다중-버전형 태스크 (301) 의 복수의 특수화된 버전들 (302a-302d) 을 포함하거나 그것들과 연관될 수도 있다. 예를 들어, 다중-버전형 태스크 (301) 는, 제 1 CPU (102) 상에서의 실행을 위해 구성된 제 1 특수화된 버전 (302a), 제 2 CPU (112) 상에서의 실행을 위해 구성된 제 2 특수화된 버전 (302b), GPU (122) 상에서의 실행을 위해 구성된 제 3 특수화된 버전 (302c), 및 DSP (132) 상에서의 실행을 위해 구성된 제 4 특수화된 버전 (302d) 을 포함할 수도 있다.
일부 실시형태들에서, 다중-버전형 태스크 (301) 는 또한, 프로세싱 유닛들 (102, 112, 122, 132) 이 어떻게 다중-버전형 태스크 (301) 를 액세스하거나 그 외에 실행하는지를 제어하기 위해 다중-프로세서 컴퓨팅 디바이스 (101) 에 의해 사용될 수도 있는 저장된 데이터와 연관될 수도 있다. 예를 들어, 다중-버전형 태스크 (301) 는, 다중-버전형 태스크 (301) 를 실행하기 위한 권한을 획득한 프로세싱 유닛의 식별자 (또는 ID) (즉, 다중-버전형 태스크 (301) 에 대한 "소유권" 을 갖는 프로세싱 유닛의 ID) 를 저장하는 데이터 필드와 같은, 소유권 데이터 (310) 를 포함하거나 그 외에 그것과 연관될 수도 있다. 일부 실시형태들에서, 소유권 데이터 (310) 는 식별자를 저장하지 않을 수도 있고, 하지만 대신에, 다중-버전형 태스크 (301) 에 대한 소유권이 임의의 프로세싱 유닛에 의해 획득되었는지 또는 획득되지 않았는지 여부를 나타내는 데이터 (예컨대, 소유/비소유를 나타내는 단일 비트) 를 단순히 저장할 수도 있다.
다중-버전형 태스크 (301) 가 프로세싱 유닛에 의해 소유되기 이전에, 소유권 데이터 (310) 는 널 (null) 일 수도 있다. 다중-버전형 태스크 (301) 와 연관된 저장된 데이터는 또한, 다중-버전형 태스크 (301) 의 임의의 특수화된 버전 (302a-302d) 이 완료되었는지 여부를 나타내는 정보를 저장하는 데이터 필드와 같은, 완료 데이터 (312) 를 포함할 수도 있다. 예를 들어, 디폴트로서, 완료 데이터 (312) 는 네거티브 값 (예컨대, 0, "N", "no" 등) 으로 설정될 수도 있고, 하지만, 다중-버전형 태스크 (301) 에 대한 소유권을 갖는 프로세싱 유닛이 특수화된 버전들 (302a-302d) 중 하나를 실행한 후에, 완료 데이터 (312) 는 태스크가 완료된 것을 나타내기 위해 포지티브 값 (예컨대, 1, "Y", "yes" 등) 으로 설정될 수도 있다. 일부 실시형태들에서, 데이터 필드들 (310-312) 은 데이터 어레이(들), 시스템 변수(들), 레지스터(들), 및/또는 다중-프로세서 컴퓨팅 디바이스 (101) 에 대해 액세스 가능한 다른 구조(들)와 같은, 휘발성 또는 비-휘발성 메모리에 저장될 수도 있다.
임의의 제 1 시간에서, 태스크들을 스케줄링하도록 구성된 런타임 기능 (즉, 동시 스케줄러 모듈 (311)) 은, 다중-버전형 태스크 (301) 가 실행을 위해 생성되었거나 그 외에 실행을 위해 스케줄링될 준비가 되었다고 결정할 수도 있다. 예를 들어, 동시 스케줄러 모듈 (311)) 은 새로운 태스크들을 수신 및 디스패치하는 애플리케이션 프로세서에 의해 스레드를 통해 실행되는 스케줄러 기능일 수도 있다. 간단하게, 동시 스케줄러 모듈 (311) 은 스레드 (예컨대, 메인 스레드 (150)) 를 통해 실행되도록 구성되는 단일 모듈 (예컨대, 소프트웨어, 컴포넌트(들), 명령들, 루틴(들), 로직 등) 로서 도 3a 내지 도 3c 에서 도시된다. 하지만, 동시 스케줄러 모듈 (311) 은 단일 (또는 메인) 스레드에 의해 인에이블될 수도 있고 또는 않을 수도 있는 기능들을 표현하거나 또는 그 외에 그러한 기능들로 이루어질 수도 있다. 예를 들어, 일부 실시형태들에서, 동시 스케줄러 모듈 (311) 은 다중-프로세서 컴퓨팅 디바이스 (101) 에서 다중 스레드들에 걸쳐 실행되거나 인에이블되는 로직, 컴포넌트들, 루틴들, 명령들, 및/또는 다른 기능들로 이루어질 수도 있다. 일부 실시형태들에서, 동시 스케줄러 모듈 (311) 은 다중-프로세서 컴퓨팅 디바이스 (101) 의 다양한 프로세싱 유닛들 (예컨대, GPU (122), DSP (132) 등) 로부터 분리된 실행 엔티티 (entity) 일 필요는 없다. 예를 들어, 동시 스케줄러 모듈 (311) 은 설명된 바와 같이 다중-버전형 태스크를 실행하기 위한 동작들의 일부로서 임의의 프로세서 또는 디바이스 (예컨대, GPU (122) 등) 에 의해 인라인으로 실행될 수도 있는 논리적 기능성을 나타낼 수도 있다.
제 1 시간에서의 프로세싱 유닛들 (102, 112, 122, 132) 의 작업부하들 (예컨대, 다른 태스크들 (230a-230d)) 에 관계없이, 동시 스케줄러 모듈 (311) 은 특수화된 버전들 (302a-302d) 의 각각을 프로세싱 유닛들 (102, 112, 122, 132) 의 태스크 큐들 (220a-220d) 에 동시에 할당할 수도 있다. 예를 들어, 동시 스케줄러 모듈 (311) 은, CPU 에 의한 실행을 위해 구성되는 제 1 특수화된 버전 (302a) 을 제 1 CPU (102) 와 연관된 제 1 태스크 큐 (220a) 에, CPU 에 의한 실행을 위해 구성되는 제 2 특수화된 버전 (302b) 을 제 2 CPU (112) 와 연관된 제 2 태스크 큐 (220b) 에, GPU 에 의한 실행을 위해 구성되는 제 3 특수화된 버전 (302c) 을 GPU (122) 와 연관된 제 3 태스크 큐 (220c) 에, 그리고, DSP 에 의한 실행을 위해 구성되는 제 4 특수화된 버전 (302d) 을 DSP (132) 와 연관된 제 4 태스크 큐 (220d) 에 전송할 수도 있다. 일부 실시형태들에서, 특수화된 버전들 (302a-302d) 을 전송하는 것은 그 특수화된 버전들 (302a-302d) 의 태스크 포인터들 또는 다른 데이터 표현들을 적절한 태스크 큐들 (220a-220d) 에 배치하는 것을 포함할 수도 있다.
도 3b 는 프로세싱 유닛 (즉, GPU (122)) 이 다중-버전형 태스크 (301) 에 대한 소유권을 획득하는 것을 예시하는 도 (350) 를 포함한다. 예를 들어, 도 3a 에서 예시된 시간 후에, GPU (122) 는 제 3 태스크 큐 (220c) 에서의 모든 다른 태스크들 (230c) 을 완료하고, 따라서, 다중-버전형 태스크 (301) 의 제 3 특수화된 버전 (302c) 을 실행하기 위해 이용가능할 수도 있다. GPU (122) 는 다중-버전형 태스크 (301) 에 대한 소유권을 획득하기 위해 동시 스케줄러 모듈 (311) (즉, 런타임 기능) 과 연관된 신호들 (352) 을 교환할 수도 있다. 예를 들어, 제 3 태스크 큐 (220c) 에서 실행할 다음 태스크가 제 3 특수화된 버전 (302c) 이라고 결정 시에, GPU (122) 는 동시 스케줄러 모듈 (311) 에 요청 신호를 송신할 수도 있고, 이에 응답하여, 동시 스케줄러 모듈 (311) 은 GPU (122) 가 소유권을 획득하였는지 여부를 나타내는 응답 신호를 송신할 수도 있다. 일부 실시형태들에서, 신호들 (352) 은, GPU (122) 가 다중-버전형 태스크 (301) 의 특수화된 버전을 마치는 것에 응답하여 마치도록 구성되도록 다중-버전형 태스크 (301) 를 구성하기 위한 GPU (122) 로부터의 API 호출을 포함할 수도 있다. 예를 들어, GPU (122) 로부터의 신호들 (352) 은, 동시 스케줄러 모듈 (311) 로 하여금, 제 3 특수화된 버전 (302c) 이 완료되었다고 결정하는 것에 응답하여, 다중-버전형 태스크 (301) (예컨대, 302a, 302b, 302d) 의 모든 연관된 버전들을 완료, 취소, 또는 그 외에 종료하도록 다중-버전형 태스크 (301) 를 구성하게 하는 "finish_after()" 호출을 포함할 수도 있다. 달리 말하면, "finish_after()" 는 다중-버전형 태스크로 하여금 그 다중-버전형 태스크의 오직 하나의 특수화된 버전의 실행 후에 마치게 하는 메커니즘일 수도 있다.
일부 실시형태들에서, 동시 스케줄러 모듈 (311) 은 GPU (122) 로부터 시그널링 (352) 을 수신하는 것에 응답하여 다중-버전형 태스크 (301) 와 연관된 소유권 데이터 (310) 를 체크 및/또는 업데이트하기 위한 동작들 (354) 을 수행할 수도 있다. 예를 들어, 동시 스케줄러 모듈 (311) 은, 프로세싱 유닛 식별자가 이미 설정되어 있는지 여부 및 그렇지 않다면 GPU (122) (예컨대, "GPU") 의 식별자로 하여금 소유권 데이터 (310) 에 저장되게 할 수도 있는지 여부를 결정하기 위해 소유권 데이터 (310) 를 쿼리 (query) 할 수도 있다.
일단 GPU (122) 가 다중-버전형 태스크 (301) 에 대한 소유권을 획득하고 나면 (즉, GPU (122) 가 다중-버전형 태스크 (301) 의 특수화된 버전을 실행하기 위핸 배타적 권리를 가짐), 다른 프로세싱 유닛들 (102, 112, 132) 은 종국적으로 다른 태스크들을 완료하고, 특수화된 버전들 (302a, 302b, 302d) 을 실행하기 위해 이용가능하게 될 수도 있다. 하지만, 동시 스케줄러 모듈 (311) 과의 교환들에 응답하여, 이들 다른 프로세싱 유닛들 (102, 112, 132) 은 다중-버전형 태스크 (301) 에 대한 소유권을 거절 당할 수도 있고, 따라서, 대응하는 특수화된 버전들 (302a, 302b, 302d) 을 실행하는 것으로부터 배제될 수도 있다. 대신에, 이 다른 프로세싱 유닛들 (102, 112, 132) 은 이러한 소유권 거절들로 인해 실행 없이 특수화된 버전들 (302a, 302b, 302d) 을 단순히 폐기하도록 구성될 수도 있다. 예를 들어, 특수화된 버전들 (302a, 302b, 302d) 은 GPU (122) 가 다중-버전형 태스크 (301) 에 대한 소유권을 획득하는 것에 응답하여 폐기될 수도 있다. 일부 경우들에서, GPU (122) 는 다른 프로세싱 유닛들 (102, 112, 132) 이 대응하는 특수화된 버전들 (302a, 302b, 302d) 을 실행할 준비가 되는 시간까지 제 3 특수화된 버전 (302c) 의 실행을 이미 완료했을 수도 있고, 따라서, 다른 프로세싱 유닛들 (102, 112, 132) 은 특수화된 버전들 (302a, 302b, 302d) 을 디큐잉 및 폐기하고 대응하는 태스크 큐들 (220a, 220b, 220d) 내로 진입되는 다른 태스크들을 단순히 실행하는 것을 시작할 수도 있다.
도 3c 는 GPU (122) 가 제 3 특수화된 버전 (302c) 의 실행을 완료하고 따라서 다중-버전형 태스크 (301) 를 완료한 후에 발생하는 시그널링을 예시하는 도 (375) 를 포함한다. 일부 실시형태들에서, GPU (122) 는 제 3 특수화된 버전 (302c) 의 완료를 나타내는 신호 (376) 를 동시 스케줄러 모듈 (311) 에 송신할 수도 있고, 다시, 동시 스케줄러 모듈 (311) 은 데이터 (312) 를 업데이트하기 위한 동작들 (378) 을 수행 (예컨대, "Y" 값을 저장) 할 수도 있다. 일부 실시형태들에서, 동시 스케줄러 모듈 (311) 은, 다른 프로세싱 유닛들 (102, 112, 132) 로 하여금 다중-버전형 태스크 (301) 의 대응하는 특수화된 버전들 (302a, 302b, 302d) 을 디큐잉 또는 디스에이블 (disable) 하게 하고 대응하는 태스크 큐들 (220a, 220b, 220d) 에서 다른 태스크들의 실행을 재개하게 하는 신호들 (380) 을 다른 프로세싱 유닛들 (102, 112, 132) 과 교환할 수도 있다. 예를 들어, 특수화된 버전들 (302a, 302b, 302d) 을 실행할 준비가 되었을 때, 다른 프로세싱 유닛들 (102, 112, 132) 은 소유권을 요청할 수도 있다. 응답하여, 신호들 (380) 은, 다중-버전형 태스크 (301) 의 소유권이 이용가능하지 않은 것을 나타낼 수도 있고, 따라서, 프로세싱 유닛들 (102, 112, 132) 은 특수화된 버전들 (302a, 302b, 302d) 을 디스에이블하고 다중-버전형 태스크 (301) 와 관련되지 않은 다른 태스크들로 진행할 수도 있다.
일부 실시형태들에서, 동작들 (378) 은, 메모리로부터 다중-버전형 태스크 (301) 와 연관된 데이터를 제거하는 등에 의해, 다중-버전형 태스크 (301) 를 디큐잉 및/또는 그 외에 삭제하는 것을 포함할 수도 있다. 일부 실시형태들에서, GPU 는, 다중-버전형 태스크 (301) 에 대한 소유권을 획득하기 이한 원래의 신호들 (352) 이 각각의 특수화된 버전들 (302a, 302b, 302d) 을 실행하는 것으로부터 다른 프로세싱 유닛들 (102, 112, 132) 을 디스에이블하기에 적당하지 않을 수도 있음에 따라, 신호 (376) 를 송신하도록 요구되지 않을 수도 있다. 예를 들어, 신호들 (352) 이 전송된 후에, DSP (132) 는 제 4 특수화된 버전 (302d) 을 디큐잉하고, (예컨대, 동시 스케줄러 모듈 (311) 에 대한 시그널링을 통해) 연관된 다중-버전형 태스크 (301) 가 이미 GPU (122) 에 의해 소유되었다고 결정하며, 따라서 제 4 특수화된 버전 (302d) 을 단순히 폐기할 수도 있다.
도 4a 는 다양한 프로세싱 유닛 태스크 큐들에 대해 다중-버전형 태스크들의 특수화된 버전들을 스케줄링 및 디스패치하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행되는 방법 (400) 을 나타낸다. 설명된 바와 같이, 다중-프로세서 컴퓨팅 디바이스 (예컨대, 도 1 내지 도 3c 에서의 다중-프로세서 컴퓨팅 디바이스 (101)) 는, 복수의 프로세싱 유닛들, 실례로, 다중-버전형 태스크들에 대해 지원되는 일부 또는 모든 프로세싱 유닛들에 특수화된 버전들을 동시에 할당함으로써 런타임에서 다중-버전형 태스크들의 늦은-결합을 수행하도록 구성될 수도 있다. 방법 (400) 은 다양한 프로세싱 유닛들의 적절한 태스크 큐들에 특수화된 버전들을 배치하기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행될 수도 있다. 일부 실시형태들에서, 방법 (400) 의 다양한 동작들은, 도 1 내지 도 3c 의 다중-프로세서 컴퓨팅 디바이스 (101) 의 CPU (102), GPU (122), 또는 DSP (132) 와 같은, 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛을 통해 실행되는 런타임 기능 (예컨대, 도 3a 내지 도 3c 의 동시 스케줄러 모듈 (311)) 에 의해 수행될 수도 있다.
다중-프로세서 컴퓨팅 디바이스는 블록 (402) 에서 복수의 프로세싱 유닛들 중 하나 상에서 실행될 특수화된 버전들을 갖는 다중-버전형 태스크를 식별할 수도 있다. 각각의 특수화된 버전은 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛 (예컨대, GPU, CPU, DSP 등) 에 의해 실행되도록 구성될 수도 있다. 표시는, 다중-프로세서 컴퓨팅 디바이스에 의해 스케줄링될 태스크가 특수화된 버전들 (또는 대안적인 태스크들/식별자들) 과 연관되는지 여부를 결정하는 것을 포함할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는, 스케줄링될 새로운 태스크가 특수화된 버전들을 표시하는 대안적인 넘버들을 가지는지 여부를 결정하기 위한 동작 (예컨대, 도 5b 에서의 "has_alternatives()" 함수 호츨) 을 수행할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는, 프로세싱 유닛에 의한 다중-버전형 태스크의 생성에 응답하여 이러한 표시들을 만들 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는 지원되는 특수화된 버전들을 다중-버전형 태스크로서 표시하는 API 호출을 통해 생성된 임의의 새로운 태스크를 식별할 수도 있다. 다중-버전형 태스크를 생성하기 위한 예시적인 코드는 도 5a 에서 예시된다.
실행을 위해 론칭될 때, 다중-버전형 태스크는, 다중-버전형 태스크가 전의 것 종속성을 가지지 않는 때의 시간 및/또는 다양한 스케줄링 최적화들에 의해 정의되는 시간 등에서, 다중-프로세서 컴퓨팅 디바이스에 의한 스케줄링을 위해 고려될 수도 있다. 일부 실시형태들에서, 다중-버전형 태스크는 서브그래프들을 발견하기 위해 다양한 특성들 (예컨대, 프로세싱 유닛 타입 등) 에 의해 태스크 그래프들을 평가하는 스케줄링 정책에 기초하여 스케줄링될 수도 있다. 예를 들어, 다중-버전형 태스크는 GPU 에 대해 모든 태스크들의 서브그래프를 큰 태스크 그래프 내에서 식별하고, GPU 상에서의 실행을 위해 한번에 전체 서브그래프를 디스패치할 수도 있다. 이러한 디스패치는 서브그래프에서 모든 태스크들의 종결을 표시하기 위한 단일의 GPU-대-CPU 콜백을 포함할 수도 있고, 스케줄링 목적들을 위한 CPU 와 GPU 사이의 라운드-트립들의 수를 감소시킬 수도 있다.
블록 (404) 에서, 다중-프로세서 컴퓨팅 디바이스는 복수의 프로세싱 유닛들의 적절한 프로세싱 유닛에 대해 태스크 큐에서 다중-버전형 태스크의 특수화된 버전들의 각각을 인큐잉할 수도 있다. 예를 들어, CPU, GPU, 및 DSP 에 대해 이용가능한 특수화된 버전들이 존재하는 경우에, 다중-프로세서 컴퓨팅 디바이스는, CPU 의 태스크 큐에서 CPU 특수화된 버전을, GPU 태스크 큐에서 GPU 특수화된 버전을, 그리고, DSP 태스크 큐에서 DSP 특수화된 버전을 인큐잉할 수도 있다. 다중-프로세서 컴퓨팅 디바이스는 단지, 다중-버전형 태스크에 의해 지원되는 프로세싱 유닛들의 태스크 큐들에서 특수화된 버전들을 인큐잉할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는 단지, GPU 의 태스크 큐 및 CPU 의 태스크 큐에서 특수화된 버전들을 인큐잉할 수도 있고, 다중-버전형 태스크의 오직 CPU 및 GPU 특수화된 버전들만이 프로그래머에 의해 제공되는 경우에 지원되지 않는 프로세싱 유닛들 (예컨대, DSP 등) 은 무시할 수도 있다.
다중-프로세서 컴퓨팅 디바이스는 블록 (402) 에서의 동작들로 계속할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 도 4b 에서 블록 (404) 에서의 동작들에 계속할 수도 있다.
일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 각각의 적절한 태스크 큐에서 각각의 특수화된 버전에 대해 태스크 포인터 (또는 다른 유사한 데이터) 를 인큐잉할 수도 있다. 다중-버전형 태스크의 다양한 특수화된 버전들에 대한 포인터들의 예시적인 인큐잉은 도 5b 에서 예시된다 (코드 서브섹션 (526) 및 코드 섹션 (528)). 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 태스크 식별 정보를 포인터들 내로 인코딩할 수도 있다. 특히, 포인터들은 각각, 다중-버전형 태스크 및 개별 특수화된 버전을 표시하는 데이터를 포함할 수도 있다. 이러한 포인터들 내의 태스크 정보는 상이한 비트 마스크들을 적용함으로써 개별 프로세싱 유닛들에 의해 액세스될 수도 있다. 예를 들어, 제 1 프로세싱 유닛 (예컨대, GPU) 은 부 (parent) 마스크를 연관된 태스크 큐로부터 디큐잉된 포인터에 적용함으로써 다중-버전형 태스크를 식별할 수도 있고, 제 2 마스크 (또는 대안적인 마스크) 를 동일한 포인터에 적용함으로써 특수화된 버전을 식별할 수도 있다. 일부 실시형태들에서, 특수화된 버전을 나타내는 데이터는 각 포인터의 최하위 4 비트들 내에 포함될 수도 있다. 포인터들의 예시적인 인코딩은 도 5b 에서 예시되고 (예컨대, 코드 서브섹션 (526), 태스크 식별 정보를 취출하기 위한 프로세싱 유닛에 의한 이러한 마스크들의 적용은 도 7 에서 예시된다 (예컨대, 코드 섹션 (702).
도 4b 는 다중-버전형 태스크들의 수행을 관리하기 위해 다중-프로세서 컴퓨팅 디바이스 (도 1 내지 도 3c 에서의 다중-프로세서 컴퓨팅 디바이스 (101)) 에 의해 수행되는 방법 (405) 을 예시한다. 기술된 바와 같이, 일단 다중-버전형 태스크의 특수화된 버전들이 모든 지원되는 프로세싱 유닛들에 할당되면, 연관된 태스크 큐 내에 인큐잉되는 특수화된 버전을 즉시 실행할 준비가 될 지원되는 프로세싱 유닛들 중 맨 처음 것이 다중-버전형 태스크에 대한 소유권을 얻을 수도 있다. 이러한 소유권 획득은 다른 지원되는 프로세싱 유닛들이 동일한 다중-버전형 태스크의 대응하는 특수화된 버전들을 실행하는 것을 방지할 수도 있다. 예를 들어, 소유권을 얻는데 실패한 프로세싱 유닛들의 태스크 큐들에서의 특수화된 버전들은, 제 1 프로세싱 유닛이 이미 소유권을 획득하였고 대응하는 툭수화된 버전을 완료하였다고 결정하는 것 등에 응답하여, 실행함이 없이 단순히 마칠 수도 있다. 다중-버전형 태스크들에 대한 소유권을 획득하는 것은, 적절한 특수화된 버전을 실행할 준비가 된 가장 빠른 단일의 프로세싱 유닛에 의해 각각의 다중-버전형 태스크가 실행되고 이에 의해 잠재적으로 부정확한 선험적 예측 방식들보다 더 나은 성능을 제공하는 것을 보장할 수도 있다.
일부 실시형태들에서, 방법 (405) 은 다중-프로세서 컴퓨팅 디바이스 내에서 활성인 각각의 다중-버전형 태스크에 대해 수행될 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는 하나 이상의 다중-버전형 태스크들의 관리를 핸들링하기 위해 방법 (405) 의 하나 이상의 인스턴스들 (예컨대, 방법 (405) 을 실행하기 위한 하나 이상의 스레드들) 을 동시에 실행할 수도 있다. 일부 실시형태들에서, 방법 (405) 의 다양한 동작들은, 도 1 내지 도 3c 의 다중-프로세서 컴퓨팅 디바이스 (101) 의 CPU (102), GPU (122), 또는 DSP (132) 와 같은 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛을 통해 실행되는 런타임 기능 (예컨대, 도 3a 내지 도 3c 의 동시 스케줄러 모듈 (311)) 에 의해 수행될 수도 있다. 다양한 실시형태들에서, 방법 (405) 은 도 4a 를 참조하여 설명된 방법 (400) 과 결합하여 수행될 수도 있다. 예를 들어, 런타임 기능은 다양한 실시형태들에 따라 복수의 프로세싱 유닛들에 걸친 다중-버전형 태스크들을 식별, 디스패치, 및 그 다음에 관리하기 위해 양 방법들 (400, 405) 을 수행하도록 구성될 수도 있다.
다중-버전형 태스크의 특수화된 버전이 복수의 프로세싱 유닛들의 태스크 큐들에 분배된 얼마 후에 (예컨대, 방법 (400) 의 블록 (404) 의 실행 후에), 다중-프로세서 컴퓨팅 디바이스는, 다중-버전형 태스크의 소유권에 대한 요청이 결정 블록 (406) 에서의 요청 프로세싱 유닛으로부터 수신되었는지 여부를 결정할 수도 있다. 이러한 요청은 인터-프로세서 신호, 인터럽트, 레지스터, 및/또는 컴퓨팅 디바이스의 프로세싱 유닛들 사이에 공유될 수도 있는 다른 데이터를 통해 전송될 수도 있다. 예를 들어, GPU 는 GPU 의 태스크 큐 내에서 특수화된 버전과 연관된 다중-버전형 태스크에 대한 소유권을 요청하기 위해 API 호출을 이용할 수도 있다. 프로세싱 유닛에 의한 예시적인 요청 호출 또는 함수는 도 7 에서 예시된다 (예컨대, 코드 섹션 (706) 에서의 "t->request_ownership()").
요청 프로세싱 유닛으로부터 다중-버전형 태스크의 소유권에 대한 요청이 수신되었다는 결정 (즉, 결정 블록 (406) = "예") 에 응답하여, 다중-프로세서 컴퓨팅 디바이스는, 결정 블록 (412) 에서 다중-버전형 태스크의 소유권이 다른 프로세싱 유닛에 이미 주어졌는지 여부를 결정할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는, "소유권" 변수, 플래그, 및/또는 프로세싱 유닛이 그 특정 다중-버전형 태스크에 대한 소유권을 사전에 획득하였다는 것을 나타내는 다른 표시자가 설정되었는지 여부를 결정하기 위해 다중-버전형 태스크와 연관된 저장된 데이터를 평가할 수도 있다.
소유권이 이미 다른 프로세싱 유닛에 주어졌다는 결정 (즉, 결정 블록 (412) = "예") 에 응답하여, 다중-프로세서 컴퓨팅 디바이스는 블록 (414) 에서 다중-버전형 태스크에 대한 소유권에 대한 요청을 송신한 요청 프로세싱 유닛에 거절 신호를 송신할 수도 있다. 이러한 거절 신호는 요청 프로세싱 유닛으로 하여금 다중-버전형 태스크의 디큐잉된 특수화된 버전을 폐기하게 할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스가, 프로세싱 유닛들이 소유권을 제공받지 않는 것을 나타내기 위해 소유권에 대한 요청들에 대해 응답하는 것에 단순히 실패함에 따라, 블록 (414) 의 동작들은 선택적일 수도 있다.
소유권이 프로세싱 유닛에 이미 주어지지 않았다는 결정 (즉, 결정 블록 (412) = "아니오") 에 응답하여, 요청 프로세싱 유닛은 다중-버전형 태스크의 대응하는 특수화된 버전을 액세스할 맨 처음 것일 수도 있고, 그래서 소유자로서 식별될 수도 있다. 따라서, 블록 (416) 에서, 다중-프로세서 컴퓨팅 디바이스는, 확인응답을 송신하는 등에 의해, 요청 프로세싱 유닛에 요청된 다중-버전형 태스크에 대한 소유권 신호를 송신할 수도 있다.
블록 (418) 에서, 다중-프로세서 컴퓨팅 디바이스는, 다중-버전형 태스크와 연관되는 데이터 구조, 변수, 및/또는 레지스터 내에 요청 프로세싱 유닛의 아이덴티티 (identity) 를 나타내는 데이터를 저장하는 등에 의해, 요청 프로세싱 유닛에 의한 소유권을 표시하기 위해 다중-버전형 태스크와 연관된 저장된 데이터를 업데이트할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는, 다중-버전형 태스크가 프로세싱 유닛에 의해 현재 소유되는 것을 단순히 나타내는 다중-버전형 태스크에 대한 데이터를 저장할 수도 있다.
블록 (420) 에서, 다중-프로세서 컴퓨팅 디바이스는, 요청 프로세싱 유닛의 대응하는 특수화된 버전의 실행의 후속하는 완료 시에 종결되거나 그 외에 완료하도록 다중-버전형 태스크를 구성할 수도 있다. 예를 들어, 요청 프로세싱 유닛이 대응하는 특수화된 버전의 실행을 완료할 때의 얼마 후에, 다중-프로세서 컴퓨팅 디바이스는 다중-버전형 태스크를 완료된 것으로서 마킹할 수도 있다. 달리 말하면, 다중-프로세서 컴퓨팅 디바이스는, 단일 특수화된 버전이 단일 프로세싱 유닛에 의해 실행되는 것에 응답하여, 다중-버전형 태스크가 "소유된" 것으로서 설정하고 모든 연관된 특수화된 버전들이 폐기되도록 (예컨대, 실행되지 않도록) 설정할 수도 있다.
블록 (420) 의 동작들을 수행하는 것에 응답하여, 다중-프로세서 컴퓨팅 디바이스는, 특수화된 버전의 완료 및/또는 요청 소유권을 표시하는 후속하여 수신되는 신호들을 식별하는 등을 위해, 결정 블록 (406) 에서의 결정 동작들로 계속할 수도 있다.
일부 실시형태들에서, 구성은 다중-버전형 태스크로 하여금 지연된 종결을 경험하게 하는 API 명령 "finish_after()" 에 대한 호출을 포함할 수도 있다. 예를 들어, 다중-버전형 태스크에 대한 소유권을 획득하는 것에 응답하여, 다중-프로세서 컴퓨팅 디바이스의 요청 프로세싱 유닛 및/또는 다른 프로세싱 유닛 또는 기능은, 소유권을 획득한 요청 프로세싱 유닛에 의해 실행될 특수화된 버전의 수명에 다중-버전형 태스크의 수명이 연결되도록 설정하기 위해 "finish_after()" 명령을 실행할 수도 있다. 다중-버전형 태스크에 대한 임의의 태스크 종속성들, 대기들 등은 특수화된 버전의 실행에 의해 자동적으로 충족될 수도 있다. 이러한 "finish_after()" 명령의 예시적인 사용은 도 7 에서 예시된다 (예컨대, 코드 섹션 (708)). 이러한 "finish_after()" 명령을 위한 기법들은 2015년 1월 26일 출원된 공동으로 유지된 미국 특허 출원 제 14/604,821 호에서 발견될 수도 있고, 그것의 내용들은 그 전체가 참조에 의해 본원에 통합된다.
다중-버전형 태스크의 소유권에 대한 요청이 프로세싱 유닛으로부터 수신되지 않았다는 결정 (즉, 결정 블록 (406) = "아니오") 에 응답하여, 다중-프로세서 컴퓨팅 디바이스는 결정 블록 (402) 에서 다중-버전형 태스크의 소유권에 대한 후속하는 요청들을 리스닝하는 것을 계속할 수도 있다.
일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는, 프로세싱 유닛이 다중-버전형 태스크에 대한 소유권을 획득한 후에 다중-버전형 태스크의 특수화된 버전이 완료되었는지 여부를 주기적으로 결정하도록 구성될 수도 있다. 이러한 결정은, 다중-버전형 태스크에 대한 소유권을 갖는 프로세싱 유닛으로부터 수신된 신호들에 기초할 수도 있고, 비트, 변수, 레지스터, 또는 다중-버전형 태스크에 대한 소유권을 갖는 프로세싱 유닛에 의해 업데이트될 수도 있는 다른 데이터의 평가들에 기초할 수도 있고, 및/또는 미리정의된 기간의 만료에 기초할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는, GPU 가 각각의 특수화된 버전의 실행을 완료하였다는 것을 나타내고 따라서 다중-버전형 태스크가 역시 종결될 수도 있는 것을 나타내는, 다중-버전형 태스크에 대한 소유권을 이미 획득한 GPU 로부터의 들어오는 신호들에 대해 리스닝할 수도 있다. 이러한 방식으로, 다양한 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 다중-버전형 태스크의 특수화된 버전의 완료를 검출하기 위해 (또는 그것을 통지받기 위해) 주기적 폴링 (polling) 및/또는 이벤트-드라이브 메커니즘들을 이용하도록 구성될 수도 있다.
일부 실시형태들에서, 다중-버전형 태스크의 특수화된 버전이 완료된 것을 결정하는 것에 응답하여, 다중-프로세서 컴퓨팅 디바이스는 다중-버전형 태스크를 마치기 위한 동작들을 수행할 수도 있다. 예를 들어, 다중-프로세서 컴퓨팅 디바이스는 다중-버전형 태스크를 종결 (예컨대, 디큐잉, 무효화 등) 할 수도 있다.
일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는 또한, 다중-버전형 태스크의 특수화된 버전의 식별된 (예컨대, 검출된 또는 통지된) 완료에 응답하여 종결된 다중-버전형 태스크의 관련 특수화된 버전들을 마치기 위한 동작들을 수행할 수도 있다. 예를 들어, GPU 가 GPU 특수화된 버전을 완료하였다고 결정하는 것에 응답하여, CPU 및 DSP 에 대한 특수화된 버전들은 실행 없이 완료 또는 종료되도록 설정될 수도 있다. 다중-버전형 태스크들의 특수화된 버전들 (예컨대, 실행되지 않는 그들 특수화된 버전들) 을 마치기 위해 다중-프로세서 컴퓨팅 디바이스에 의해 수행될 수도 있는 동작들의 다른 예들은, 그 특수화된 버전들로 하여금, 관련된 비-실행된 특수화된 버전들에 할당된 메모리를 해제하고 및/또는 태스크 그룹들을 떠나게 하는 것을 포함할 수도 있다. 일부 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스는, 다중-버전형 태스크의 어떤 다른 특수화된 버전들도 실행되지 않아야 하는 것을 다양한 프로세싱 유닛들에 대해 능동적으로 표시하고 이에 의해 임의의 비실행되는 하지만 여전히 인큐잉되는 특수화된 버전들을 무효로 하기 위해 신호들 또는 인터럽트들을 송신하고, 레지터들을 설정하고, 및/또는 기타 동작들을 수행할 수도 있다. 방법 (405) 은 그 다음에, 다중-버전형 태스크가 오직 하나의 특수화된 버전의 실행을 통해 프로세싱됨으로써 종료될 수도 있다.
도 5a 및 도 5b 는, 다양한 실시형태들에 따른, 다중-버전형 태스크들의 특수화된 버전들을 생성하고 태스크 큐들에 디스패치하기 위해 다중-프로세서 컴퓨팅 디바이스 (예컨대, 컴퓨팅 디바이스 (101)) 에 의해 수행될 수도 있는 명령들을 나타낸느 비-제한적 예시적인 의사코드 (500, 520) 를 나타낸다. 일부 실시형태들에서, 의사코드 (500, 520) 는 다중-프로세서 컴퓨팅 디바이스 상에서 실행되는 런타임 스케줄러 기능 (예컨대, 서비스, 스레드, 애플리케이션 등) 에 의해 수행되는 동작들을 나타낼 수도 있다. 일부 실시형태들에서, 의사코드 (500) 는 다양한 주 구현들 (예컨대, 버전들[0], ... 버전들[n]) 을 위해 사용되고, 따라서, 실시형태들 및/또는 청구항들을 제한하도록 의도되지 아니한다.
도 5a 를 참조하면, 의사코드 (500) 는, 다중-프로세서 컴퓨팅 디바이스의 특정 프로세싱 유닛들 상에서 수행되도록 각각 설계되는 하나 이상의 특수화된 버전들을 갖는 새로운 다중-버전형 태스크들을 생성하기 위해 프로세싱 유닛 (예컨대, CPU (102), 애플리케이션 프로세서 등) 에 의해 실행될 수도 있는 명령들의 비-제한적 예를 나타낸다. 특히, 의사코드 (500) 는, 생성될 다중-버전형 태스크를 위해 지원되는 특수화된 버전들을 나타내는 튜플 (tuple) 을 포함하는, 다양한 인수들로 불릴 수도 있는 함수 (즉, "create_task" 함수) 를 나타낼 수도 있다. 예를 들어, 튜플은 GPU, DSP, 및 CPU 특수화된 버전들이 생성되어야 하는 것을 나타낼 수도 있다. 일부 실시형태들에서, 함수에 대한 튜플 인수에서 특수화된 버전이 표시되는 순서는 상대적인 우선권 또는 우선순위를 나타낼 수도 있다.
의사코드 (500) 는 제 1 코드 섹션 (502) 내의 명령들에 의해 그 자체로 호출될 수도 있는 재귀 함수를 포함하는 제 2 코드 섹션 (502) 을 포함할 수도 있다. 예를 들어, 'create_task' 함수를 이용하여 태스크를 생성하는 제 1 코드 서브섹션 (504) 이 포함될 수도 있다. 제 1 코드 서브섹션 (504) 이 특정 태스크에 관해 실행되는 제 1 시간에서, "메인 (main)" 다중-버전형 태스크가 생성될 수도 있다. 제 2 코드 서브섹션 (506) (예컨대, 'for' 루프) 은 메인 다중-버전형 태스크를 위해 링크 (또는 에 의해 참조) 될 수도 있는 특수화된 버전들 (또는 "대안들") 을 생성하도록 수행될 수도 있다. 예를 들어, 각각의 특수화된 버전 (또는 "대안") 을 위한 포인터 데이터는 메인 다중-버전형 태스크와 관련되어 저장될 수도 있다.
일부 실시형태들에서, 태스크 생성은 프로그래머 (예컨대, 태스크들을 생성하기 위한 코드 내의 삽입 함수 호출들 또는 API 호출들 등) 및/또는 컴파일러 또는 런타임 시스템에 기초하여 개시되거나 그 외에 실행될 수도 있다.
도 5b 를 참조하면, 의사코드 (520) 는, 디바이스의 프로세싱 유닛들 (예컨대, CPU (102), CPU (112), GPU (122), DSP (132) 등) 의 태스크 큐들에 대해, 다양한 태스크들, 다중-버전형 또는 그 외의 것을을 스케줄링 (또는 디스패치) 하기 위해, 프로세싱 유닛 (예컨대, CPU (102), 애플리케이션 프로세서 등) 에 의해 주기적으로 실행되는 하나 이상의 방법들, 함수들, 루틴들, 또는 다른 로직의 명령들의 비-제한적 예를 나타낸다. 의사코드 (520) 내의 특정 프로세싱 유닛들 (예컨대, big.Little 코어, GPU 등) 에 대한 임의의 언급들은 예시의 목적들을 위한 것이고, 따라서, 실시형태들 또는 청구항들을 임의의 특정 프로세싱 유닛들로 제한하도록 의도되지 아니한다.
의사코드 (520) 는 태스크를 스케줄링하기 위한 제 1 코드 섹션 (522) 을 포함할 수도 있다. 제 1 코드 섹션 (522) 은, 태스크가 대안들을 가지지 않는다는 (즉, 태스크가 다중-버전형 태스크가 아니라는) 결정에 응답하여 수행될 수도 있는 제 1 코드 서브섹션 (524) (예컨대, 'if' 블록) 을 포함할 수도 있고, 여기서, 태스크는 프로세싱 유닛의 태스크 큐에서 단순히 인큐잉될 수도 있다.
제 2 코드 서브섹션 (526) (예컨대, 'else' 블록) 은, 식별된 태스크가 대안들을 가진다는 (즉, 태스크가 다중-버전형 태스크라는) 결정에 응답하여 수행될 수도 있고, 컴퓨팅 디바이스의 다양한 프로세싱 유닛들의 태스크 큐들 중 하나에서 다중-버전형 태스크의 특수화된 버전들 (또는 "대안들") 의 각각에 대한 포인터들을 인큐잉하기 위한 동작들을 포함할 수도 있다. 이러한 포인터들은 포인터의 최하위 4 비트들과 같이 사용되지 않는 비트들에서 인코딩된 식별자들일 수도 있다. 예를 들어, 제 2 코드 서브섹션 (526) 은 N 태스크 포인터들을 적절한 태스크 큐들에 푸쉬 (push) 하기 위해 수행될 수도 있고, 여기서, N 은 주어진 다중-버전형 태스크의 특수화된 버전들 (또는 구현들) 의 수일 수도 있고, 개별 대안 넘버들은 각각의 태스크 포인터에서 인코딩된다. 제 2 코드 섹션 (528) 은 태스크 포인터에 마스크 (또는 비트 마스크) 를 적용함으로써 생성된 식별자에 기초하여 프로세싱 유닛들의 적절한 태스크 큐들 내로 태스크들을 인큐잉하기 위한 동작들을 포함할 수도 있다. 코드 섹션 (528) 에서의 다양한 "push(task)" 동작들은 태스크들이 디큐잉될 때까지 태스크들에 대한 대안적인 인코딩들을 보유하여 수행될 수도 있다.
도 6 은, 다양한 실시형태에 따른, 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스 (예컨대, 도 1 내지 도 3c 의 다중-프로세서 컴퓨팅 디바이스 (101)) 의 프로세싱 유닛 (예컨대, 도 1 내지 도 3c 의 프로세싱 유닛들 (102, 112, 122, 132) 중 어느 것) 에 의해 수행되는 방법 (600) 을 나타낸다. 다양한 실시형태들에서, 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛들의 각각은 본 명세서에서 설명된 바와 같이 다중-버전형 태스크들의 특수화된 버전들을 핸들링하기 위해 방법 (600) 을 계속적으로 실행하도록 구성될 수도 있다. 예를 들어, 제 1 CPU (예컨대, 도 1 내지 도 3c 의 프로세싱 유닛 (102)), 제 2 CPU (예컨대, 도 1 내지 도 3c 의 프로세싱 유닛 (112)), GPU (예컨대, 도 1 내지 도 3c 의 프로세싱 유닛 (122)), 및 DSP (예컨대, 도 1 내지 도 3c 의 프로세싱 유닛 (132)) 는 모두, 다중-버전형 태스크들에 대한 소유권을 획득하고 관련된 특수화된 버전들을 실행하기 위해 방법 (600) 의 독립적 인스턴스들을 독립적으로 그리고 동시에 실행하도록 구성될 수도 있다. 방법 (600) 의 다양한 동작들은 프로세싱 유닛들을 제어 및 그 외에 동작시키도록 구성된 다양한 소프트웨어, 스레드들, 루틴들, 명령들 및/또는 다른 기능들을 통해 수행될 수도 있다. 예를 들어, 스레드 (예컨대, 태스크 큐와 연관된 스레드 풀에서의 DSP 스레드) 는 태스크 큐로부터 태스크 포인터들을 디큐잉하기 위해 방법 (600) 을 수행하고 적절한 경우에 다중-버전형 태스크들의 소유권을 획득하기 위한 동작들을 수행할 수도 있다.
블록 (602) 에서, 프로세싱 유닛은 프로세싱 유닛에 의해 실행될 다음 태스크를 디큐잉할 수도 있다. 일부 실시형태들에서, 다음 태스크를 디큐잉하는 것은 태스크 큐로부터 포인터를 제거하는 것을 포함할 수도 있다. 결정 블록 (604) 에서, 프로세싱 유닛은 디큐잉된 태스크가 다중-버전형 태스크의 특수화된 버전인지 여부를 결정할 수도 있다. 예를 들어, 프로세싱 유닛은 식별자를 획득하기 위해 다양한 비트 마스크들을 포인터에 적용할 수도 있고, 그 식별자가 다중-버전형 태스크의 임의의 특수화된 버전들 (또는 "대안적인" 넘버들) 에 대응하는지 여부를 결정할 수도 있다. 그 결정을 수행하기 위한 예시적인 동작들은 도 7 에서 예시된다 (예컨대, 코드 섹션 (702), 코드 섹션 (704) 에서의 명령 "t->has_alternatives").
일부 실시형태들에서, 프로세싱 유닛은, 디큐잉된 태스크가 다중-버전형 태스크인지 또는 오직 하나의 버전을 갖는 단지 통상적인 태스크인지 여부를 표시하는 저장된 데이터와 디큐잉된 태스크의 식별자를 비교하기 위해 테이블 또는 다른 저장 구조 내의 룩-업 (look-up) 을 수행할 수도 있다. 이러한 구현들은 특수화된 버전들을 식별하기 위해 태스크 큐들 내에 배치된 개별적 포인트들에 적용될 비트 마스크들을 필요로하지 않을 수도 있다. 다음은 이러한 구현의 예시이다. 프로세싱 유닛은 제 1 프로세싱 유닛의 태스크 큐로부터 포인터를 취출 (또는 디큐잉) 할 수도 있고, 여기서, 포인터는 다중-버전형 태스크에 대해 지원되는 특수화된 버전을 갖는 각각의 프로세싱 유닛에 대한 태스크 큐에서 배치된 공통의 다중-버전형 태스크 포인터일 수도 있다. 일단 취출되면, 프로세싱 유닛은, 포인터가 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관되는지 여부를 결정 (즉, 포인터와 연관된 대안들이 존재하는지 여부를 결정) 할 수도 있다. 포인터와 연관된 특수화된 버전들의 리스트가 존재하는 경우에, 다중-프로세서 컴퓨팅 디바이스는 그 다음에, 프로세싱 유닛에 대응하는 특수화된 버전들의 리스트로부터 다중-버전형 태스크의 특수화된 버전들을 식별할 수도 있다. 예를 들어, 프로세싱 유닛이 GPU 인 경우에, 프로세싱 유닛은 GPU 특수화된 버전이 리스트 내에 있는 것을 식별할 수도 있다. 대응하는 특수화된 버전이 리스트에서 식별되는 경우에. 프로세싱 유닛은 그 다음에, 다중-버전형 태스크에 대한 소유권을 획득하고 대응하는 특수화된 버전을 실행하는 것으로 진행할 수도 있다.
디큐잉된 태스크가 다중-버전형 태스크의 특수화된 버전이 아니라고 결정 (즉, 결정 블록 (604) = "아니오") 에 응답하여, 프로세싱 유닛은 블록 (612) 에서 디큐잉된 태스크를 실행할 수도 있다. 일부 실시형태들에서, 프로세싱 유닛은 선택적 블록 (614) 에서 디큐잉된 태스크의 완료를 나타내는 신호를 송신하도록 구성될 수도 있다. 일부 실시형태들에서, 디큐잉된 태스크의 완료는, 디큐잉된 태스크가 완전히 실행된 것을 다중-프로세서 컴퓨팅 디바이스 (및/또는 다양한 프로세싱 유닛들) 에 대해 표시하기 위해 변수, 플래그, 비트, 또는 다른 저장된 데이터를 설정함으로써 대신에 표시될 수도 있다.
디큐잉된 태스크가 다중-버전형 태스크의 특수화된 버전이라고 결정 (즉, 결정 블록 (604) = "예") 하는 것에 응답하여, 프로세싱 유닛은 선택적 결정 블록 (606) 에서 다중-버전형 태스크가 다른 프로세싱 유닛에 의해 이미 소유되었고 및/또는 완료되었는지 (그리고 따라서 전체 다중-버전형 태스크가 완료되었는지) 여부를 결정할 수도 있다. 달리 말하면, 프로세싱 유닛은, 대응하는 태스크 큐로부터의 특수화된 버전이 연전히 유효하고 소유권이 획득될 수 있는 경우에 프로세싱 유닛에 의해 실행되어야 하는지 여부를 결정할 수도 있다. 다중-버전형 태스크의 소유권이 프로세싱 유닛에 의해 획득될 수 없는 경우에, 다중-버전형 태스크는 다른 프로세싱 유닛에 의해 완료되었거나 완료되고 있으며, 따라서, 프로세싱 유닛은 단순히 그 태스크를 폐기하고 다른 태스크들을 프로세싱하는 것으로 계속할 수도 있다. 프로세싱 유닛은, 다중-버전형 태스크의 상태를 표시하는 비트, 변수, 레지스터, 및/또는 다른 저장된 정보를 평가하고, 업데이트 요청을 런타임 기능에 송신하며, 및/또는 디큐잉된 특수화된 버전과 연관하여 저장된 정보가 완료된 상태를 표시하는지 여부를 평가하는 등에 의해, 다양한 방식들로 다중-버전형 태스크가 완료도었는지 여부를 결정할 수도 있다.
다중-버전형 태스크가 이미 소유되었고 및/또는 완료되었다고 결정 (즉, 선택적 결정 블록 (606) = "예") 하는 것에 응답하여, 프로세싱 유닛은 블록 (607) 에서 (프로세싱 유닛에 할당된 특수화된 버전을 나타내는) 실행되지 않는, 디큐잉된 태스크에 대한 데이터를 폐기하고, 블록 (602) 에서의 디큐잉 동작들로 복귀할 수도 있다.
다중-버전형 태스크의 어떤 다른 특수화된 버전도 다른 프로세싱 유닛에 의해 완료되지 않았다는 결정 (즉, 선택적 결정 블록 (606) = "아니오") 에 응답하여, 다중-버전형 태스크는 아직 소유되지 않았고, 프로세싱 유닛은 여전히 대응하는 특수화된 버전을 실행하는 것이 가능할 수도 있다. 따라서, 블록 (608) 에서, 프로세싱 유닛은, 다중-버전형 태스크들을 스케줄링 및/또는 관리하도록 구성된 런타임 기능에 요청 신호를 송신하는 등에 의해, 다중-버전형 태스크의 소유권을 요청할 수도 있다. 소유권을 요청하기 위한 예시적인 호출은 도 7 에서 예시된다 (예컨대, 코드 섹션 (706)).
결정 블록 (610) 에서, 프로세싱 유닛은, 다중-버전형 태스크의 소유권이 프로세싱 유닛에 의해 획득되었는지 여부를 결정할 수도 있다. 예를 들어, 프로세싱 유닛은, 다중-버전형 태스크들을 스케줄링 및 관리하도록 구성된 런타임 기능으로부터의 응답이 프로세싱 유닛에 다중-버전형 태스크의 소유권을 제공하였는지 여부를 결정하기 위해 들어오는 메시지 버퍼 및/또는 저장된 비트, 변수, 레지스터, 및/또는 다른 정보를 지속적으로 모니터링할 수도 있다.
프로세싱 유닛에 의해 소유권이 획득되지 않았다고 결정 (즉, 결정 블록 (610) = "아니오") 에 응답하여, 다중-버전형 태스크 (및 따라서 프로세싱 유닛에 할당되지만 실행되지 않은 특수화된 버전) 가 다른 프로세싱 유닛에 의해 소유되는 것으로 고려될 수도 있고, 따라서, 프로세서는 블록 (607) 에서 실행되지 않는, 디큐잉된 태스크에 대한 데이터를 폐기할 수도 있다. 예를 들어, 프로세싱 유닛은 다중-버전형 태스크의 특수화된 버전에 대한 태스크 포인터를 폐기할 수도 있다. 프로세싱 유닛은 그 다음에, 블록 (602) 에서의 디큐잉 동작들로 계속할 수도 있다.
프로세싱 유닛에 의해 소유권이 획득되었다는 결정 (즉, 결정 블록 (601) = "예") 에 응답하여, 프로세싱 유닛은 블록 (611) 에서 다중-버전형 태스크의 다른 특수화된 버전들이 디큐잉될 때 디스에이블되어야 하는 것을 나타내는 신호를 송신할 수도 있다. 예를 들어, 다른 특수화된 버전들을 디스에이블하기 위해 프로세싱 유닛의 특수화된 버전의 완료까지 대기할 필요성이 존재하지 않으므로, 신호는 다른 프로세싱 유닛들로 하여금 다중-버전형 태스크의 다른 특수화된 버전들에 대해 인큐잉된 다른 특수화된 버전들을 디스에이블하고 및/또는 디큐잉된 태스크 포인터 데이터를 폐기하게 할 수도 있다.
일부 실시형태들에서, 프로세싱 유닛은 다중-버전형 태스크로 하여금 지연된 종결을 경험하게 하는 API 명령 "finish_after()" 에 대한 호출을 실행할 수도 있다 (예를 들어, 다중-버전형 태스크는 프로세싱 유닛이 디큐잉된 태스크를 충분하게 완전히 실행하기까지 완료하지 않을 수도 있다). 예를 들어, 프로세싱 유닛은 다중-버전형 태스크의 수명을 디큐잉된 태스크의 수명에 연결되도록 "finish_after()" 명령을 실행할 수도 있고, 따라서, 런타임 기능이 다중-버전형 태스크 (및 다중-버전형 태스크와 연관된 모든 다른 특수화된 버전들) 를 끝내게 할 수도 있다. 이러한 "finish_after()" 명령의 예시적인 사용은 도 7 에서 예시된다 (예컨대, 코드 서브섹션 (708)).
프로세싱 유닛은 블록 (612) 에서 디큐잉된 태스크 (즉, 다중-버전형 태스크의 특수화된 버전) 를 실행하고, 선택적 블록 (614) 에서 디큐잉된 태스크가 완료된 것을 나타내는 신호를 송신함으로써 계속할 수도 있고, 블록 (602) 에서 디큐잉 동작들로 계속할 수도 있다.
도 7 은 다양한 실시형태들에 따른, 다중-버전형 태스크들의 특수화된 버전들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스 (예컨대, 도 1 내지 도 3c 의 다중-프로세서 컴퓨팅 디바이스 (101)) 의 프로세싱 유닛에 의해 수행될 수도 있는 명령들을 나타내는 예시적인 의사코드 (700) 를 나타낸다. 예를 들어, 의사코드 (700) 는 다양한 태스크들, 다중-버전형 또는 그 외의 것을 프로세싱하기 위해 프로세싱 유닛 (예컨대, CPU (102), CPU (112), GPU (122), DSP (132) 등) 에 의해 주기적으로 실행되는 하나 이상의 방법들, 함수들, 루틴들, 또는 다른 로직의 명령들을 나타낼 수도 있다.
비-제한적 예시로서, 의사코드 (700) 는 프로세싱 유닛의 태스크 큐로부터 포인터들을 디큐잉하기 위해 제 1 코드 섹선 (402) 을 포함할 수도 있고, 여기서, 마스크들 (예컨대, 비트 마스크들) 은 태스크 (예컨대, 다중-버전형 태스크 아이덴티티) 및 태스크에 대한 임의의 다른 표시 (예컨대, 다중-버전형 태스크들에 대한 대안적인 넘버 또는 버전 넘버들) 를 식별하기 위해 포인터들에 적용될 수도 있다. 제 2 코드 섹션 (704) (예컨대, 'if' 블록) 은, 식별된 태스크가 아무런 대안들도 가지지 않는다 (즉, 태스크가 다중-버전형 태스크가 아니다) 고 결정하는 것에 응답하여 수행될 수도 있다. 제 3 코드 섹션 (706) (예컨대, 'else' 블록) 은, 식별된 태스크가 대안들을 가진다 (즉, 태스크가 다중-버전형 태스크이다) 고 결정하는 것에 응답하여 수행될 수도 있고, 다중-버전형 태스크에 대한 소유권을 요청/획득하기 위한 동작들을 포함할 수도 있다. 제 3 코드 섹션 (706) 은, 다중-버전형 태스크에 대한 소유권이 프로세싱 유닛에 의해 획득되었다고 결정하는 것에 응답하여 프로세싱 유닛에 의해 수행될 수도 있는 제 1 코드 서브섹션 (708) (예컨대, 'if' 블록) 을 포함할 수도 있다. 제 1 코드 서브섹션 (708) 은 다중-버전형 태스크가 버전의 완료 시에 종료 (또는 종결) 되도록 구성하기 위한 동작들 및 그 버전을 실행하기 위한 동작들을 포함할 수도 있다. 제 3 코드 섹션 (706) 은 또한, 다중-버전형 태스크의 소유권이 프로세싱 유닛에 의해 획득되지 않았다고 결정하는 것에 응답하여 비어있고 그 외에 프로세싱 유닛에 의해 수행될 동작들을 포함하지 않을 수도 있는 제 2 코드 서브섹션 (710) (예컨대, 'else' 블록) 을 포함할 수도 있다. 예를 들어, 다중-버전형 태스크의 특수화된 버전에 대해 소유권이 획득될 수 없을 때, 프로세싱 유닛은 특수화된 버전을 수행하지 않을 수도 있고, 하지만 대신에, 특수화된 버전에 대한 데이터를 폐기하고, 태스크 큐에서의 다른 태스크들을 프로세싱하는 것으로 진행할 수도 있다.
도 8 은 다중-버전형 태스크들의 특수화된 버전들 및 우선순위 태스크들을 실행하기 위해 다중-프로세서 컴퓨팅 디바이스의 프로세싱 유닛에 의해 수행되는 방법 (800) 을 나타낸다. 방법 (800) 은, 그 방법 (800) 이 우선순위 태스크들을 식별 및 프로세싱하기 위한 추가적인 동작들을 포함할 수도 있는 점을 제외하고는 도 6 의 방법 (600) 과 유사할 수도 있다. 기술된 바와 같이, 이러한 우선순위 태스크들은 프로세싱 유닛에 대해 고유하게 적합화될 수도 있고, 따라서, 다중-버전형 태스크들의 병렬적 프로세싱에 참여하는 자원을 소비하기 이전에 프로세싱 유닛에 의해 실행되어야 한다. 예를 들어, DSP 또는 CPU 에서 대신에 실행될 수 있는 다른 버전들을 갖는 공통의 다중-버전형 태스크의 GPU 버전을 수행하는 대신에, GPU 프로세싱 유닛은 다중-버전형 태스크에 대한 소유권을 획득하기 이한 동작들을 수행하고 GPU 버전을 실행하기 전에 렌더링 태스크를 실행할 수도 있다. 이러한 방식으로, 프로세싱 유닛은, 그 프로세싱 유닛의 선천적인 활동성들을 손상시킴이 없이 병렬적 프로세싱 정책들에 참여할 수도 있다.
블록들 (602-614) 의 동작들은 도 6 을 참조하여 설명된 유사하게 넘버링된 블록들의 동작들과 유사할 수도 있다. 디큐잉된 태스크가 다중-버전형 태스크의 특수화된 버전이라고 결정 (즉, 결정 블록 (604) = "예") 하는 것 및 다중-버전형 태스크가 다른 프로세싱 유닛에 의해 이미 소유되고 및/또는 완료되지 않았다고 결정 (즉, 선택적 결정 블록 (606) = "아니오") 하는 것에 응답하여, 프로세싱 유닛은 결정 블록 (802) 에서 태스크 큐에서 하나 이상의 우선순위 태스크들이 존재하는지 여부를 결정할 수도 있다. 예를 들어, 프로세싱 유닛은, 임의의 것이 프로세싱 유닛에 대해 우선순위로서 미리정의된 코드들, 함수들, 및/또는 활동들에 대응하는지 여부를 결정하기 위해 태스크 큐에서 현재 인큐잉되는 임의의 다른 태스크들의 타입 및 기능을 분석할 수도 있다. 다른 예로서, GPU 프로세싱 유닛은 임의의 디스플레이 및/또는 렌더링 관련 태스크들이 현재 인큐잉되는지 여부를 결정할 수도 있다. 일부 실시형태들에서, 우선순위 태스크들, 다중-버전형 태스크들, 및 정규 태스크들은 모두 동일한 우선순위 큐 내에 있을 수도 있다. 일부 실시형태들에서, 우선순위 태스크들은 다중-버전형 태스크들 및 다른 태스크들과는 상이한 큐에 있을 수도 있고, 프로세싱 유닛은 비-우선순위 큐에서의 태스크들을 프로세싱하기 전에 우선순위 큐에서의 태스크들을 프로세싱하도록 구성될 수도 있다.
태스크 큐에서 우선순위 태스크들이 존재하지 않는다고 결정 (즉, 결정 블록 (802) = "아니오") 하는 것에 응답하여, 프로세싱 유닛은 블록 (608) 에서 디큐잉된 특수화된 버전과 연관된 다중-버전형 태스크에 대한 소유권을 요청할 수도 있다.
태스크 큐에서 적어도 하나의 우선순위 태스크가 존재한다고 결정 (즉, 결정 블록 (802) = "예") 하는 것에 응답하여, 프로세싱 유닛은 우선순위 태스크(들)를 먼저 프로세싱하기 위해 다중-버전형 태스크의 디큐잉된 특수화된 버전을 프로세싱하는 것을 미룰 수도 있다. 블록 (804) 에서, 프로세싱 유닛은 하나 이상의 우선순위 태스크들을 디큐잉 및 실행할 수도 있다. 일부 실시형태들에서, 프로세싱 유닛은 우선순위 태스크들을 한번에 하나식 또는 대안적으로는 한꺼번에 실행할 수도 있다. 블록 (806) 에서, 프로세싱 유닛은 다중-버전형 태스크의 특수화된 버전을 태스크 큐 상으로 다시 역으로 푸쉬할 수도 있다. 일부 실시형태들에서, 우선순위 태스크들을 취출하기 위해 디큐잉되었던 다른 태스크들은 또한 순서대로 태스크 큐 상으로 다시 역으로 푸쉬될 필요성이 있을 수도 있다. 다중-프로세서 컴퓨팅 디바이스는 블록 (602) 에서 프로세싱 유닛에 의해 실행될 다음 태스크를 디큐잉할 수도 있다.
일부 실시형태들에서, 블록 (804-806) 의 동작들은, 프로세싱 유닛이 특정 실행 순서를 필요로할 수도 있는 종속성들 또는 제한들이 존재하지 않는다고 결정하는 것에 응답하여서만 수행될 수도 잇다. 예를 들어, 프로세싱 유닛은, 우선순위 태스크들이, 그 우선순위 태스크들 전에 있는 큐 내에서의 다중-버전형 태스크 및/또는 다른 태스크들에 종속적이지 않다고 결정하는 것에 응답하여, 다중-버전형 태스크의 특수화된 버전 전에 그 우선순위 태스크들을 오직 디큐잉 및 실행할 수도 있다.
퍼스널 컴퓨터들, 모바일 디바이스들, 및 랩톱 컴퓨터들을 포함하는 다중-프로세서 컴퓨팅 디바이스들의 다양한 형태들은 다양한 실시형태들을 구현하기 위해 사용될 수도 있다. 이러한 컴퓨팅 디바이스들은 통상적으로, 예시적인 다중-프로세서 컴퓨팅 디바이스 (900) 를 나타내는 도 9 에 도시된 컴포넌트들을 포함할 수도 있다. 다양한 실시형태들에서, 모바일 디바이스 (900) 는 터치 스크린 제어기 (904) 및 내부 메모리 (902) 를 포함할 수도 있다. 프로세서 (901) 는 일반적 또는 특정적 프로세싱 태스크들을 위해 지정된 복수의 멀티-코어 IC 들을 포함할 수도 있다. 일부 실시형태들에서, 다른 프로세싱 유닛들이 또한, 프로세서 (901) (예컨대, GPU, DSP 등) 에 포함되고 커플링될 수도 있다.
내부 메모리 (902) 는 휘발성 및/또는 비-휘발성 메모리일 수도 있고, 또한 보안 및/또는 암호화된 메모리, 또는 비보안 및/또는 비암호화된 메모리, 또는 이들의 임의의 조합일 수도 있다. 터치스크린 제어기 (904) 및 프로세서 (901) 는 또한, 터치스크린 패널 (912), 예컨대 저항성-감지 터치스크린, 용량성-감지 터치스크린, 적외선 감지 터치스크린 등에 커플링될 수도 있다. 모바일 디바이스 (900) 는, 서로 및/또는 프로세서 (901) 에 커플링된, 전송 및 수신을 위한 하나 이상의 무선 신호 트랜시버들 (908)(예컨대, 블루투스®, 지그비®, Wi-Fi®, RF 라디오) 및 안테나들 (910) 을 가질 수도 있다. 트랜시버들 (908) 및 안테나들 (910) 은 다양한 무선 송신 프로토콜 스택들/인터페이스들을 구현하도록 전술된 회로와 사용될 수도 있다. 모바일 디바이스 (900) 는 셀룰러 네트워크를 통해 통신을 인에이블하고 프로세서 (901) 에 커플링되는 셀룰러 네트워크 무선 모뎀 칩 (916) 을 포함할 수도 있다. 모바일 디바이스 (900) 는 프로세서 (901) 에 커플링된 주변 디바이스 접속 인터페이스 (918) 를 포함할 수도 있다. 주변 디바이스 접속 인터페이스 (918) 는 하나의 타입의 접속을 수락하도록 단수로 구성될 수도 있고, 또는 다양한 타입들의 물리적 및 통신 접속들, 공동 또는 사설, 예컨대 USB, 파이어와이어, 썬더볼트, 또는 PCIe 를 수락하도록 다중으로 구성될 수도 있다. 주변 디바이스 접속 인터페이스 (918) 는 또한, 유사하게 구성된 주변 디바이스 접속 포트 (미도시) 에 커플링될 수도 있다. 모바일 디바이스 (900) 는 또한, 오디오 출력들을 제공하기 위한 스피커들 (914) 을 포함할 수도 있다. 모바일 디바이스 (900) 는 또한, 본원에 논의된 컴포넌트들의 전부 또는 일부를 포함하기 위한, 플라스틱, 금속, 또는 재료들의 조합으로 구성된 하우징 (920) 을 포함할 수도 있다. 모바일 디바이스 (900) 는 프로세서 (901) 에 커플링된 전원 (922), 예컨대 일회용 또는 재충전 가능한 배터리를 포함할 수도 있다. 재충전 가능한 배터리는 또한, 모바일 디바이스 (900) 외부의 소스로부터 충전 전류를 수신하도록 주변 디바이스 접속 포트에 커플링될 수도 있다.
본 명세서에서 기술된 다양한 프로세서들 (또는 프로세싱 유닛들) 은, 본원에 기술된 다양한 실시형태들의 기능들을 포함하는 다양한 기능들을 수행하도록 소프트웨어 명령들 (애플리케이션들) 에 의해 구성될 수도 있는 임의의 프로그래밍가능 마이크로프로세서, 마이크로컴퓨터 또는 다중 프로세서 칩 또는 칩들일 수도 있다. 다양한 디바이스들에서, 무선 통신 기능들에 전용되는 하나의 프로세서 및 다른 애플리케이션들을 실행하도록 전용되는 하나의 프로세서와 같이 다중 프로세서들이 제공될 수도 있다. 통상적으로, 소프트웨어 애플리케이션들은 그들이 프로세서들에 의해 액세스 및 로딩되기 전에 내부 메모리에 저장될 수도 있다. 프로세서들은 애플리케이션 소프트웨어 명령들을 저장하기에 충분한 내부 메모리를 포함할 수도 있다. 많은 디바이스들에서, 내부 메모리는 휘발성 또는 플래시 메모리와 같은 비휘발성 메모리, 또는 양자의 혼합일 수도 있다. 이 설명의 목적들을 위해, 메모리에 대한 일반적인 언급은 프로세서들 내의 메모리 및 다양한 디바이스들 내로 플러그인되는 착탈형 메모리 또는 내부 메모리를 포함하는 프로세서들에 의해 액세스가능한 메모리를 지칭한다.
전술한 방법 설명들 및 프로세스 흐름도들은 단지 예시적인 예들로서 제공되고, 다양한 실시형태들의 동작들이 제시된 순서로 수행되어야 함을 요구하거나 암시하는 것으로 의도되지는 않는다. 통상의 기술자에 의해 인지되는 바와 같이, 상기의 실시형태들에서의 동작들의 순서는 임의의 순서로 수행될 수도 있다. "그 후에", "그러면", 다음으로" 등과 같은 단어들은 동작들의 순서를 제한하도록 의도되지 않으며; 이들 단어들은 단지 방법들의 설명을 통해 독자를 가이드하는데 사용된다. 또한, 예를 들어, 관사 "하나 (a)", "한 (an)", 또는 "그 (the)" 를 사용하여 단수형으로 엘리먼트들을 청구하는 임의의 참조는 엘리먼트를 단수형으로 제한하는 것으로서 해석되지 않는다.
본원에 개시된 실시형태들과 연관되어 설명된 다양한 예시적인 논리 블록들, 모듈들, 회로들, 및 알고리즘 동작들은 전자적 하드웨어, 컴퓨터 소프트웨어, 또는 양자 모두의 조합들로서 구현될 수도 있다. 하드웨어와 소프트웨어의 이러한 상호교환성을 명확하게 예시하기 위해, 다양한 예시적인 컴포넌트들, 블록들, 모듈들, 회로들, 및 동작들이 그들의 기능성에 대해 일반적으로 전술되었다. 그러한 기능이 하드웨어 또는 소프트웨어로 구현되는지 여부는 특정 애플리케이션 및 전체 시스템에 부과되는 설계 제약들에 의존한다. 통상의 기술자는, 설명된 기능성을 각각의 특정 애플리케이션에 대해 다양한 방식으로 구현할 수도 있지만, 이러한 구현 결정들은 본 청구항들의 범위를 벗어나게 하는 것으로 이해되어서는 안된다.
본원에서 개시된 실시형태들과 연계하여 설명된 다양한 예시적인 로직들, 논리 블록들, 모듈들, 및 회로들은 범용 프로세서, 디지털 신호 프로세서 (digital signal processor; DSP), 주문형 집적 회로 (application specific integrated circuit; ASIC), 필드 프로그래밍가능 게이트 어레이 (field programmable gate array; FPGA) 또는 다른 프로그래밍가능 로직 디바이스, 이산 게이트 또는 트랜지스터 로직, 이산 하드웨어 컴포넌트들, 또는 본원에 설명된 기능들을 수행하도록 설계된 것들의 임의의 조합으로 구현되거나 수행될 수도 있다. 범용 프로세서는 마이크로프로세서일 수도 있지만, 대안에서, 프로세서는 임의의 종래의 프로세서, 제어기, 마이크로제어기, 또는 상태 머신일 수도 있다. 프로세서는 또한, 컴퓨팅 디바이스들의 조합, 예를 들어 DSP와 마이크로프로세서의 조합, 복수의 마이크로프로세서들, DSP 코어와 연계한 하나 이상의 마이크로프로세서들, 또는 임의의 다른 그러한 구성으로 구현될 수도 있다. 대안으로, 일부 동작들 또는 방법들은 주어진 기능에 특정한 회로부에 의해 수행될 수도 있다.
하나 이상의 예시적인 실시형태들에서, 기술된 기능들은 하드웨어, 소프트웨어, 펌웨어 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현된 경우, 기능들은 비-일시적 프로세서-판독가능, 컴퓨터-판독가능, 서버-판독가능 매체 또는 비-일시적 프로세서-판독가능 저장 매체 상에 하나 이상의 명령들 또는 코드로서 저장되거나 그것들을 통해 송신될 수도 있다. 본원에 개시된 방법 또는 알고리즘의 동작들은 비-일시적 컴퓨터-판독가능 저장 매체, 비-일시적 서버-판독가능 저장 매체, 및/또는 비-일시적 프로세서-판독가능 저장 매체 상에 상주할 수도 있는 프로세서-실행가능 소프트웨어 모듈 또는 프로세서-실행가능 소프트웨어 명령들로 구현될 수도 있다. 다양한 실시형태들에서, 이러한 명령들은 저장된 프로세서-실행가능 명령들 또는 저장된 프로세서-실행가능 소프트웨어 명령들일 수도 있다. 유형의, 비-일시적 컴퓨터-판독가능 저장 매체들은 컴퓨터에 의해 액세스될 수도 있는 임의의 이용가능한 매체들일 수도 있다. 비제한적인 예로서, 이러한 비-일시적 컴퓨터-판독가능 매체들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광학 디스크 스토리지, 자기 디스크 스토리지 또는 다른 자기 데이터 저장 디바이스들, 또는 원하는 프로그램 코드를 명령들 또는 데이터 구조들의 형태로 저장하는데 사용될 수도 있으며 컴퓨터에 의해 액세스될 수도 있는 임의의 다른 매체를 포함할 수 있다. 본 명세서에서 사용된 디스크 (disk) 및 디스크 (disc) 는, 컴팩트 디스크 (CD), 레이저 디스크, 광학 디스크, 디지털 다기능 디스크 (DVD), 플로피 디스크 및 블루레이 디스크를 포함하며, 여기서 디스크 (disk) 는 통상 자기적으로 데이터를 재생하고, 디스크 (disc) 는 레이저를 이용하여 광학적으로 데이터를 재생한다. 상기의 조합들이 또한, 비-일시적 컴퓨터-판독가능 매체들의 범위 내에 포함되어야 한다. 부가적으로, 방법 또는 알고리즘의 동작들은 컴퓨터 프로그램 제품에 포함될 수도 있는 유형의, 비-일시적 프로세서-판독가능 저장 매체 및/또는 컴퓨터-판독가능 매체 상의 코드들 및/또는 명령들의 하나 또는 임의의 조합 또는 셋트로서 상주할 수도 있다.
개시된 실시형태들의 상기 설명들은 임의의 통상의 기술자가 청구항들의 실시형태의 기법들을 실시하거나 사용하는 것을 가능하게 하도록 하기 위해 제공된다. 이들 실시형태들에 대한 다양한 변형들이 통상의 기술자에게는 자명할 것이고, 본원에 정의된 일반적인 원리들은 청구항들의 범위를 벗어나지 않으면서 다른 실시형태들에 적용될 수도 있다. 따라서, 본 개시는 본원에 나타낸 실시형태들에 제한되도록 의도된 것은 아니며 본원의 개시된 원리들과 신규의 특성들 및 다음의 청구항들과 일치하는 광의의 범위를 따르기 위한 것이다.

Claims (30)

  1. 다중-프로세서 컴퓨팅 디바이스가 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법으로서,
    상기 복수의 프로세싱 유닛들의 프로세서를 통해, 상기 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 단계로서, 각각의 특수화된 버전은 상기 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성되는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 단계;
    상기 프로세서를 통해, 상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 단계로서, 상기 제 1 프로세싱 유닛은, 상기 복수의 프로세싱 유닛들의 다른 프로세싱 유닛들이 상기 다중-버전형 태스크의 다른 특수화된 버전들을 실행하기 위해 이용가능하기 전에, 상기 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능한, 상기 다중-버전형 태스크에 대한 소유권을 제공하는 단계; 및
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 제공하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 다른 특수화된 버전들을 폐기하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  2. 제 1 항에 있어서,
    상기 다중-프로세서 컴퓨팅 디바이스는 상기 복수의 프로세싱 유닛들을 스케줄링하도록 구성된 런타임 기능을 실행하고 있는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  3. 제 1 항에 있어서,
    상기 프로세서를 통해, 상기 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 단계는,
    상기 프로세서를 통해, 상기 복수의 프로세싱 유닛들의 각각에 대한 상기 태스크 큐에서 상기 다중-버전형 태스크의 상기 특수화된 버전과 연관된 포인터를 인큐잉하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  4. 제 3 항에 있어서,
    각 포인터는 상기 다중-버전형 태스크 및 상기 다중-버전형 태스크의 상기 특수화된 버전의 표시를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  5. 제 4 항에 있어서,
    상기 다중-버전형 태스크의 상기 특수화된 버전의 상기 표시는 각 포인터의 최하위 4 비트들에 포함되는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  6. 제 1 항에 있어서,
    상기 프로세서를 통해 상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 단계는, 상기 다중-버전형 태스크와 관련하여 데이터를 저장하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  7. 제 1 항에 있어서,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 단계; 및
    상기 프로세서를 통해, 상기 다음 태스크가 상기 다중-버전형 태스크와 연관된다고 결정하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 단계를 더 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  8. 제 7 항에 있어서,
    상기 프로세서를 통해, 상기 소유권을 요청하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 획득하는 단계; 및
    상기 제 1 프로세싱 유닛을 통해, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 획득하는 것에 응답하여, 상기 다음 태스크를 실행하는 단계를 더 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  9. 제 7 항에 있어서,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 단계는,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 포인터에 대해 비트 마스크를 적용함으로써 식별자를 획득하는 단계; 및
    상기 프로세서를 통해, 상기 식별자가 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전에 대응한다고 결정하는 것에 응답하여, 상기 다음 태스크가 상기 다중-버전형 태스크와 연관된다고 결정하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  10. 제 7 항에 있어서,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 단계는,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 포인터를 취출하는 단계로서, 상기 포인터는 상기 복수의 프로세싱 유닛들의 각각에 대한 상기 태스크 큐에서 배치된 공통 다중-버전형 태스크 포인터인, 상기 포인터를 취출하는 단계;
    상기 프로세서를 통해, 상기 포인터가 상기 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관되는지 여부를 결정하는 단계; 및
    상기 프로세서를 통해, 상기 포인터가 상기 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관된다고 결정하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 특수화된 버전들의 리스트로부터 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전을 식별하는 단계로서, 상기 제 1 특수화된 버전은 상기 제 1 프로세싱 유닛에 의해 실행될 상기 다음 태스크인, 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전을 식별하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  11. 제 7 항에 있어서,
    상기 제 1 프로세싱 유닛을 통해, 상기 다음 태스크가 상기 다중-버전형 태스크와 연관되지 않는다고 결정하는 것에 응답하여, 상기 다음 태스크를 실행하는 단계를 더 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  12. 제 7 항에 있어서,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛에 대해 상기 소유권을 요청하는 것에 응답하여, 상기 다중-버전형 태스크에 대한 상기 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 단계; 및
    상기 프로세서를 통해, 상기 다중-버전형 태스크에 대한 상기 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 것에 응답하여, 상기 다음 태스크를 폐기하는 단계를 더 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  13. 제 7 항에 있어서,
    상기 프로세서를 통해, 상기 제 1 프로세싱 유닛과 연관된 상기 태스크 큐 내에 우선순위 태스크가 존재하는지 여부를 결정하는 단계; 및
    상기 제 1 프로세싱 유닛을 통해, 상기 우선순위 태스크를 실행하는 단계를 더 포함하고,
    상기 프로세서를 통해, 상기 다음 태스크가 상기 다중-버전형 태스크와 연관된다고 결정하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 단계는, 상기 프로세서를 통해, 상기 우선순위 태스크를 실행하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 단계를 포함하는, 복수의 프로세싱 유닛들에 대해 다중-버전형 태스크들을 스케줄링하는 방법.
  14. 제 1 항에 있어서,
    상기 프로세서는 상기 제 1 프로세싱 유닛인, 복수의 프로세싱 유닛들에 대해에 다중-버전형 태스크들을 스케줄링하는 방법.
  15. 다중-프로세서 컴퓨팅 디바이스로서,
    메모리; 및
    상기 메모리에 커플링된 복수의 프로세싱 유닛들을 포함하고,
    상기 복수의 프로세싱 유닛들의 프로세서는,
    상기 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작으로서, 각각의 특수화된 버전은 상기 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성되는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작;
    상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 동작으로서, 상기 제 1 프로세싱 유닛은, 상기 복수의 프로세싱 유닛들의 다른 프로세싱 유닛들이 상기 다중-버전형 태스크의 다른 특수화된 버전들을 실행하기 위해 이용가능하기 전에, 상기 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능한, 상기 다중-버전형 태스크에 대한 소유권을 제공하는 동작; 및
    상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 제공하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 다른 특수화된 버전들을 폐기하는 동작
    을 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  16. 제 15 항에 있어서,
    상기 프로세서는, 상기 다중-프로세서 컴퓨팅 디바이스가 상기 복수의 프로세싱 유닛들을 스케줄링하도록 구성된 런타임 기능을 실행하고 있을 때의 동작들을 수행하도록 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  17. 제 15 항에 있어서,
    상기 프로세서는,
    상기 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작이,
    상기 복수의 프로세싱 유닛들의 각각에 대한 상기 태스크 큐에서 상기 다중-버전형 태스크의 상기 특수화된 버전과 연관된 포인터를 인큐잉하는 동작을 포함하도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  18. 제 17 항에 있어서,
    상기 프로세서는, 각 포인터가 상기 다중-버전형 태스크 및 상기 다중-버전형 태스크의 상기 특수화된 버전의 표시를 포함하도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  19. 제 18 항에 있어서,
    상기 프로세서는, 상기 다중-버전형 태스크의 상기 특수화된 버전의 상기 표시가 각 포인터의 최하위 4 비트들에 포함되도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  20. 제 15 항에 있어서,
    상기 프로세서는, 상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 동작이, 상기 다중-버전형 태스크와 관련하여 데이터를 저장하는 동작을 포함하도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  21. 제 15 항에 있어서,
    상기 프로세서는,
    상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 동작; 및
    상기 다음 태스크가 상기 다중-버전형 태스크와 연관된다고 결정하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 동작을 더 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  22. 제 21 항에 있어서,
    상기 프로세서는,
    상기 소유권을 요청하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 획득하는 동작; 및
    상기 다중-버전형 태스크에 대한 상기 소유권을 획득하는 것에 응답하여, 상기 제 1 프로세싱 유닛을 통해 상기 다음 태스크를 실행하는 동작을 더 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  23. 제 21 항에 있어서,
    상기 프로세서는,
    상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 동작이,
    상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 포인터에 대해 비트 마스크를 적용함으로써 식별자를 획득하는 동작; 및
    상기 식별자가 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전에 대응한다고 결정하는 것에 응답하여, 상기 다음 태스크가 상기 다중-버전형 태스크와 연관된다고 결정하는 동작을 포함하도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  24. 제 21 항에 있어서,
    상기 프로세서는,
    상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 다음 태스크가 상기 다중-버전형 태스크와 연관되는지 여부를 결정하는 동작이,
    상기 제 1 프로세싱 유닛의 상기 태스크 큐로부터의 포인터를 취출하는 동작으로서, 상기 포인터는 상기 복수의 프로세싱 유닛들의 각각에 대한 상기 태스크 큐에서 배치된 공통 다중-버전형 태스크 포인터인, 상기 포인터를 취출하는 동작;
    상기 포인터가 상기 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관되는지 여부를 결정하는 동작; 및
    상기 포인터가 상기 다중-버전형 태스크의 특수화된 버전들의 리스트와 연관된다고 결정하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 특수화된 버전들의 리스트로부터 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전을 식별하는 동작으로서, 상기 제 1 특수화된 버전은 상기 제 1 프로세싱 유닛에 의해 실행될 상기 다음 태스크인, 상기 다중-버전형 태스크의 상기 제 1 특수화된 버전을 식별하는 동작을 포함하도록 하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  25. 제 21 항에 있어서,
    상기 프로세서는,
    상기 다음 태스크가 상기 다중-버전형 태스크와 연관되지 않는다고 결정하는 것에 응답하여, 상기 제 1 프로세싱 유닛을 통해 상기 다음 태스크를 실행하는 동작을 더 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  26. 제 21 항에 있어서,
    상기 프로세서는,
    상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 것에 응답하여, 상기 다중-버전형 태스크에 대한 상기 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 동작; 및
    상기 다중-버전형 태스크에 대한 상기 소유권이 제 2 프로세싱 유닛에 의해 획득되었다고 결정하는 것에 응답하여, 상기 다음 태스크를 폐기하는 동작을 더 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되는, 다중-프로세서 컴퓨팅 디바이스.
  27. 제 21 항에 있어서,
    상기 프로세서는,
    상기 제 1 프로세싱 유닛과 연관된 상기 태스크 큐 내에 우선순위 태스크가 존재하는지 여부를 결정하는 동작; 및
    상기 제 1 프로세싱 유닛을 통해 상기 우선순위 태스크를 실행하는 동작을 더 포함하는 동작들을 수행하도록 프로세서-실행가능 명령들로 구성되고,
    상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 동작은, 상기 우선순위 태스크를 실행하는 것에 응답하여, 상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 요청하는 동작을 포함하는, 다중-프로세서 컴퓨팅 디바이스.
  28. 프로세서-실행가능 명령들을 저장한 비-일시적 프로세서-판독가능 저장 매체로서,
    상기 프로세서-실행가능 명령들은, 다중-프로세서 컴퓨팅 디바이스의 프로세서로 하여금,
    복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작으로서, 각각의 특수화된 버전은 상기 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성되는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작;
    상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 동작으로서, 상기 제 1 프로세싱 유닛은, 상기 복수의 프로세싱 유닛들의 다른 프로세싱 유닛들이 상기 다중-버전형 태스크의 다른 특수화된 버전들을 실행하기 위해 이용가능하기 전에, 상기 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능한, 상기 다중-버전형 태스크에 대한 소유권을 제공하는 동작; 및
    상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 제공하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 다른 특수화된 버전들을 폐기하는 동작을 포함하는 동작들을 수행하게 하도록 구성되는, 비-일시적 프로세서-판독가능 저장 매체.
  29. 제 28 항에 있어서,
    저장된 상기 상기 프로세서-실행가능 명령들은, 상기 다중-프로세서 컴퓨팅 디바이스의 프로세서로 하여금,
    상기 복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 동작이,
    상기 복수의 프로세싱 유닛들의 각각에 대한 상기 태스크 큐에서 상기 다중-버전형 태스크의 상기 특수화된 버전과 연관된 포인터를 인큐잉하는 동작을 포함하도록 하는 동작들을 수행하게 하도록 구성되는, 비-일시적 프로세서-판독가능 저장 매체.
  30. 다중-프로세서 컴퓨팅 디바이스로서,
    복수의 프로세싱 유닛들의 각각에 대한 태스크 큐에서 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 수단으로서, 각각의 특수화된 버전은 상기 복수의 프로세싱 유닛들의 상이한 프로세싱 유닛에 의해 실행되도록 구성되는, 상기 다중-버전형 태스크의 특수화된 버전을 인큐잉하는 수단;
    상기 복수의 프로세싱 유닛들의 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 소유권을 제공하는 수단으로서, 상기 제 1 프로세싱 유닛은, 상기 복수의 프로세싱 유닛들의 다른 프로세싱 유닛들이 상기 다중-버전형 태스크의 다른 특수화된 버전들을 실행하기 위해 이용가능하기 전에, 상기 다중-버전형 태스크의 제 1 특수화된 버전을 즉시 실행하기 위해 이용가능한, 상기 다중-버전형 태스크에 대한 소유권을 제공하는 수단; 및
    상기 제 1 프로세싱 유닛에 대해 상기 다중-버전형 태스크에 대한 상기 소유권을 제공하는 것에 응답하여, 상기 다중-버전형 태스크의 상기 다른 특수화된 버전들을 폐기하는 수단을 포함하는, 다중-프로세서 컴퓨팅 디바이스.
KR1020187010433A 2015-09-14 2016-08-10 다중-버전형 태스크들의 효율적 스케줄링 KR20180053359A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/852,737 US9778961B2 (en) 2015-09-14 2015-09-14 Efficient scheduling of multi-versioned tasks
US14/852,737 2015-09-14
PCT/US2016/046385 WO2017048420A1 (en) 2015-09-14 2016-08-10 Efficient scheduling of multi-versioned tasks

Publications (1)

Publication Number Publication Date
KR20180053359A true KR20180053359A (ko) 2018-05-21

Family

ID=56694277

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020187010433A KR20180053359A (ko) 2015-09-14 2016-08-10 다중-버전형 태스크들의 효율적 스케줄링

Country Status (7)

Country Link
US (1) US9778961B2 (ko)
EP (1) EP3350699A1 (ko)
JP (1) JP2018533122A (ko)
KR (1) KR20180053359A (ko)
CN (1) CN108027751A (ko)
BR (1) BR112018004933A2 (ko)
WO (1) WO2017048420A1 (ko)

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10360063B2 (en) 2015-09-23 2019-07-23 Qualcomm Incorporated Proactive resource management for parallel work-stealing processing systems
KR102644276B1 (ko) * 2016-10-10 2024-03-06 삼성전자주식회사 그래픽 처리 장치 및 방법
US10620994B2 (en) 2017-05-30 2020-04-14 Advanced Micro Devices, Inc. Continuation analysis tasks for GPU task scheduling
EP3642765A4 (en) * 2017-06-19 2021-04-07 Rigetti & Co., Inc. DISTRIBUTED QUANTUM COMPUTER SYSTEM
CN109426553A (zh) * 2017-08-21 2019-03-05 上海寒武纪信息科技有限公司 任务切分装置及方法、任务处理装置及方法、多核处理器
CN108121514B (zh) * 2017-12-29 2021-05-25 北京奇虎科技有限公司 元信息更新方法、装置、计算设备及计算机存储介质
US11010145B1 (en) 2018-02-21 2021-05-18 Rigetti & Co, Inc. Retargetable compilation for quantum computing systems
US10963299B2 (en) * 2018-09-18 2021-03-30 Advanced Micro Devices, Inc. Hardware accelerated dynamic work creation on a graphics processing unit
US20190253357A1 (en) * 2018-10-15 2019-08-15 Intel Corporation Load balancing based on packet processing loads
US10818067B1 (en) * 2019-05-31 2020-10-27 Texas Instruments Incorporated GPU assist using DSP pre-processor system and method
CN110262884B (zh) * 2019-06-20 2023-03-24 山东省计算中心(国家超级计算济南中心) 一种基于申威众核处理器的核组内多程序多数据流分区并行的运行方法
US11397612B2 (en) * 2019-07-27 2022-07-26 Analog Devices International Unlimited Company Autonomous job queueing system for hardware accelerators
CN111427551A (zh) * 2020-02-14 2020-07-17 深圳市商汤科技有限公司 编程平台的用户代码运行方法及平台、设备、存储介质
US20200226067A1 (en) * 2020-03-24 2020-07-16 Intel Corporation Coherent multiprocessing enabled compute in storage and memory
US11496559B1 (en) * 2020-06-12 2022-11-08 Juniper Networks, Inc. Regulating enqueueing and dequeuing border gateway protocol (BGP) update messages
CN113886057A (zh) * 2020-07-01 2022-01-04 西南科技大学 异构众核上基于剖析技术以及数据流信息的动态资源调度方法
US11698816B2 (en) * 2020-08-31 2023-07-11 Hewlett Packard Enterprise Development Lp Lock-free work-stealing thread scheduler
CN112596758B (zh) * 2020-11-30 2022-08-30 新华三大数据技术有限公司 一种OSDMap的版本更新方法、装置、设备和介质
WO2022137838A1 (ja) * 2020-12-25 2022-06-30 日本電気株式会社 プロセス割当制御装置、プロセス割当制御方法、及び、プロセス割当制御プログラムが格納された記録媒体
US11645113B2 (en) * 2021-04-30 2023-05-09 Hewlett Packard Enterprise Development Lp Work scheduling on candidate collections of processing units selected according to a criterion
CN114510337B (zh) * 2022-04-15 2023-03-21 深圳美云集网络科技有限责任公司 任务执行方法、系统及计算机可读存储介质

Family Cites Families (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8533716B2 (en) 2004-03-31 2013-09-10 Synopsys, Inc. Resource management in a multicore architecture
US8510741B2 (en) 2007-03-28 2013-08-13 Massachusetts Institute Of Technology Computing the processor desires of jobs in an adaptively parallel scheduling environment
US8276164B2 (en) 2007-05-03 2012-09-25 Apple Inc. Data parallel computing on multiple processors
US8286196B2 (en) 2007-05-03 2012-10-09 Apple Inc. Parallel runtime execution on multiple processors
US7886172B2 (en) 2007-08-27 2011-02-08 International Business Machines Corporation Method of virtualization and OS-level thermal management and multithreaded processor with virtualization and OS-level thermal management
US8892931B2 (en) 2009-10-20 2014-11-18 Empire Technology Development Llc Power channel monitor for a multicore processor
US8572622B2 (en) 2009-12-30 2013-10-29 International Business Machines Corporation Reducing queue synchronization of multiple work items in a system with high memory latency between processing nodes
US9317329B2 (en) 2010-11-15 2016-04-19 Qualcomm Incorporated Arbitrating resource acquisition for applications of a multi-processor mobile communications device
US8954986B2 (en) 2010-12-17 2015-02-10 Intel Corporation Systems and methods for data-parallel processing
WO2012120654A1 (ja) 2011-03-08 2012-09-13 富士通株式会社 タスクスケジューリング方法およびマルチコアシステム
US8566537B2 (en) 2011-03-29 2013-10-22 Intel Corporation Method and apparatus to facilitate shared pointers in a heterogeneous platform
US8782645B2 (en) 2011-05-11 2014-07-15 Advanced Micro Devices, Inc. Automatic load balancing for heterogeneous cores
US8468507B2 (en) 2011-06-10 2013-06-18 Microsoft Corporation Binding executable code at runtime
US10795722B2 (en) * 2011-11-09 2020-10-06 Nvidia Corporation Compute task state encapsulation
US8707314B2 (en) 2011-12-16 2014-04-22 Advanced Micro Devices, Inc. Scheduling compute kernel workgroups to heterogeneous processors based on historical processor execution times and utilizations
US9170849B2 (en) * 2012-01-09 2015-10-27 Microsoft Technology Licensing, Llc Migration of task to different pool of resources based on task retry count during task lease
KR20130115574A (ko) 2012-04-12 2013-10-22 삼성전자주식회사 단말기에서 태스크 스케줄링을 수행하는 방법 및 장치
US9317339B2 (en) 2013-03-13 2016-04-19 Oracle International Corporation Systems and methods for implementing work stealing using a configurable separation of stealable and non-stealable work items
US10386900B2 (en) 2013-09-24 2019-08-20 Intel Corporation Thread aware power management
CN103761139B (zh) * 2014-01-25 2017-02-08 湖南大学 一种基于动态库拦截的通用计算虚拟化实现方法
US9733978B2 (en) 2015-08-27 2017-08-15 Qualcomm Incorporated Data management for multiple processing units using data transfer costs
US20170083365A1 (en) 2015-09-23 2017-03-23 Qualcomm Incorporated Adaptive Chunk Size Tuning for Data Parallel Processing on Multi-core Architecture
US10360063B2 (en) 2015-09-23 2019-07-23 Qualcomm Incorporated Proactive resource management for parallel work-stealing processing systems

Also Published As

Publication number Publication date
CN108027751A (zh) 2018-05-11
BR112018004933A2 (pt) 2018-10-09
WO2017048420A1 (en) 2017-03-23
US20170075734A1 (en) 2017-03-16
JP2018533122A (ja) 2018-11-08
US9778961B2 (en) 2017-10-03
EP3350699A1 (en) 2018-07-25

Similar Documents

Publication Publication Date Title
US9778961B2 (en) Efficient scheduling of multi-versioned tasks
JP6294586B2 (ja) 命令スレッドを組み合わせた実行の管理システムおよび管理方法
US10360063B2 (en) Proactive resource management for parallel work-stealing processing systems
US8424007B1 (en) Prioritizing tasks from virtual machines
KR102571293B1 (ko) 충돌들의 존재시 효율적인 작업 스케줄링을 위한 방법
US10169105B2 (en) Method for simplified task-based runtime for efficient parallel computing
US20120297216A1 (en) Dynamically selecting active polling or timed waits
US20170083365A1 (en) Adaptive Chunk Size Tuning for Data Parallel Processing on Multi-core Architecture
CN111597044A (zh) 任务调度方法、装置、存储介质及电子设备
US11061730B2 (en) Efficient scheduling for hyper-threaded CPUs using memory monitoring
US9158601B2 (en) Multithreaded event handling using partitioned event de-multiplexers
Parikh et al. Performance parameters of RTOSs; comparison of open source RTOSs and benchmarking techniques
JP2018536945A (ja) タスクをタイムベーススケジューリングする方法及び装置
WO2017222746A1 (en) Iteration synchronization construct for parallel pipelines
US10360652B2 (en) Wavefront resource virtualization
JP2021060707A (ja) 同期制御システムおよび同期制御方法
Turimbetov et al. GPU-Initiated Resource Allocation for Irregular Workloads
Deshmukh et al. Comparison of Open Source RTOSs Using Various Performance Parameters