KR101239025B1 - 다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들 - Google Patents

다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들 Download PDF

Info

Publication number
KR101239025B1
KR101239025B1 KR1020117000309A KR20117000309A KR101239025B1 KR 101239025 B1 KR101239025 B1 KR 101239025B1 KR 1020117000309 A KR1020117000309 A KR 1020117000309A KR 20117000309 A KR20117000309 A KR 20117000309A KR 101239025 B1 KR101239025 B1 KR 101239025B1
Authority
KR
South Korea
Prior art keywords
executable
code
computing
memory
computational
Prior art date
Application number
KR1020117000309A
Other languages
English (en)
Other versions
KR20110019775A (ko
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 KR20110019775A publication Critical patent/KR20110019775A/ko
Application granted granted Critical
Publication of KR101239025B1 publication Critical patent/KR101239025B1/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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • 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
    • 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/44Arrangements for executing specific programs
    • 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
    • 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
    • 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
    • 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/54Interprogram communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5018Thread allocation
    • 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 Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Stored Programmes (AREA)
  • Advance Control (AREA)
  • Image Processing (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

계산 유닛(compute unit)들 간에 병렬로 데이터 프로세싱 작업을 수행하도록, 호스트 프로세서의 API들(application programming interfaces)을 호출하는 병렬 컴퓨팅 프로그램에 대한 방법들과 장치들이 기술된다. 계산 유닛들은, CPU(central processing unit)들과 GPU(graphic processing unit)들을 포함하는 호스트 프로세서에 결합된다. 데이터 처리 작업에 대한 소스 코드에 대응하는 프로그램 객체는, API 호출들에 따라 호스트 프로세서에 결합된 메모리에 생성된다. 계산 유닛들을 위한 실행가능 코드들은, API 호출들에 따라 프로그램 객체로부터 생성되어, 데이터 처리 작업을 수행하기 위한 계산 유닛들 간의 동시 실행을 위해 로드된다.

Description

다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들{APPLICATION PROGRAMMING INTERFACES FOR DATA PARALLEL COMPUTING ON MULTIPLE PROCESSORS}
[관련 출원의 상호 참조]
본 출원은 2008년 6월 6일자로 출원된, 발명의 명칭이 "Application Programming Interfaces for Data Parallel Computing on Multiple Processors(다수의 프로세서 상에서의 데이터 병렬 컴퓨팅을 위한 응용 프로그래밍 인터페이스)"인 Aaftab A. Munshi 등의 미국 가특허 출원 제61/059,739호(여기에 인용함으로써 그 전체 내용이 본 명세서에 포함됨)에 관련되어 있고 이를 기초로 우선권을 주장한다.
[발명의 분야]
본 발명은 일반적으로 데이터 병렬 컴퓨팅에 관한 것이다. 보다 상세하게는, 본 발명은 CPU(Central Processing Unit) 및 GPU(Graphical Processing Unit) 둘 다에 걸친, 데이터 병렬 컴퓨팅에 대한 API(application programming interface)들에 관한 것이다.
GPU가 고성능 병렬 컴퓨팅 장치로 계속 진화함에 따라, 점점 더 많은 응용 프로그램이 범용 컴퓨팅 장치와 유사한 GPU에서 데이터 병렬 계산을 수행하도록 작성되고 있다. 현재, 이들 응용 프로그램은 공급업체 특유의 인터페이스를 사용하여 특정의 GPU 상에서 실행되도록 설계되고 있다. 따라서, 이들 응용 프로그램은, GPU 및 CPU 둘다가 데이터 처리 시스템에서 이용가능할 때에도, CPU의 처리 리소스를 이용할 수 없다. 이러한 응용 프로그램이 실행 중인 경우 다른 공급업체로부터의 GPU에 있는 처리 리소스도 이용될 수 없다.
그렇지만, 점점 더 많은 CPU가 데이터 병렬 계산을 수행하기 위해 다수의 코어를 포함함에 따라, 점점 더 많은 처리 작업이 CPU 및/또는 GPU 중 이용가능한 어느 것이나에 의해 지원될 수 있다. 종래에는, GPU 및 CPU가 서로 호환되지 않는 개별적인 프로그래밍 환경을 통해 구성된다. 대부분의 GPU는 공급업체 특유의 전용 프로그램을 필요로 한다. 그 결과, 응용 프로그램이 CPU 및 GPU 둘다의 처리 리소스를 이용하는 것이, 예를 들어, 멀티-코어 CPU와 함께 데이터 병렬 컴퓨팅 능력을 갖는 GPU의 처리 리소스를 이용하는 것이 아주 어렵다.
따라서, 최근의 데이터 처리 시스템에서는 응용 프로그램이, 작업을 수행할 수 있는 임의의 이용가능한 처리 리소스(CPU 및 하나 이상의 GPU 등)를 사용하여, 작업을 수행할 수 있게 해주기 위해 상기한 문제점들을 극복할 필요가 있다.
본 발명의 실시예는, 호스트 프로세서에 결합된 CPU(central processing unit)들과 GPU(graphic processing unit)들을 포함하는 계산 유닛(compute unit)들 사이에서 병렬로 데이터 프로세싱 작업을 수행하기 위해, 호스트 프로세서의 API들을 호출하는 병렬 컴퓨팅 프로그램에 대한 방법들과 장치들을 포함한다. 데이터 처리 작업에 대한 소스 코드에 대응하는 프로그램 객체는, API 호출들에 따라 호스트 프로세서에 결합된 메모리에 생성된다. 계산 유닛들을 위한 실행가능 코드들은, API 호출들에 따라 프로그램 객체로부터 생성되어, 데이터 처리 작업을 수행하기 위한 계산 유닛들 간의 동시 실행을 위해 로드된다.
본 발명의 다른 특징들이 첨부 도면 및 이하의 상세한 설명으로부터 명백하게 될 것이다.
유사한 참조 번호가 유사한 구성요소를 나타내고 있는 첨부 도면의 도면들에, 본 발명이 제한이 아닌 예로서 도시되어 있다.
도 1은 응용 프로그램의 데이터 병렬 컴퓨팅을 수행하도록 CPU 및/또는 GPU를 포함하는 컴퓨팅 장치를 구성하는 시스템의 일 실시예를 나타낸 블록도.
도 2는 다수의 스레드를 동시에 실행하기 위해 병렬로 동작하는 다수의 계산 프로세서(compute processor)를 갖는 컴퓨팅 장치의 일례를 나타낸 블록도.
도 3은 복수의 물리적 컴퓨팅 장치가 컴퓨팅 장치 식별자를 사용하여 논리적 컴퓨팅 장치로서 구성되어 있는 일 실시예를 나타낸 블록도.
도 4는 응용 프로그램으로부터 수신된 능력 요구사항과 매칭시킴으로써 컴퓨팅 장치 식별자를 사용하여 복수의 물리적 컴퓨팅 장치를 구성하는 프로세스의 일 실시예를 나타낸 흐름도.
도 5는 논리적 컴퓨팅 장치에서 계산 실행파일(compute executable)을 실행하는 프로세스의 실시예를 나타낸 흐름도.
도 6은 실행파일을 실행하기로 결정된 하나 이상의 물리적 컴퓨팅 장치에 대한 소스를 컴파일하는 것을 비롯한 실행파일을 로드하는 런타임 프로세스의 일 실시예를 나타낸 흐름도.
도 7은 실행 인스턴스와 연관된 논리적 컴퓨팅 장치에 대응하는 하나 이상의 물리적 컴퓨팅 장치에서 실행하기 위해 실행 큐로부터 계산 커널 실행 인스턴스를 선택하는 프로세스의 일 실시예를 나타낸 흐름도.
도 8은 다수의 계산 유닛들 간에 계산 커널 객체를 동시에 실행하기에 최적의 스레드 그룹 크기를 결정하는 프로세스의 일 실시예를 나타낸 흐름도.
도 9a는 복수의 물리적 컴퓨팅 장치에 따른 라이브러리 내의 하나 이상의 API에 대한 소스 및 복수의 실행파일을 저장하는 API(Application Programming Interface) 라이브러리를 빌드하는 프로세스의 일 실시예를 나타낸 흐름도.
도 9b는 응용 프로그램이 API 요청에 기초하여 API 라이브러리로부터 검색된 대응하는 소스와 함께 복수의 실행파일 중 하나의 실행파일을 실행하는 프로세스의 일 실시예를 나타낸 흐름도.
도 10은 복수의 물리적 컴퓨팅 장치에서 실행될 계산 커널 실행파일에 대한 계산 커널 소스의 일례를 나타낸 샘플 소스 코드.
도 11a 내지 도 11c는 API를 호출함으로써 복수의 물리적 컴퓨팅 장치에서 복수의 실행파일 중 하나의 실행파일을 실행하도록 논리적 컴퓨팅 장치를 구성하는 일례를 나타낸 샘플 소스 코드.
도 12는 본 명세서에 기술된 실시예와 관련하여 사용될 수 있는 복수의 CPU 및 GPU(Graphical Processing Unit)를 갖는 통상적인 컴퓨터 시스템의 일례를 나타낸 도면.
다수의 프로세서 상에서의 데이터 병렬 컴퓨팅 방법 및 장치가 본 명세서에 기술되어 있다. 이하의 설명에는, 본 발명의 실시예들에 대한 완전한 설명한 제공하기 위해 다수의 구체적인 상세가 기술되어 있다. 그렇지만, 본 발명의 실시예가 이들 구체적인 상세 없이도 실시될 수 있다는 것이 당업자에게는 명백할 것이다. 다른 경우에, 본 설명의 이해를 모호하게 하지 않기 위해 공지의 구성요소, 구조 및 기술에 대해서는 상세히 설명하지 않고 있다.
본 명세서에서 "일 실시예" 또는 "실시예"라는 말은 그 실시예와 관련하여 기술된 특정의 특징, 구조 또는 특성이 본 발명의 적어도 하나의 실시예에 포함되어 있을 수 있다는 것을 의미한다. 본 명세서의 여러 곳에서 나오는 "일 실시예에서"라는 문구들 모두가 꼭 동일한 실시예를 말하는 것은 아니다.
첨부 도면들에 도시된 프로세스가 하드웨어(예를 들어, 회로, 전용 논리, 기타), 소프트웨어(범용 컴퓨터 시스템 또는 전용 기계 상에서 실행되는 것 등), 또는 이 둘의 조합을 포함하는 처리 논리(processing logic)에 의해 수행된다. 이하에서 프로세스가 어떤 순차적 동작들로 기술되어 있지만, 기술된 동작들 중 일부가 다른 순서로 수행될 수 있다는 것을 잘 알 것이다. 게다가, 일부 동작들이 순차적으로보다는 병렬로 수행될 수 있다.
GPU(Graphics Processing Unit)는 2D, 3D 그래픽 연산 및/또는 디지털 비디오 관련 함수와 같은 아주 효율적인 그래픽 연산을 구현하는 전용 그래픽 프로세서일 수 있다. GPU는 그래픽 연산, 예를 들어, 블리터 연산(blitter operation), 텍스처 매핑(texture mapping), 폴리곤 렌더링(polygon rendering), 픽셀 쉐이딩(pixel shading) 및 정점 쉐이딩(vertex shading)을 수행하는 특수한 (프로그램가능) 하드웨어를 포함할 수 있다. GPU는 프레임 버퍼로부터 데이터를 페치(fetch)하고 픽셀을 서로 블렌딩하여 이미지를 렌더링하고 이 이미지를 디스플레이하기 위해 다시 프레임 버퍼에 넣는 것으로 알려져 있다. GPU는 또한 프레임 버퍼를 제어하여, 프레임 버퍼가 디스플레이, 예를 들어, CRT 또는 LCD 디스플레이를 리프레시(refresh)하는 데 사용될 수 있게 해줄 수 있다. CRT 또는 LCD 디스플레이는 잔광시간이 짧은(short persistence) 디스플레이로서, 적어도 20 Hz의 레이트로 리프레시를 필요로 한다(예를 들어, 1/30 초마다, 디스플레이가 프레임 버퍼로부터의 데이터로 리프레시된다). 보통, GPU는, 래스터 그래픽 이미지(raster graphics image)를 디스플레이 제어기를 통해 디스플레이 장치로 출력하기 위해, GPU와 연결된 CPU로부터 그래픽 처리 작업을 받을 수 있다. 명세서에서 "GPU"라고 하는 것은, 발명의 명칭이 "Method and Apparatus for Multithreaded Processing of Data In a Programmable Graphics Processor(프로그램가능 그래픽 프로세서에서의 데이터 멀티스레드 처리 방법 및 장치)"인 Lindholdm 등의 미국 특허 제7015913호 및 발명의 명칭이 "Method for Deinterlacing Interlaced Video by A Graphics Processor(그래픽 프로세서에 의한 인터레이싱된 비디오의 디인터레이싱 방법)"인 Swan 등의 미국 특허 제6970206호에 기술된 것과 같은, 그래픽 프로세서 또는 프로그램가능 그래픽 프로세서일 수 있으며, 이들 미국 특허는 여기에 인용함으로써 본 명세서에 포함된다.
일 실시예에서, 데이터 처리 시스템 내의 가용 처리 리소스의 이용 효율을 향상시키기 위해, 복수의 서로 다른 유형의 프로세서(CPU 또는 GPU 등)가 하나 이상의 응용 프로그램의 데이터 병렬 처리 작업을 동시에 수행할 수 있다. 데이터 처리 시스템의 처리 리소스는 복수의 물리적 컴퓨팅 장치(CPU 또는 GPU 등)에 기초할 수 있다. 물리적 컴퓨팅 장치는 하나 이상의 계산 유닛(compute unit)을 포함할 수 있다. 일 실시예에서, 데이터 병렬 처리 작업(또는 데이터 병렬 작업)이 작업을 수행할 수 있는 복수의 유형의 프로세서(예를 들어, CPU 또는 GPU)에 위임될 수 있다. 데이터 병렬 작업은 프로세서로부터의 어떤 특정의 처리 능력을 필요로 할 수 있다. 처리 능력은, 예를 들어, 전용 텍스처링 하드웨어 지원, 배정도 부동 소수점 산술, 전용 로컬 메모리, 스트림 데이터 캐시, 또는 동기화 프리미티브(synchronization primitive)일 수 있다. 개별 유형의 프로세서가 서로 다르지만 중복하는 처리 능력 그룹을 제공할 수 있다. 예를 들어, CPU 및 GPU 둘다가 배정도 부동 소수점 계산을 수행할 수 있다. 일 실시예에서, 응용 프로그램은 데이터 병렬 처리 작업을 수행하기 위해, CPU 또는 GPU 중 이용가능한 어느 것이나 이용할 수 있다.
다른 실시예에서, 데이터 병렬 처리 작업을 위해 복수의 서로 다른 유형의 처리 리소스를 선택하고 할당하는 것이 런타임 동안에 자동으로 수행될 수 있다. 응용 프로그램은 데이터 처리 작업에 대한 원하는 능력 요구사항들의 목록을 포함한 힌트를 API를 통해 데이터 처리 시스템의 런타임 플랫폼으로 보낼 수 있다. 수신된 힌트에 따라, 런타임 플랫폼은 응용 프로그램의 데이터 처리 작업을 위임할, 수신된 힌트와 매칭하는 능력을 갖는 복수의 현재 이용가능한 CPU 및/또는 GPU를 결정할 수 있다. 일 실시예에서, 능력 요구사항 목록은 기본 데이터 처리 작업에 의존할 수 있다. 능력 요구사항 목록은, 예를 들어, 서로 다른 공급업체로부터의 또한 서로 다른 버전의 GPU 및 멀티-코어 CPU를 비롯한 서로 다른 프로세서 또는 계산 유닛 그룹에 걸쳐 적용될 수 있다. 그 결과, 응용 프로그램이 특정 유형의 계산 유닛(CPU 또는 GPU 등)을 대상으로 하는 프로그램을 제공하는 것으로부터 격리될 수 있다.
게다가, 다른 실시예에서, 선택된 계산 유닛 간에 병렬로 실행할 다수의 스레드를 할당하고 그룹화하는 것이 데이터 병렬 작업에 대한 기본 문제 공간에 따라 수행될 수 있다. 선택된 계산 유닛에서 실행될 소스 코드에 대한 표현의 분석은 어떻게 처리 작업을 선택된 계산 유닛 간에 최적으로 분할하고 분산시켜야 하는지를 결정할 수 있다. API 인터페이스는 응용 프로그램이 실행파일을 선택된 계산 유닛 간에 스레드 그룹에서 실행함으로써 어떻게 데이터 병렬 작업을 수행해야 하는지를 지정할 수 있게 해줄 수 있다. 그에 부가하여, 응용 프로그램은, API를 사용하여, 선택된 계산 유닛 간에 작업을 수행하기 위해 리소스 요구사항에 기초한 데이터 병렬 작업의 최적의 분할에 관한 제안을 검색할 수 있다.
도 1은 응용 프로그램의 데이터 병렬 컴퓨팅을 수행하도록 CPU 및/또는 GPU를 포함하는 컴퓨팅 장치를 구성하는 시스템(100)의 일 실시예를 나타낸 블록도이다. 시스템(100)은 병렬 컴퓨팅 아키텍처를 구현할 수 있다. 일 실시예에서, 시스템(100)은 데이터 버스(113)를 통해 하나 이상의 중앙 프로세서(117) 및 하나 이상의 다른 프로세서[미디어 프로세서(115) 등]와 연결되어 있는 하나 이상의 호스트 프로세서를 포함하는 그래픽 시스템일 수 있다. 복수의 호스트 프로세서가 호스팅 시스템(101)에서 서로 네트워크로 연결되어 있을 수 있다. 복수의 중앙 프로세서(117)는 서로 다른 공급업체로부터의 멀티-코어 CPU를 포함할 수 있다. 계산 프로세서 또는 계산 유닛(CPU 또는 GPU 등)이 능력 그룹과 연관되어 있을 수 있다. 예를 들어, 미디어 프로세서는 전용의 텍스처 렌더링 하드웨어를 갖는 GPU일 수 있다. 다른 미디어 프로세서는 전용의 텍스처 렌더링 하드웨어 및 배정도 부동 소수점 산술 둘다를 지원하는 GPU일 수 있다. 다수의 GPU가 SLI(Scalable Link Interface) 또는 CrossFire 구성을 위해 서로 연결될 수 있다.
일 실시예에서, 호스팅 시스템(101)은 소프트웨어 스택(software stack)을 지원할 수 있다. 소프트웨어 스택은 응용 프로그램(103), 계산 플랫폼 계층(111), 예를 들어, OpenCL(Open Computing Language) 플랫폼, 계산 런타임 계층(109), 계산 컴파일러(107), 및 계산 응용 프로그램 라이브러리(105)와 같은 소프트웨어 스택 구성요소를 포함할 수 있다. 응용 프로그램(103)은 API 호출을 통해 기타 스택 구성요소와 인터페이싱할 수 있다. 호스팅 시스템(101)에서 응용 프로그램(103)에 대한 하나 이상의 스레드가 동시에 실행되고 있을 수 있다. 계산 플랫폼 계층(111)은 각각의 연결된 물리적 컴퓨팅 장치의 처리 능력을 저장하는 데이터 구조 또는 컴퓨팅 장치 데이터 구조를 유지할 수 있다. 일 실시예에서, 응용 프로그램은 계산 플랫폼 계층(111)을 통해 호스팅 시스템(101)의 가용 처리 리소스에 관한 정보를 검색할 수 있다. 응용 프로그램은 계산 플랫폼 계층(111)을 통해 처리 작업을 수행하기 위한 능력 요구사항을 선택하고 지정할 수 있다. 따라서, 계산 플랫폼 계층(111)은 처리 작업을 위해 연결된 CPU(117) 및/또는 GPU(115)로부터의 처리 리소스를 할당하고 초기화하도록 물리적 컴퓨팅 장치에 대한 구성을 결정할 수 있다. 일 실시예에서, 계산 플랫폼 계층(111)은 구성된 하나 이상의 실제의 물리적 컴퓨팅 장치에 대응하는, 응용 프로그램에 대한 하나 이상의 논리적 컴퓨팅 장치를 발생할 수 있다.
계산 런타임 계층(109)은 응용 프로그램(103)에 대한 구성된 처리 리소스에 따라, 예를 들어, 하나 이상의 논리적 컴퓨팅 장치에 기초하여, 처리 작업의 실행을 관리할 수 있다. 일 실시예에서, 처리 작업을 실행하는 것은 처리 작업을 나타내는 계산 프로그램 객체(compute program object)를 생성하는 것 및, 예를 들어, 실행파일, 입/출력 데이터, 기타 등등을 보유하기 위한 메모리 리소스를 할당하는 것을 포함할 수 있다. 계산 프로그램 객체에 대한 로드된 실행파일이 계산 프로그램 실행파일일 수 있다. 계산 프로그램 실행파일은 계산 프로세서 또는 계산 유닛(CPU 또는 GPU 등)에서 실행될 계산 프로그램 객체에 포함되어 있을 수 있다. 계산 런타임 계층(109)은 처리 작업의 실제 실행을 수행하기 위해 할당된 물리적 장치와 상호작용할 수 있다. 일 실시예에서, 계산 런타임 계층(109)은 처리 작업을 위해 구성된 각각의 프로세서(CPU 또는 GPU 등)의 런타임 상태에 따라 서로 다른 응용 프로그램으로부터의 다수의 처리 작업을 실행하는 것을 조정할 수 있다. 계산 런타임 계층(109)은, 런타임 상태에 기초하여, 처리 작업을 수행하도록 구성된 물리적 컴퓨팅 장치로부터의 하나 이상의 프로세서를 선택할 수 있다. 처리 작업을 수행하는 것은 복수의 물리적 컴퓨팅 장치에서 하나 이상의 실행파일의 다수의 스레드를 동시에 실행하는 것을 포함할 수 있다. 일 실시예에서, 계산 런타임 계층(109)은 각각의 프로세서의 런타임 실행 상태를 모니터링함으로써 각각의 실행된 처리 작업의 상태를 추적할 수 있다.
런타임 계층은 응용 프로그램(103)으로부터의 처리 작업에 대응하는 계산 프로그램 실행파일로서 하나 이상의 실행파일을 로드할 수 있다. 일 실시예에서, 계산 런타임 계층(109)은 계산 응용 프로그램 라이브러리(105)로부터 처리 작업을 수행하는 데 필요한 부가의 실행파일을 자동으로 로드한다. 계산 런타임 계층(109)은 응용 프로그램(103) 또는 계산 응용 프로그램 라이브러리(105)로부터 계산 프로그램 객체에 대한 실행파일 및 그의 대응하는 소스 프로그램 둘다를 로드할 수 있다. 계산 프로그램 객체에 대한 소스 프로그램이 계산 프로그램 소스일 수 있다. 다수의 유형 및/또는 서로 다른 버전의 물리적 컴퓨팅 장치를 포함하도록 구성된 논리적 컴퓨팅 장치에 따라, 하나의 계산 프로그램 소스에 기초한 복수의 실행파일이 로드될 수 있다. 일 실시예에서, 계산 런타임 계층(109)은 로드된 소스 프로그램을, 실행파일을 실행하도록 구성된 대상 프로세서(예를 들어, CPU 또는 GPU)에 최적화되어 있는 실행파일로 온라인 컴파일하기 위해 계산 컴파일러(107)를 활성화시킬 수 있다.
온라인 컴파일된 실행파일은 대응하는 소스 프로그램에 따라 기존의 실행파일에 부가하여 장래의 호출을 위해 저장될 수 있다. 그에 부가하여, 실행파일이 API 호출을 사용하여 오프라인으로 컴파일되고 계산 런타임(109)에 로드될 수 있다. 계산 응용 프로그램 라이브러리(105) 및/또는 응용 프로그램(103)은, 응용 프로그램으로부터의 라이브러리 API 요청에 응답하여, 연관된 실행파일을 로드할 수 있다. 계산 응용 프로그램 라이브러리(105) 또는 응용 프로그램(103)에 대해 새로 컴파일된 실행파일이 동적으로 업데이트될 수 있다. 일 실시예에서, 계산 런타임(109)은 새로 업그레이드된 버전의 컴퓨팅 장치에 대해 응용 프로그램에서의 기존의 계산 프로그램 실행파일을, 계산 컴파일러(107)를 통해 온라인 컴파일된 새로운 실행파일로 교체할 수 있다. 계산 런타임(109)은 계산 응용 프로그램 라이브러리(105)를 업데이트하기 위해 온라인으로 컴파일된 새로운 실행파일을 삽입할 수 있다. 일 실시예에서, 계산 런타임(109)은, 처리 작업에 대한 실행파일을 로드할 때, 계산 컴파일러(107)를 호출할 수 있다. 다른 실시예에서, 계산 응용 프로그램 라이브러리(105)에 대한 실행파일을 빌드(build)하기 위해 계산 컴파일러(107)가 오프라인으로 호출될 수 있다. 계산 컴파일러(107)는 계산 커널 프로그램을 컴파일하고 링크하여 계산 프로그램 실행파일을 생성할 수 있다. 일 실시예에서, 계산 응용 프로그램 라이브러리(105)는, 예를 들어, 개발 툴킷 및/또는 이미지 처리를 지원하는 복수의 함수를 포함할 수 있다. 각각의 라이브러리 함수는 복수의 물리적 컴퓨팅 장치에 대한 계산 응용 프로그램 라이브러리(105)에 저장되어 있는 계산 프로그램 소스 및 하나 이상의 계산 프로그램 실행파일에 대응할 수 있다.
도 2는 다수의 스레드를 동시에 실행하기 위해 병렬로 동작하는 다수의 계산 프로세서(예를 들어, 계산 유닛)를 갖는 컴퓨팅 장치의 일례를 나타낸 블록도이다. 각각의 계산 프로세서는 복수의 스레드를 병렬로(또는 동시에) 실행할 수 있다. 계산 프로세서 또는 계산 유닛에서 병렬로 실행될 수 있는 스레드들을 스레드 그룹이라고 할 수 있다. 컴퓨팅 장치는 병렬로 실행될 수 있는 다수의 스레드 그룹을 가질 수 있다. 예를 들어, M개의 스레드가 컴퓨팅 장치(205)에서 스레드 그룹으로서 실행되는 것으로 나타내어져 있다. 다수의 스레드 그룹, 예를 들어, 계산 프로세서_1(205)의 스레드 1 및 계산 프로세서_L(203)의 스레드 N이 하나의 컴퓨팅 장치에 있는 또는 다수의 컴퓨팅 장치에 걸쳐 있는 개별적인 계산 프로세서들에서 병렬로 실행될 수 있다. 다수의 계산 프로세서에 걸쳐 있는 복수의 스레드 그룹이 계산 프로그램 실행파일을 병렬로 실행할 수 있다. 2개 이상의 계산 프로세서가, ASIC(Application Specific Integrated Circuit) 디바이스 등의 하나의 칩에 기초할 수 있다. 일 실시예에서, 응용 프로그램으로부터의 다수의 스레드가 다수의 칩에 걸쳐 있는 2개 이상의 계산 프로세서에서 동시에 실행될 수 있다.
컴퓨팅 장치는 프로세서_1(205) 및 프로세서_L(203)과 같은 하나 이상의 계산 프로세서 또는 계산 유닛을 포함할 수 있다. 로컬 메모리가 계산 프로세서와 연결되어 있을 수 있다. 계산 프로세서에서 실행 중인 하나의 스레드 그룹 내의 스레드들 간에 공유되는 로컬 메모리는 계산 프로세서와 연결된 로컬 메모리에 의해 지원될 수 있다. 스레드 1(213) 및 스레드 N(209)와 같은 서로 다른 스레드 그룹으로부터의 다수의 스레드가 컴퓨팅 장치(201)에 연결된 컴퓨팅 장치 메모리(217)에 저장되어 있는 계산 메모리 객체(스트림 등)를 공유할 수 있다. 컴퓨팅 장치 메모리(217)는 전역 메모리(global memory) 및 상수 메모리(constant memory)를 포함할 수 있다. 전역 메모리는 계산 메모리 객체(스트림 등)를 할당하는 데 사용될 수 있다. 계산 메모리 객체는 계산 프로그램 실행파일에 의해 처리될 수 있는 데이터 요소들의 컬렉션을 포함할 수 있다. 계산 메모리 객체는 이미지, 텍스처, 프레임 버퍼, 스칼라 데이터 형식의 어레이, 사용자-정의 구조체의 어레이, 또는 변수, 기타를 나타낼 수 있다. 상수 메모리는 계산 프로그램 실행파일에 의해 빈번히 사용되는 상수 변수를 저장하는 판독 전용 메모리일 수 있다.
일 실시예에서, 계산 프로세서 또는 계산 유닛에 대한 로컬 메모리는 스레드 그룹 내의 모든 스레드 또는 스레드 그룹에 의해 공유되는 변수를 할당하는 데 사용될 수 있다. 로컬 메모리는, 프로세서_1에 대한 로컬 공유 메모리(219) 및 프로세서_L에 대한 로컬 공유 메모리(221)와 같은 전용의 로컬 저장소로서 구현될 수 있다. 다른 실시예에서, 계산 프로세서에 대한 로컬 메모리는, 컴퓨팅 장치(201) 내의 계산 프로세서(205, 203)에 대한 데이터 캐시(215)와 같은, 컴퓨팅 장치의 하나 이상의 계산 프로세서에 대한 컴퓨팅 장치 메모리의 판독-기록 캐시로서 구현될 수 있다. 전용의 로컬 저장소는 서로 다른 스레드 그룹에 걸쳐 있는 스레드들에 의해 공유될 수 없다. 프로세서_1(205)와 같은 계산 프로세서의 로컬 메모리가 판독-기록 캐시[예를 들어, 데이터 캐시(215)]로서 구현되는 경우, 로컬 메모리에 있는 것으로 선언된 변수가 컴퓨팅 장치 메모리(217)로부터 할당되고 로컬 메모리를 구현하는 판독-기록 캐시[예를 들어, 데이터 캐시(215)]에 캐싱될 수 있다. 예를 들어, 대응하는 컴퓨팅 장치에서 판독-기록 캐시도 전용의 로컬 저장소도 이용가능하지 않을 때, 스레드 그룹 내의 스레드들이 컴퓨팅 장치 메모리(217) 내의 할당된 지역 변수를 공유할 수 있다. 일 실시예에서, 각각의 스레드는 스레드에서 호출되는 함수에 의해 사용되는 스레드 전용 변수(thread private variable)를 저장하는 전용 메모리(private memory)와 연관되어 있다. 예를 들어, 전용 메모리 1(211)은 스레드 1(213) 이외의 스레드가 볼 수 없다.
도 3은 복수의 물리적 컴퓨팅 장치가 컴퓨팅 장치 식별자를 사용하여 논리적 컴퓨팅 장치로서 구성되어 있는 일 실시예를 나타낸 블록도이다. 일 실시예에서, 응용 프로그램(303) 및 플랫폼 계층(111)이 호스트 CPU(301)에서 실행되고 있을 수 있다. 응용 프로그램(303)은 도 1의 응용 프로그램들(103) 중 하나일 수 있다. 호스팅 시스템(101)은 호스트 CPU(301)를 포함할 수 있다. 물리적 컴퓨팅 장치 Physical_Compute_Device-1(305) 내지 Physical_Compute_Device-N(311) 각각은 도 1의 CPU들(117) 또는 GPU들(115) 중 하나일 수 있다. 일 실시예에서, 계산 플랫폼 계층(111)은 API 요청에 포함된 능력 요구사항 목록에 따라 데이터 병렬 처리 리소스를 구성하기 위해 응용 프로그램(303)으로부터의 API 요청에 응답하여 컴퓨팅 장치 식별자(307)를 발생할 수 있다. 컴퓨팅 장치 식별자(307)는 계산 플랫폼 계층(111)에 의한 구성에 따른 일련의 실제의 물리적 컴퓨팅 장치 Physical_Compute_Device-1(305) 내지 Physical_Compute_Device-N(311)를 말하는 것일 수 있다. 일 실시예에서, 논리적 컴퓨팅 장치(309)는 호스트 CPU(301)와 별개인 선택된 물리적 컴퓨팅 장치들의 그룹을 나타낼 수 있다.
도 4는 응용 프로그램으로부터 수신된 능력 요구사항과 매칭시킴으로써 컴퓨팅 장치 식별자를 사용하여 복수의 물리적 컴퓨팅 장치를 구성하는 프로세스(400)의 일 실시예를 나타낸 흐름도이다. 예시적인 프로세스(400)는 하드웨어(회로, 전용 논리, 기타), 소프트웨어(전용 기계 상에서 실행되는 것 등), 또는 이 둘의 조합을 포함할 수 있는 처리 논리에 의해 수행될 수 있다. 예를 들어, 프로세스(400)는 도 1의 시스템(100)에 따라 호스팅 시스템(101)에 의해 호스팅되는 데이터 처리 시스템에서 수행될 수 있다. 데이터 처리 시스템은 도 1의 계산 플랫폼 계층(111)과 같은 플랫폼 계층을 호스팅하는 호스트 프로세서, 및 도 1의 CPU(117) 및 GPU(115)와 같은 호스트 프로세서에 연결된 다수의 물리적 컴퓨팅 장치를 포함할 수 있다.
블록(401)에서, 일 실시예에서, 프로세스(400)의 처리 논리는 하나 이상의 대응하는 능력과 연관된 다수의 물리적 컴퓨팅 장치를 나타내는 데이터 구조(또는 컴퓨팅 장치 데이터 구조)를 작성할 수 있다. 각각의 물리적 컴퓨팅 장치는 프로세스(400)의 처리 논리를 수행하는 처리 시스템에 연결될 수 있다. 물리적 컴퓨팅 장치(CPU 또는 GPU 등)의 능력 또는 계산 능력은 물리적 컴퓨팅 장치가 처리 기능(processing feature), 메모리 액세스 메커니즘, 지명된 확장(named extension) 또는 연관된 제한을 지원하는지 여부를 포함할 수 있다. 처리 기능은 전용의 텍스처링 하드웨어 지원, 배정도 부동 소수점 산술 또는 동기화 지원[예를 들어, 뮤텍스(mutex)]에 관련되어 있을 수 있다.
컴퓨팅 장치의 능력은 컴퓨팅 장치와 연관된 처리 특성 또는 제한을 나타내는 유형을 포함할 수 있다. 응용 프로그램은 요구된 컴퓨팅 장치의 유형을 지정하거나 API를 사용하여 특정의 컴퓨팅 장치의 유형을 질의할 수 있다. 서로 다른 유형의 컴퓨팅 장치의 일례가 이하의 표에 나타내어져 있다.
cl_device_type 설명
CL_DEVICE_TYPE_CPU 단일 또는 다중-코어 CPU 컴퓨팅 장치가 호스트 프로세서로서 기능할 수 있다. 호스트 CPU는 응용 프로그램 및 OpenCL 런타임을 호스팅할 수 있다.
CL_DEVICE_TYPE_GPU 예를 들어, OpenGL 또는 DirectX 등의 3D API를 가속시키는 GPU로서도 사용될 수 있는 컴퓨팅 장치
CL_DEVICE_TYPE_ACCELERATOR DSP(digital signal processor), DAXPY(double precision a times x plus y) 가속기, 기타 등등의 CPU 또는 GPU 이외의 전용 계산 가속기
CL_DEVICE_TYPE_ALL 시스템에서 이용가능한 모든 컴퓨팅 장치
그에 부가하여, 컴퓨팅 장치의 능력은, 예를 들어, 이하의 표에 나타낸 바와 같은 구성값을 포함할 수 있다.
cl_device_config_info 설명
CL_DEVICE_TYPE 컴퓨팅 장치 유형. 현재 지원되는 값은
CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_GPU, CL_DEVICE_TYPE_ACCELERATOR 또는 이들의 조합
CL_DEVICE_MAX_COMPUTE_UNITS 컴퓨팅 장치 상의 병렬 계산 유닛의 수. 최소값은 1임.
CL_DEVICE_MAX_THREAD_DIMENSIONS 전역 및 지역 스레드 ID를 지정하는 최대 차원. 최소값은 3임.
CL_DEVICE_MAX_GLOBAL_THREAD_SIZE 지정될 수 있는 전역 스레드의 최대 수
CL_DEVICE_MAX_THREAD_GROUP_SIZE 스레드 그룹 내의 스레드의 최대 수
CL_DEVICE_SIMD_THREAD_GROUP_SIZE 각각의 스레드 그룹이 SIMD 스레드 그룹으로 분할될 수 있음. 이 SIMD 그룹 내의 스레드의 수가 이 토큰에 의해 주어짐. 각각의 SIMD 그룹 내의 스레드가 SIMD 방식으로 실행됨. SIMD 그룹의 크기가 n인 경우, 스레드 그룹의 처음 n개의 스레드가 SIMD 그룹 0에 의해 실행되고, 그 다음 n개의 스레드가 SIMD 그룹 1에 의해 실행되며, 이하 마찬가지임.
CL_DEVICE_CLOCK_FREQUENCY 컴퓨팅 장치 클럭 주파수(단위: MHz)
CL_DEVICE_ADDRESS_SPACE_BITS 부호없는 정수 값으로 지정된 컴퓨팅 장치 주소 공간 크기(단위: 비트), 예를 들어, 32 또는 64 비트.
CL_DEVICE_MAX_READ_IMAGE_ARGS 계산 커널에 의해 판독될 수 있는 동시적인 이미지 메모리 객체의 최대 수
CL_DEVICE_MAX_WRITE_IMAGE_ARGS1 계산 커널에 기록될 수 잇는 동시적인 이미지 메모리 객체의 최대 수. 컴퓨팅 장치가 포맷팅된 이미지 기록을 지원하지 않는 경우 최소값이 0임. 포맷팅된 이미지 기록이 지원되는 경우, 최소값이 8임.
CL_DEVICE_MAX_MEM_ALLOC_SIZE 메모리 객체 할당의 최대 크기(단위: 바이트). 최소값은 max(CL_DEVICE_GLOBAL_MEM_SIZE의 1/4th, 128*1024*1024)임.
CL_DEVICE_IMAGE2D_MAX_WIDTH 2D 이미지의 최대 폭(단위: 픽셀). 최소값은 8192임.
CL_DEVICE_IMAGE3D_MAX_WIDTH 3D 이미지의 최대 폭(단위: 픽셀). 최소값은 1024임.
CL_DEVICE_IMAGE3D_MAX_HEIGHT 3D 이미지의 최대 높이(단위: 픽셀). 최소값은 1024임.
CL_DEVICE_IMAGE3D_MAX_DEPTH 3D 이미지의 최대 깊이(단위: 픽셀). 최소값은 1024임.
CL_DEVICE_MAX_SAMPLERS 계산 커널에서 사용될 수 있는 샘플러의 최대 수. 최소값은 16일 수 있음. 샘플러가 주소 모드, 필터 모드 및 다차원 객체에 대한 정규화된 좌표를 포함할 수 있음.
CL_DEVICE_MAX_SAMPLERS 계산 커널에서 사용될 수 있는 샘플러의 최대 수. 최소값은 16일 수 있음.
CL_DEVICE_MEM_BASE_ADDR_ALIGN 임의의 할당된 메모리 객체의 베이스 주소에 대한 비트 단위의 정렬을 기술함.
CL_DEVICE_IMAGE_PITCH_ALIGN 이미지 메모리 객체에 대한 비트 단위의 피치 정렬 요구사항을 기술함
CL_DEVICE_IMAGE_MIN_PITCH_SIZE 이것은 임의의 이미지 메모리 객체에 대해 허용된 최소 피치 크기(단위: 바이트)
CL_DEVICE_SINGLE_FP_CONFIG 컴퓨팅 장치의 단정도 부동 소수점 능력을 기술함. 이것은 이하의 값들 중 하나 이상을 기술하는 비트-필드임.
CL_FP_DENORM - denorm이 지원됨
CL_FP_INF_NAN - INF 및 NaN이 지원됨
CL_FP_ROUND_TO_NEAREST - 최근접 값으로 반올림 모드 지원됨
CL_FP_ROUND_TO_ZERO - 0으로 반올림 반올림 모드 지원됨
CL_FP_ROUND_TO_INF - +ve 및 -ve 무한대로 반올림 반올림 모드 지원됨
CL_FP_FMA - IEEE754r FMA(fused multiply-add) 지원됨
필수적인 최소 부동 소수점 능력은 CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN을 포함할 수 있음.
CL_DEVICE_GLOBAL_MEM_CACHE_TYPE CL_NONE, CL_READ 및 CL_READ_WRITE 등의 전역 메모리 캐시의 유형이 지원됨
CL_DEVICE_GLOBAL_MEM_CACHE_LINE_SIZE 전역 메모리 캐시 라인의 크기(단위: 바이트)
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 전역 메모리 캐시의 크기(단위: 바이트)
CL_DEVICE_GLOBAL_MEM_SIZE 전역 장치 메모리의 크기(단위: 바이트)
CL_DEVICE_GLOBAL_GART_MEM_SIZE 호스트 액세스가능(PCIe) 메모리의 크기(단위: 바이트)
CL_DEVICE_CONSTANT_MEM_SIZE 상수 메모리 영역의 크기(단위: 바이트)
CL_DEVICE_LOCAL_MEM_TYPE 이용가능한 로컬 메모리의 유형. 예를 들어, CL_LOCAL 값은 SRAM 또는 CL_GLOBAL과 같은 전용 로컬 메모리 저장소를 암시할 수 있음.
CL_DEVICE_LOCAL_MEM_SIZE 로컬 메모리 영역의 크기(단위: 바이트)
CL_DEVICE_PROFILING_TIMER_RESOLUTION 컴퓨팅 장치 타이머의 분해능을 기술함. 이것은 나노초 단위로 측정됨.
CL_DEVICE_EXTENSIONS 64 비트 부동 소수점 산술 연산, 64 비트 정수 산술 연산, 3D 이미지 기록, 복소수, 로컬 원자성, 기타 등등의 지원되는 선택적 특징을 기술하는 문자열.
물리적 처리 장치의 메모리 액세스 메커니즘은 변수 캐시의 유형(예를 들어, 지원되지 않음, 판독-전용, 또는 판독-기록), 계산 메모리 객체 캐시의 유형, 캐시 크기 지원, 전용 로컬 메모리 지원 또는 연관된 제한에 관련되어 있을 수 있다. 메모리 액세스 제한은 계산 프로그램 실행파일에 의해 동시에 판독 또는 기록될 수 있는 계산 메모리 객체의 최대 수, 할당될 수 있는 계산 메모리 객체의 최대 수, 또는 다차원 계산 메모리 객체의 한 차원에서의 최대 크기, 예를 들어, 2D(2차원) 이미지에 대한 계산 메모리 객체의 최대 폭을 포함할 수 있다. 데이터 처리 시스템의 시스템 응용 프로그램은 새로운 물리적 컴퓨팅 장치를 데이터 처리 시스템에 연결한 것에 응답하여 데이터 구조를 업데이트할 수 있다. 일 실시예에서, 물리적 컴퓨팅 장치의 능력이 미리 정해져 있을 수 있다. 다른 실시예에서, 데이터 처리 시스템의 시스템 응용 프로그램은 런타임 동안에 새로 연결된 물리적 처리 장치를 발견할 수 있다. 시스템 응용 프로그램은 연결된 물리적 컴퓨팅 장치 및 그의 대응하는 능력을 나타내는 데이터 구조를 업데이트하기 위해 새로 발견된 물리적 컴퓨팅 장치의 능력을 검색할 수 있다.
일 실시예에 따르면, 프로세스(400)의 처리 논리는, 블록(403)에서, 응용 프로그램으로부터 계산 능력 요구사항을 수신할 수 있다. 응용 프로그램은 API를 호출함으로써 시스템 응용 프로그램에 계산 능력 요구사항을 송신할 수 있다. 시스템 응용 프로그램은 응용 프로그램에 대한 호스팅 시스템 내의 소프트웨어 스택의 플랫폼 계층에 대응할 수 있다. 일 실시예에서, 계산 능력 요구사항은 응용 프로그램에 대한 작업을 수행하는 처리 리소스를 요청하기 위한 요구된 능력 목록을 나타낼 수 있다. 일 실시예에서, 응용 프로그램은 작업을 다수의 스레드에서 동시에 수행하기 위해 요청된 처리 리소스를 요구할 수 있다. 그에 응답하여, 프로세스(400)의 처리 논리는, 블록(405)에서, 연결된 물리적 컴퓨팅 장치들 중에서 일군의 물리적 컴퓨팅 장치를 선택할 수 있다. 선택은 계산 능력 요구사항과 능력 데이터 구조에 저장된 계산 능력 간의 매칭에 기초하여 결정될 수 있다. 일 실시예에서, 프로세스(400)의 처리 논리는 능력 요구사항에 의해 제공되는 힌트에 따라 매칭을 수행할 수 있다.
프로세스(400)의 처리 논리는 물리적 컴퓨팅 장치와 계산 능력 요구사항 간에 매칭된 계산 능력의 수에 따라 매칭 점수(matching score)를 구할 수 있다. 일 실시예에서, 프로세스(400)의 처리 논리는 최고 매칭 점수를 갖는 다수의 물리적 컴퓨팅 장치를 선택할 수 있다. 다른 실시예에서, 프로세스(400)의 처리 논리는 능력 요구사항 내의 각각의 능력이 매칭되는 경우 물리적 컴퓨팅 장치를 선택할 수 있다. 프로세스(400)의 처리 논리는, 블록(405)에서, 다수의 매칭하는 물리적 컴퓨팅 장치 그룹을 결정할 수 있다. 일 실시예에서, 각각의 장치의 부하 분산 능력에 따라 각각의 매칭하는 물리적 컴퓨팅 장치 그룹이 선택된다. 블록(407)에서, 일 실시예에서, 프로세스(400)의 처리 논리는 블록(405)에서 선택된 각각의 물리적 컴퓨팅 장치 그룹에 대한 컴퓨팅 장치 식별자를 발생할 수 있다. 프로세스(400)의 처리 논리는, API를 호출함으로써, 발생된 컴퓨팅 장치 식별자들 중 하나 이상의 컴퓨팅 장치 식별자를 다시 응용 프로그램으로 반환할 수 있다. 응용 프로그램은 컴퓨팅 장치 식별자에 따라 작업을 수행하는 데 어느 처리 리소스를 이용할지를 선택할 수 있다. 일 실시예에서, 프로세스(400)의 처리 논리는 수신된 각각의 능력 요구사항에 대해 블록(407)에서 기껏해야 하나의 컴퓨팅 장치 식별자를 발생할 수 있다.
블록(409)에서, 일 실시예에서, 프로세스(400)의 처리 논리는 대응하는 컴퓨팅 장치 식별자에 따라 블록(405)에서 선택된 물리적 컴퓨팅 장치 그룹에 대한 논리적 컴퓨팅 장치를 초기화하기 위해 리소스를 할당할 수 있다. 논리적 컴퓨팅 장치는 하나 이상의 물리적 컴퓨팅 장치를 포함하는 컴퓨팅 장치 그룹일 수 있다. 프로세스(400)의 처리 논리는 블록(405)에서의 선택에 따라 하나 이상의 컴퓨팅 장치 식별자를 수신한 응용 프로그램으로부터의 API 요청에 응답하여 논리적 컴퓨팅 장치의 초기화를 수행할 수 있다. 프로세스(400)의 처리 논리는 응용 프로그램에 대한 논리적 컴퓨팅 장치 상에 컨텍스트 객체(context object)를 생성할 수 있다. 컨텍스트 객체에 대한 계산 메모리 객체, 계산 프로그램 객체 및/또는 계산 프로그램 실행파일에 작용하는 명령은 컨텍스트 객체를 생성할 때 API 요청에 지정된 매개변수에 따라 순차적으로(in-order)(예를 들어, 동기적으로) 또는 비순차적으로(out of order)(예를 들어, 비동기적으로) 실행될 수 있다. API 요청을 사용하여 컨텍스트 객체에 대해 계산 메모리 객체, 계산 프로그램 또는 계산 커널에 작용하는 명령을 프로파일링하는 것이 가능하게 될 수 있다. 일 실시예에서, 컨텍스트 객체는 응용 프로그램을 실행하는 호스팅 시스템 내의 하나의 응용 프로그램 스레드와 연관되어 있다. 하나의 논리적 컴퓨팅 장치에서 또는 다수의 논리적 컴퓨팅 장치에 걸쳐 처리 작업을 동시에 수행하는 다수의 스레드가 개별적인 컨텍스트 객체에 기초할 수 있다.
일 실시예에서, 프로세스(400)의 처리 논리는 clCreateContext, clRetainContext 및 clReleaseContext을 비롯한 다수의 API에 기초할 수 있다. API clCreateContext는 계산 컨텍스트를 생성한다. 계산 컨텍스트는 계산 컨텍스트 객체에 대응할 수 있다. API clRetainContext는 clRetainContext에 대한 입력 인수(input argument)로서 컨텍스트에 의해 식별된 특정의 계산 컨텍스트를 사용하는 인스턴스의 수를 증가시킨다. API clCreateContext는 암시적 보유(implicit retain)를 한다. 이것은 타사 라이브러리에 아주 도움이 되며, 타사 라이브러리는 통상적으로 응용 프로그램에 의해 타사 라이브러리에 전달된 컨텍스트를 가져온다. 그렇지만, 응용 프로그램이 라이브러리에 알려주지 않고 컨텍스트를 삭제할 수 있다. 다수의 인스턴스가 컨텍스트에 연결되고 컨텍스트로부터 해제될 수 있게 해주는 것은 라이브러리에 의해 사용되고 있는 계산 컨텍스트가 더 이상 유효하지 않은 문제를 해결해준다. clRetainContext에 대한 입력 인수가 유효한 계산 컨텍스트 객체에 대응하지 않는 경우, clRetainContext는 CU_INVALID_CONTEXT을 반환한다. API clReleaseContext는 유효한 계산 컨텍스트로부터 인스턴스를 해제시킨다. clReleaseContext에 대한 입력 인수가 유효한 계산 컨텍스트 객체에 대응하지 않는 경우, clReleaseContext는 CU_INVALID_CONTEXT을 반환한다.
도 5는 논리적 컴퓨팅 장치에서 계산 실행파일을 실행하는 예시적인 프로세스(500)의 실시예를 나타낸 흐름도이다. 일 실시예에서, 프로세스(500)는 도 1의 계산 런타임 계층(109)과 같은 데이터 처리 시스템 내의 런타임 계층에 의해 수행될 수 있다. 블록(501)에서, 프로세스(500)의 처리 논리는 계산 실행파일을 실행하기 위해 논리적 컴퓨팅 장치 내의 하나 이상의 계산 메모리 객체(예를 들어, 스트림)을 할당할 수 있다. 계산 메모리 객체는, 예를 들어, 이미지 메모리 객체 또는 어레이 메모리 객체를 표현하는 하나 이상의 데이터 요소를 포함할 수 있다. 어레이 메모리 객체는 1차원 데이터 요소 컬렉션일 수 있다. 이미지 메모리 객체는 2차원, 3차원 또는 기타 다차원 데이터(텍스처, 프레임 버퍼 또는 이미지 등)를 저장하는 컬렉션일 수 있다. 입력 계산 메모리 객체로부터 판독하는 것 및 출력 계산 메모리 객체에 기록하는 것을 비롯한 처리 작업이 계산 메모리 API를 사용하여 계산 메모리 객체 또는 스트림에 작용하는 계산 프로그램 실행파일에 의해 수행될 수 있다. 일 실시예에서, 계산 메모리 API를 사용하여 데이터 객체를 업데이트하기 위해 계산 메모리 객체가 데이터 객체[버퍼 객체, 텍스처 객체, 또는 렌더 버퍼(render buffer) 객체 등]에 연결될 수 있다. 데이터 객체는 데이터 객체에 대한 그래픽 데이터 처리 동작(텍스트 렌더링 등)을 활성화시키는 API와 연관되어 있을 수 있다.
계산 메모리 객체를 할당할 때, 프로세스(500)의 처리 논리는 API에서의 지정에 따라 할당이 어디에 존재해야 하는지를 결정할 수 있다. 예를 들어, 계산 메모리 객체는 도 1의 호스팅 시스템(101)의 호스트 메모리와 같은 호스트 메모리 및/또는 도 2의 전역 메모리 또는 상수 메모리(217)와 같은 컴퓨팅 장치 메모리의 외부에 할당될 수 있다. 호스트 메모리에 할당된 계산 메모리 객체는 컴퓨팅 장치 메모리에 캐싱될 필요가 있을 수 있다. 프로세스(500)의 처리 논리는 비블로킹(non blocking) API 인터페이스를 사용하여, 예를 들어, 데이터가 계산 메모리 객체에 로드되었는지 여부를 나타내는 동기화 데이터를 포함하는 발생된 이벤트 객체에 기초하여, 할당된 계산 메모리 객체에 데이터를 비동기적으로 로드할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 할당된 계산 메모리 객체로부터 판독하거나 그에 기록할 때 메모리 액세스 동작을 스케줄링할 수 있다. 프로세스(500)의 처리 논리는 응용 프로그램의 논리 주소를 형성하기 위해 할당된 스트림 메모리를 매핑할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 호스트 프로세서에서 실행 중인 응용 프로그램[도 1의 응용 프로그램(103) 등]으로부터의 API 요청에 기초하여 블록(501)에서의 동작을 수행할 수 있다.
블록(503)에서, 일 실시예에 따르면, 프로세스(500)의 처리 논리는 논리적 컴퓨팅 장치(예를 들어, 컴퓨팅 장치 그룹)에 대한 계산 프로그램 객체를 생성할 수 있다. 계산 프로그램 객체는 데이터 병렬 프로그램의 진입점 또는 내보내기된 함수(exported function)를 나타내는 일군의 계산 커널을 포함할 수 있다. 계산 커널은 데이터 병렬 작업(예를 들어, 함수)을 수행하기 위해 계산 유닛 상에서 실행될 수 있는 계산 프로그램 실행파일에 대한 포인터를 포함할 수 있다. 각각의 계산 커널은 함수 입력 또는 출력에 대해 할당된 계산 메모리 객체 또는 스트림[블록(501)에서 할당된 스트림 등]을 비롯한 일군의 함수 인수와 연관되어 있을 수 있다.
프로세스(500)의 처리 논리는, 블록(509)에서, 계산 프로그램 바이너리(compute program binary) 및/또는 계산 프로그램 소스를 계산 프로그램 객체에 로드할 수 있다. 계산 프로그램 바이너리는 컴퓨팅 장치 상에서 실행될 계산 프로그램 실행파일을 기술하는 비트를 포함할 수 있다. 계산 프로그램 바이너리는 계산 프로그램 실행파일 및/또는 계산 프로그램 실행파일로 변환될 계산 프로그램 소스의 중간 표현일 수 있다. 일 실시예에서, 계산 프로그램 실행파일은, 예를 들어, 대상 물리적 컴퓨팅 장치(예를 들어, GPU 또는 CPU)의 유형, 버전 및/또는 컴파일 옵션 또는 플래그(스레드 그룹 크기 및/또는 스레드 그룹 차원 등)와 연관된 설명 데이터를 포함할 수 있다. 계산 프로그램 소스는 계산 프로그램 실행파일이 그로부터 컴파일되는 소스 코드일 수 있다. 프로세스(500)의 처리 논리는, 블록(509)에서, 계산 프로그램 소스에 대응하는 다수의 계산 프로그램 실행파일을 로드할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 응용 프로그램으로부터 또는 도 1의 계산 응용 프로그램 라이브러리(105)와 같은 계산 라이브러리를 통해 계산 프로그램 실행파일을 로드할 수 있다. 계산 프로그램 실행파일이 대응하는 계산 프로그램 소스와 함께 로드될 수 있다. 프로세스(500)의 처리 논리는, 블록(505)에서, 계산 프로그램 객체에 대한 함수 인수를 설정할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 응용 프로그램으로부터의 API 요청에 따라 블록(503, 505 및 509)에서의 동작을 수행할 수 있다.
블록(511)에서, 프로세스(500)의 처리 논리는 논리적 컴퓨팅 장치로 계산 커널 객체를 실행하기 위해 실행 큐를 업데이트할 수 있다. 프로세스(500)의 처리 논리는 응용 프로그램 또는 계산 응용 프로그램 라이브러리[도 1의 응용 프로그램(103) 또는 계산 응용 프로그램 라이브러리(105) 등]로부터의 계산 런타임[도 1의 계산 런타임(109) 등]에 대한 적절한 인수를 갖는 API 호출에 응답하여 계산 커널을 실행할 수 있다. 계산 커널을 실행하는 것은 계산 커널과 연관된 계산 프로그램 실행파일을 실행하는 것을 포함할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 계산 커널을 실행하기 위해 계산 커널 실행 인스턴스를 발생할 수 있다. 계산 커널을 실행하기 위해 도 1의 계산 런타임(109)과 같은 계산 런타임에 대한 API 호출이 사실상 비동기적일 수 있다. 실행 인스턴스가 도 1의 계산 런타임(109)과 같은 계산 런타임에 의해 반환될 수 있는 계산 이벤트 객체에 의해 식별될 수 있다. 계산 커널 인스턴스를 실행하기 위해 계산 커널 실행 인스턴스가 실행 큐에 추가될 수 있다.
일 실시예에서, 계산 커널을 실행하기 위해 계산 런타임에 대한 API 호출은 계산 프로세서 상에서 스레드 그룹으로서 병렬로 동시에 실행될 스레드의 수를 포함할 수 있다. API 호출은 사용할 계산 프로세서의 수를 포함할 수 있다. 계산 커널 실행 인스턴스는 대응하는 계산 프로그램 실행파일을 실행할 원하는 우선순위를 나타내는 우선순위 값을 포함할 수 있다. 계산 커널 실행 인스턴스는 또한 이전의 실행 인스턴스를 식별해주는 이벤트 객체 및/또는 실행을 수행할 예상된 스레드의 총수 및 스레드 그룹의 수를 포함할 수 있다. 스레드 그룹의 수 및 스레드의 총수는 API 호출에서 지정될 수 있다. 일 실시예에서, 이벤트 객체는 이벤트 객체를 포함하는 실행 인스턴스와 이벤트 객체에 의해 식별되는 다른 실행 인스턴스 간의 실행 순서 관계를 나타낼 수 있다. 이벤트 객체를 포함하는 실행 인스턴스는 이벤트 객체에 의해 식별된 다른 실행 인스턴스가 실행을 완료한 후에 실행되어야만 할지도 모른다. 이벤트 객체를 queue_after_event_object라고 말할 수 있다. 일 실시예에서, 실행 큐는 대응하는 계산 프로그램 실행파일을 실행하는 다수의 계산 커널 실행 인스턴스를 포함할 수 있다. 실행 큐에서 실행하기 위해, 계산 프로그램 실행파일에 대한 하나 이상의 계산 커널 실행 인스턴스가 스케줄링될 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 응용 프로그램으로부터의 API 요청에 응답하여 실행 큐를 업데이트할 수 있다. 실행 큐는 응용 프로그램이 실행되고 있는 호스팅 데이터 시스템에 의해 호스팅될 수 있다.
블록(513)에서, 프로세스(500)의 처리 논리는 실행을 위해 실행 큐로부터 계산 커널 실행 인스턴스를 선택할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 대응하는 논리적 컴퓨팅 장치에 따라 동시에 실행될 2개 이상의 계산 커널 실행 인스턴스를 선택할 수 있다. 프로세스(500)의 처리 논리는 계산 커널 실행 인스턴스가, 그의 연관된 우선순위 및 실행 큐 내의 다른 실행 인스턴스들과의 의존 관계에 기초하여, 실행 큐로부터 선택되었는지 여부를 판정할 수 있다. 계산 커널 실행 인스턴스는 계산 커널 객체에 로드된 실행파일에 따라 그의 대응하는 계산 커널 객체를 실행함으로써 실행될 수 있다.
블록(517)에서, 일 실시예에서, 프로세스(500)의 처리 논리는, 계산 커널 객체의 논리적 컴퓨팅 장치와 연관된 물리적 컴퓨팅 장치에서 실행하기 위해, 선택된 계산 커널 인스턴스에 대응하는 계산 커널 객체에 로드된 복수의 실행파일 중 하나의 실행파일을 선택할 수 있다. 프로세스(500)의 처리 논리는 하나의 계산 커널 실행 인스턴스에 대해 2개 이상의 물리적 컴퓨팅 장치에서 병렬로 실행될 2개 이상의 실행파일을 선택할 수 있다. 선택은 선택된 계산 커널 실행 인스턴스와 연관된 논리적 컴퓨팅 장치에 대응하는 물리적 컴퓨팅 장치의 현재의 실행 상태에 기초할 수 있다. 물리적 컴퓨팅 장치의 실행 상태는 실행 중인 스레드의 수, 로컬 메모리 사용 수준 및 프로세서 사용 수준(예를 들어, 단위 시간당 동작들의 피크 수) 등을 포함할 수 있다. 일 실시예에서, 선택은 미리 정해진 사용 레벨에 기초할 수 있다. 다른 실시예에서, 선택은 계산 커널 실행 인스턴스와 연관된 스레드의 수 및 스레드 그룹의 수에 기초할 수 있다. 프로세스(500)의 처리 논리는 물리적 컴퓨팅 장치로부터 실행 상태를 검색할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 호스팅 시스템에서 실행 중인 응용 프로그램에 대해 비동기적으로 블록(513, 517)에서 실행하기 위해 실행 큐로부터 계산 커널 실행 인스턴스를 선택하는 동작을 수행할 수 있다.
블록(519)에서, 프로세스(500)의 처리 논리는 실행 큐에서 실행하도록 스케줄링되어 있는 계산 커널 실행 인스턴스의 실행 상태를 검사할 수 있다. 각각의 실행 인스턴스는 고유의 계산 이벤트 객체에 의해 식별될 수 있다. 도 1의 런타임(109)과 같은 계산 런타임에 따라 대응하는 계산 커널 실행 인스턴스가 큐잉될 때, 이벤트 객체가 실행 인스턴스를 실행하기 위해 API를 호출하는 응용 프로그램 또는 계산 응용 프로그램 라이브러리[도 5의 응용 프로그램(103) 또는 계산 응용 프로그램 라이브러리(105) 등]로 반환될 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 응용 프로그램으로부터의 API 요청에 응답하여 실행 상태 검사를 수행할 수 있다. 프로세스(500)의 처리 논리는 계산 커널 실행 인스턴스를 식별해주는 계산 이벤트 객체의 상태를 질의함으로써 계산 커널 실행 인스턴스의 실행이 완료되었는지를 판정할 수 있다. 프로세스(500)의 처리 논리는 응용 프로그램으로부터의 API 호출로 되돌아가기 위해 계산 커널 실행 인스턴스의 실행이 완료될 때까지 기다릴 수 있다. 프로세스(500)의 처리 논리는 계산 이벤트 객체에 기초하여 다양한 스트림으로부터 판독 및/또는 기록하는 실행 인스턴스의 처리를 제어할 수 있다.
블록(521)에서, 일 실시예에 따르면, 프로세스(500)의 처리 논리는 계산 커널 실행 인스턴스의 실행의 결과를 검색할 수 있다. 이어서, 프로세스(500)의 처리 논리는 계산 커널 실행 인스턴스를 실행하기 위해 할당된 처리 리소스를 해제할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 계산 커널 실행파일의 실행 결과를 보유하는 스트림 메모리를 로컬 메모리로 복사할 수 있다. 프로세스(500)의 처리 논리는 블록(501)에서 할당된 변수 스트림 또는 이미지 스트림을 삭제할 수 있다. 프로세스(500)의 처리 논리는 계산 커널 실행이 완료될 때를 검출하는 커널 이벤트 객체를 삭제할 수 있다. 특정의 계산 커널 객체와 연관된 각각의 계산 커널 실행 인스턴스가 완전히 실행된 경우, 프로세스(500)의 처리 논리는 특정의 계산 커널 객체를 삭제할 수 있다. 일 실시예에서, 프로세스(500)의 처리 논리는 응용 프로그램에 의해 시작된 API 요청에 기초하여 블록(521)에서의 동작을 수행할 수 있다.
도 6은 실행파일을 실행하기로 결정된 하나 이상의 물리적 컴퓨팅 장치에 대한 소스를 컴파일하는 것을 비롯한 실행파일을 로드하는 런타임 프로세스(600)의 일 실시예를 나타낸 흐름도이다. 프로세스(600)는 도 5의 블록(507)에서 프로세스(500)의 일부로서 수행될 수 있다. 일 실시예에서, 프로세스(600)는, 블록(601)에서, 논리적 컴퓨팅 장치와 연관된 각각의 물리적 컴퓨팅 장치에 대해, 물리적 컴퓨팅 장치와 호환되는 하나 이상의 기존의 계산 커널 실행파일을 선택할 수 있다. 계산 커널 실행파일은 호환되는 물리적 컴퓨팅 장치에서 실행될 수 있다. 기존의 계산 커널 실행파일은 응용 프로그램으로부터 또는 도 1의 계산 응용 프로그램 라이브러리(105)와 같은 계산 라이브러리를 통해 이용가능할 수 있다. 선택된 계산 커널 실행파일 각각은 적어도 하나의 물리적 컴퓨팅 장치에 의해 실행될 수 있다. 일 실시예에서, 선택은 기존의 계산 커널 실행파일과 연관된 설명 데이터에 기초할 수 있다.
선택된 계산 커널 객체가 존재하는 경우, 프로세스(600)는, 블록(603)에서, 선택된 계산 커널 실행파일 중 임의의 것이 물리적 컴퓨팅 장치에 최적화되어 있는지를 판정할 수 있다. 판정은, 예를 들어, 물리적 컴퓨팅 장치의 버전에 기초할 수 있다. 일 실시예에서, 프로세스(600)는, 설명 데이터에 있는 대상 물리적 컴퓨팅 장치의 버전이 물리적 컴퓨팅 장치의 버전과 일치하는 경우, 기존의 계산 커널 실행파일이 물리적 컴퓨팅 장치에 최적화되어 있는 것으로 판정할 수 있다.
블록(605)에서, 일 실시예에서, 프로세스(600)는 도 1의 계산 컴파일러(107)와 같은 온라인 컴파일러를 사용하여 대응하는 계산 커널 소스로부터 물리적 컴퓨팅 장치에 최적화된 새로운 계산 커널 실행파일을 빌드할 수 있다. 프로세스(600)는, 블록(603)에서, 선택된 계산 커널 실행파일들 중 어느 것도 물리적 컴퓨팅 장치에 최적화되어 있지 않는 것으로 밝혀지는 경우, 온라인 빌드를 수행할 수 있다. 일 실시예에서, 프로세스(600)는, 블록(601)에서, 기존의 계산 커널 실행파일들 중 어느 것도 물리적 컴퓨팅 장치와 호환되어 있지 않는 것으로 밝혀지는 경우, 온라인 빌드를 수행할 수 있다. 계산 커널 소스는 응용 프로그램으로부터 또는 도 1의 계산 응용 프로그램 라이브러리(105)와 같은 계산 라이브러리를 통해 이용가능할 수 있다.
블록(605)에서의 빌드가 성공하는 경우, 일 실시예에서, 프로세스(600)는, 블록(607)에서, 새로 빌드된 계산 커널 실행파일을 대응하는 계산 커널 객체에 로드할 수 있다. 그렇지 않은 경우, 프로세스(600)는, 블록(609)에서, 선택된 계산 커널 실행파일을 커널 객체에 로드할 수 있다. 일 실시예에서, 프로세스(600)는, 계산 커널 실행파일이 아직 로드되지 않은 경우, 계산 커널 실행파일을 계산 커널 객체에 로드할 수 있다. 다른 실시예에서, 프로세스(600)는, 계산 커널 객체에 대한 계산 커널 실행파일들 중 어느 것도 물리적 컴퓨팅 장치와 호환되지 않고 대응하는 계산 커널 소스가 이용가능하지 않은 경우, 오류 메시지를 발생할 수 있다.
도 7은 실행 인스턴스와 연관된 논리적 컴퓨팅 장치에 대응하는 하나 이상의 물리적 컴퓨팅 장치에서 실행하기 위해 실행 큐로부터 계산 커널 실행 인스턴스를 선택하는 프로세스(700)의 일 실시예를 나타낸 흐름도이다. 프로세스(700)는 도 5의 블록(513)에서 프로세스(500)의 일부로서 수행될 수 있다. 일 실시예에서, 프로세스(700)는, 블록(701)에서, 실행 큐에 현재 스케줄링되어 있는 계산 커널 실행 인스턴스들 간의 의존 상태를 식별할 수 있다. 계산 커널 실행 인스턴스의 의존 상태는, 의존 상태가 미해결(outstanding)인 경우, 계산 커널 실행 인스턴스의 실행을 못하게 할 수 있다. 일 실시예에서, 의존 상태는 출력 스트림에 의해 피드되는 입력 스트림들 간의 관계에 기초할 수 있다. 일 실시예에서, 프로세스(700)는 실행 인스턴스에 대한 대응하는 함수의 입력 스트림 및 출력 스트림에 따라 실행 인스턴스들 간의 의존 상태를 검출할 수 있다. 다른 실시예에서, 낮은 우선순위 레벨을 갖는 실행 인스턴스는 높은 우선순위 레벨을 갖는 다른 실행 인스턴스와 의존 관계를 가질 수 있다.
블록(703)에서, 일 실시예에서, 프로세스(700)는 미해결된 의존 상태를 갖지 않는 다수의 스케줄링된 계산 커널 실행 인스턴스들 중에서 실행하기 위한 계산 커널 실행 인스턴스를 선택할 수 있다. 선택은 실행 인스턴스에 할당된 우선순위 레벨에 기초할 수 있다. 일 실시예에서, 선택된 계산 커널 실행 인스턴스는 미해결 의존 상태를 갖지 않는 복수의 계산 커널 실행 인스턴스 중의 최고 우선순위 레벨과 연관될 수 있다. 블록(705)에서, 프로세스(700)는 선택된 계산 커널 실행 인스턴스에 대응하는 하나 이상의 물리적 컴퓨팅 장치에 대한 현재의 실행 상태를 검색할 수 있다. 일 실시예에서, 물리적 컴퓨팅 장치의 실행 상태가 미리 정해진 메모리 장소로부터 검색될 수 있다. 다른 실시예에서, 프로세스(700)는 물리적 컴퓨팅 장치로 상태 요청을 송신하여 실행 상태 보고를 수신한다. 프로세스(700)는, 블록(707)에서, 검색된 실행 상태에 기초하여 선택된 계산 커널 실행 인스턴스를 실행할 하나 이상의 물리적 컴퓨팅 장치를 지정할 수 있다. 일 실시예에서, 다른 물리적 컴퓨팅 장치와의 부하 분산 고려사항에 따라 실행할 물리적 컴퓨팅 장치가 지정될 수 있다. 선택된 물리적 컴퓨팅 장치는 하나 이상의 지정된(또는 미리 정해진) 기준(미리 정해진 프로세서 사용 레벨 및/또는 메모리 사용 레벨 미만 등)을 충족시키는 실행 상태와 연관될 수 있다. 일 실시예에서, 미리 정해진 기준은 선택된 계산 커널 실행 인스턴스와 연관된 스레드의 수 및 스레드 그룹의 수에 의존할 수 있다. 프로세스(700)는 다수의 스레드에서 병렬로 실행하기 위해 동일한 실행 인스턴스 또는 다수의 인스턴스에 대한 개별적인 계산 커널 실행파일을 하나 이상의 지정된 물리적 컴퓨팅 장치에 로드할 수 있다.
도 8은 다수의 계산 유닛들 간에 계산 커널 객체를 동시에 실행하기에 최적의 스레드 그룹 크기를 결정하는 프로세스(800)의 일 실시예를 나타낸 흐름도이다. 예시적인 프로세스(800)는 하드웨어(회로, 전용 논리, 기타), 소프트웨어(전용 기계 상에서 실행되는 것 등), 또는 이 둘의 조합을 포함할 수 있는 처리 논리에 의해 수행될 수 있다. 예를 들어, 프로세스(800)는 도 1의 시스템(100)의 일부 구성요소들에 의해 또는 도 5의 블록(523)에서 프로세스(500)의 일부로서 수행될 수 있다. 일 실시예에서, 블록(801)에서, 프로세스(800)의 처리 논리는 서로 다른 계산 유닛을 대상으로 하는 하나의 소스로부터 컴파일된 실행가능 코드로부터의 리소스 요구사항을 결정할 수 있다. 실행가능 코드의 리소스 요구사항은 실행가능 코드의 대상 계산 유닛에 대한 레지스터, 메모리 및/또는 기타 하드웨어 구성요소에 관한 사용 데이터를 포함할 수 있다. 하나의 소스에 의해 지정된 데이터 병렬 작업(또는 함수)을 수행하기 위해, 하나의 소스가 서로 다른 유형의 계산 유닛으로 로드되는 서로 다른 실행가능 코드로 컴파일될 수 있다. 일부 실시예에서, 프로세스(800)의 처리 논리는 소스 코드 및 소스 코드로부터 컴파일된 명령어들을 실행할 대상 계산 유닛에 기초하여 리소스 요구사항을 결정할 수 있다.
프로세스(800)의 처리 논리는 대상 계산 유닛에서 실행가능 코드를 실행하는 데 요구되는 리소스를 결정하기 위해 계산 유닛을 대상으로 하는 소스 코드로부터 컴파일된 실행가능 코드의 중간 표현을 분석(및/또는 탐색)할 수 있다. 분석 동안에, 프로세스(800)의 처리 논리는 매칭하는 최적화 조건에 기초하여 소스 코드의 어떤 부분을 식별하고, 대상 계산 유닛에서 실행하는 데 요구되는 리소스를 줄이기 위해 소스 코드의 식별된 부분을 재컴파일할 수 있다. 예를 들어, 프로세스(800)의 처리 논리는 소스 코드 내의 변수를 상수값으로 교체할 수 있다. 프로세스(800)의 처리 논리는 대응하는 실행가능 코드의 분석에 따라 데이터 병렬 작업의 차원을 식별할 수 있다. 식별된 차원이, 예를 들어, API를 사용하여 지정된 차원과 다를 때, 프로세스(800)의 처리 논리는, 예를 들어, 시스템 설정에 따라 식별된 차원과 지정된 차원 중 하나를 선택할 수 있다.
블록(803)에서, 일부 실시예에서, 프로세스(800)의 처리 논리는 결정된 리소스 요구사항에 따라 다수의 계산 유닛 간에 실행가능 코드를 병렬로 실행하기에 최적인 스레드 그룹 크기를 결정할 수 있다. 일군의 스레드가 대상 계산 유닛에서 동시에 컴파일된 실행가능 코드를 실행할 수 있다. 최적의 스레드 그룹 크기는 계산 유닛 내의 리소스 사용을 극대화하기 위해 계산 유닛에서 실행가능 코드를 실행할 스레드 그룹 내의 스레드의 수일 수 있다. 계산 유닛의 리소스 사용이 데이터 병렬 작업을 완수하는 시간으로 측정될 수 있다. 일부 실시예에서, 프로세스(800)의 처리 논리는 실행가능 코드에 대한 최적의 스레드 그룹 크기를 결정하기 위해 계산 유닛으로부터 현재의 리소스 사용 상태를 검색할 수 있다. 최적의 스레드 그룹 크기는 실행가능 코드가 수행할 데이터 병렬 작업과 연관된 차원에 기초할 수 있다. 차원은 데이터 병렬 작업에 대한 2개 이상의 척도를 따라 반복 계산을 지정하는 횟수일 수 있다. 예를 들어, 이미지 처리 작업은 이미지 폭 및 이미지 높이를 따라 2 차원과 연관되어 있을 수 있다.
블록(805)에서, 일 실시예에 따르면, 프로세스(800)의 처리 논리는 데이터 병렬 작업(또는 함수)을 완수하기 위해 하나의 소스로부터 컴파일된 하나 이상의 실행가능 코드(또는 계산 커널)를 다수의 계산 유닛 간에 병렬로 실행하는 스레드의 총수를 결정할 수 있다. 프로세스(800)의 처리 논리는 호스트 프로세서(또는 호스트 처리 장치)에서 실행 중인 응용 프로그램[도 1의 호스팅 시스템(101) 내의 응용 프로그램(103)]으로부터의 API 요청을 수신할 수 있다. API 요청은 N개의 정수(G1, G2, ..., GN)의 어레이인 다차원 값을 가지는 전역 스레드 수를 포함할 수 있다. N은 데이터 병렬 작업과 연관된 차원일 수 있다. 프로세스(800)의 처리 논리는 차원을 결정하기 위해 다차원 값으로부터 어레이 내의 정수의 수를 카운트할 수 있다. API 요청에 응답하여, 프로세스(800)의 처리 논리는 G1*G2* ...*GN인 N개의 정수의 곱에 따라 다수의 계산 유닛 간에 실행가능 코드를 실행하게 될 스레드의 총수를 결정할 수 있다.
일 실시예에서, 프로세스(800)의 처리 논리는, 블록(807)에서, 지역 스레드 그룹 수가 지정되었는지 여부를 확인할 수 있다. 지역 스레드 그룹 수는 N개의 정수(L1, L2, ..., LN)의 어레이로서 지정된 다차원 값을 가질 수 있다. 일 실시예에서, 지역 스레드 그룹 수의 차원은 데이터 병렬 작업을 수행하는 총 스레드 수의 차원과 같을 수 있다. 프로세스(800)의 처리 논리는 소스 코드 및 대상 계산 유닛에 대한 소스 코드로부터 컴파일된 실행가능 코드와 연관되어 있는 프로그램 커널 객체로부터 지역 스레드 그룹 수를 검색할 수 있다. 일 실시예에서, 지역 스레드 그룹 수는 소스 코드를 컴파일하는 API를 사용하여 지정될 수 있다. 지역 스레드 그룹 수가 검색될 수 있는 경우, 프로세스(800)의 처리 논리는 지역 스레드 그룹 수가 이미 지정되었다는 것을 확인할 수 있다. 일부 실시예에서, 호스팅 프로세서에서 실행 중인 응용 프로그램으로부터의 API 요청을 사용하여 지역 스레드 그룹 수가 지정될 수 있다. API 요청은 다차원 전역 스레드 수 및 다차원 지역 스레드 그룹 수 둘다를 포함할 수 있다.
블록(809)에서, 지역 스레드 그룹 수가 지정된 경우, 프로세스(800)의 처리 논리는 지정된 지역 스레드 그룹 수에 따라 계산 유닛에 대한 스레드 그룹 크기를 지정할 수 있다. 일 실시예에서, 다차원 값(L1, L2, ..., LN)을 가지는 지역 스레드 그룹 수에 대응하는 스레드 그룹 크기가 L1*L2* ...*LN인 N개의 정수의 곱과 같을 수 있다. 서로 다른 계산 유닛에 대한 컴파일된 실행가능 코드는 서로 다른 지역 스레드 그룹 수와 연관되어 있을 수 있다. 실행가능 코드에 대해 지역 스레드 그룹 수가 지정된 경우, 프로세스(800)의 처리 논리는, 예를 들어, 블록(803)에서의 최적의 스레드 그룹 크기의 결정에 기초하여, 다수의 계산 유닛에 대한 정해진 최적의 스레드 그룹 크기에 따라 스레드 그룹 크기를 지정할 수 있다.
프로세스(800)의 처리 논리는 대상 계산 유닛의 런타임 동안에 허용된 스레드 그룹 크기와 대조하여 지정된 스레드 그룹 크기를 검사할 수 있다. 예를 들어, 가용 리소스에 따른 최대 런타임 스레드 그룹 크기에 의해 계산 유닛이 제한될 수 있다. 프로세스(800)의 처리 논리는 대상 컴퓨팅 장치의 런타임 리소스 제약조건을 만족시키기 위해 지정된 스레드 그룹 크기를 조정할 수 있다. 일부 실시예에서, 프로세스(800)의 처리 논리는 다차원 지역 스레드 그룹 수가 지정되지 않은 경우, 블록(811)에서, 최적의 스레드 그룹 크기를 식별하기 위해 결정을 수행할 수 있다.
블록(813)에서, 프로세스(800)의 처리 논리는 데이터 병렬 작업을 위해 다수의 계산 유닛에서 동시에 실행하기 위해 스레드 그룹 크기에 따라 스레드의 총수를 분할할 수 있다. 실행가능 코드가 대응하는 스레드 그룹 크기와 같은 크기를 갖는 스레드 그룹으로서 계산 유닛에서 병렬로 실행될 수 있다. 스레드 그룹의 크기는 그룹 내의 스레드의 수일 수 있다. 프로세스(800)의 처리 논리는 데이터 병렬 작업을, 하나 이상의 계산 유닛에 걸쳐 동시에 실행될 수 있는 적절한 다차원 블록들 또는 스레드 그룹들로 분해할 수 있다.
일 실시예에서, 실행가능 코드를 실행하는 스레드는 2개의 고유 스레드 변수, 즉 전역 스레드 ID(identifier) 및 지역 스레드 ID에 의해 식별될 수 있다. 전역 스레드 ID는 전역 스레드 수(G1, G2, ..., GN)에 기초하여 (0, 0, ..., 0)에서 시작하여 (G1-1, G2-1, ..., GN-1)에 이르는 다차원 값으로 지정될 수 있다. 이와 유사하게, 지역 스레드 ID는 지역 스레드 수(L1, L2, ..., LN)에 기초하여 (0, 0, ..., 0)에서 시작하여 (L1-1, L2-1, ..., LN-1)에 이르는 다차원 값으로 지정될 수 있다. 스레드에 대한 전역 스레드 ID 및 지역 스레드 ID는 동일한 차원의 다차원 값일 수 있다.
도 9a는 소스를 저장하는 API 라이브러리 및 다수의 물리적 컴퓨팅 장치에 따른 라이브러리 내의 하나 이상의 API에 대한 다수의 실행파일을 빌드하는 프로세스(900A)의 일 실시예를 나타낸 흐름도이다. 프로세스(900A)는, 블록(901)에서 API 함수에 대한 소스 코드를 데이터 처리 시스템에 로드하기 위해, 오프라인으로 수행될 수 있다. 소스 코드는 하나 이상의 물리적 컴퓨팅 장치에서 실행될 계산 커널 소스일 수 있다. 일 실시예에서, 프로세스(900A)는, 블록(903)에서, API 함수에 대한 다수의 대상 물리적 컴퓨팅 장치를 지정할 수 있다. 대상 물리적 컴퓨팅 장치는 유형(CPU 또는 GPU 등), 버전 또는 공급업체에 따라 지정될 수 있다. 프로세스(900A)는, 블록(905)에서, 소스 코드를 각각의 지정된 대상 물리적 컴퓨팅 장치에 대한 실행파일(계산 커널 실행파일 등)로 컴파일할 수 있다. 일 실시예에서, 프로세스(900A)는 도 1의 계산 컴파일러(107)와 같은 온라인 컴파일러에 기초하여 오프라인으로 컴파일을 수행할 수 있다.
블록(907)에서, 프로세스(900A)는 API 함수의 소스 코드를, 지정된 대상 물리적 컴퓨팅 장치에 대한 컴파일된 대응하는 실행파일과 함께, API 라이브러리에 저장할 수 있다. 호스트 프로세서에서 실행 중인 호스트 응용 프로그램[도 1의 응용 프로그램(103) 등]의 소스 코드에 대응하기 위해 하나의 실행파일에 대한 하나 이상의 API 함수가 API 라이브러리로부터 내보내기(export)될 수 있다. 예를 들어, 응용 프로그램은 정규의 "C" 함수 호출인 OpenCL API를 사용하여 실행가능 코드(또는 계산 커널)를 실행할 수 있다. 일 실시예에서, 각각의 실행파일은, 예를 들어, 대상 물리적 컴퓨팅 장치의 유형, 버전 및 공급업체 및/또는 컴파일 옵션을 포함하는 설명 데이터와 함께 저장될 수 있다. 설명 데이터는 런타임 동안에 도 5의 프로세스(500)와 같은 프로세스에 의해 검색될 수 있다.
도 9b는 응용 프로그램이 API 요청에 기초하여 API 라이브러리로부터 검색된 대응하는 소스와 함께 다수의 실행파일 중 하나를 실행하는 프로세스(900B)의 일 실시예를 나타낸 흐름도이다. 일 실시예에서, 프로세스(900B)는 데이터 처리 시스템[도 1의 호스팅 시스템(101) 등]에서 API 라이브러리[도 1의 계산 응용 프로그램 라이브러리(105) 등]를 비롯한 응용 프로그램[도 1의 응용 프로그램(103) 등]을 실행한다. 블록(911)에서, 프로세스(900B)는, 도 5의 블록(507)에서의 프로세스(500)와 같이, API 요청에 기초하여 API 라이브러리로부터 계산 커널 소스와 같은 소스 및 계산 커널 실행파일과 같은 하나 이상의 대응하는 실행파일을 검색할 수 있다. 각각의 실행파일은 하나 이상의 대상 물리적 컴퓨팅 장치와 연관될 수 있다. 일 실시예에서, 계산 커널 실행파일은 다수의 버전의 물리적 컴퓨팅 장치와 역호환(backward compatible)될 수 있다. 블록(913)에서, 프로세스(900B)는, 도 5의 블록(517)에서의 프로세스(500)와 같이, 연관된 API 함수를 수행하기 위해, API 요청에 기초하여 검색된 실행파일들 중 하나를 다수의 물리적 컴퓨팅 장치에서 실행할 수 있다. 프로세스(900B)는 블록(913)에서 API 함수를 수행하는 것과 비동기적으로 블록(909)에서 응용 프로그램을 실행할 수 있다.
도 10은 다수의 물리적 컴퓨팅 장치에서 실행될 계산 프로그램 실행파일에 대한 계산 프로그램 소스 코드의 일례를 나타낸 샘플 소스 코드이다. 일례(1000)는 변수(1001) 및 스트림(또는 계산 메모리 객체)(1003)을 포함한 인수들을 갖는 API 함수를 나타낼 수 있다. 일례(1000)는 도 1의 시스템(101)과 같은 병렬 컴퓨팅 환경에 대한 프로그래밍 언어에 기초할 수 있다. 일 실시예에서, 병렬 프로그래밍 언어는 본 명세서에 기술된 실시예들 중 하나 이상을 구현하도록 설계된 부가의 확장 및 제한을 갖는 ANSI(American National Standards Institute) C 표준에 따라 지정될 수 있다. 확장은 컴퓨팅 장치에서 실행될 계산 커널 함수를 지정하기 위해 한정자(1005)와 같은 함수 한정자(function qualifier)를 포함할 수 있다. 계산 커널 함수는 다른 계산 커널 함수에 의해 호출될 수 없다. 일 실시예에서, 계산 커널 함수는 병렬 프로그램 언어에서 호스트 함수에 의해 호출될 수 있다. 호스트 함수는 정규의 ANSI C 함수일 수 있다. 호스트 함수는 계산 커널 함수를 실행하는 컴퓨팅 장치와 별개인 호스트 프로세서에서 실행될 수 있다. 일 실시예에서, 확장은 스레드 그룹의 모든 스레드에 의해 공유될 컴퓨팅 장치와 연관된 로컬 메모리에 할당될 필요가 있는 변수를 설명하는 지역 한정자(local qualifier)를 포함할 수 있다. 지역 한정자는 계산 커널 함수 내에서 선언될 수 있다. 제한이 위반될 때 오류 메시지를 출력하거나 실행을 종료하는 것과 같은 오류 조건을 발생하기 위해, 병렬 프로그래밍 언어의 제한이 컴파일 타임 또는 런타임(run time) 동안에 시행될 수 있다.
도 11a 내지 도 11c는 API를 호출함으로써 다수의 물리적 컴퓨팅 장치에서 다수의 실행파일 중 하나를 실행하도록 논리적 컴퓨팅 장치를 구성하는 일례를 나타낸 샘플 소스 코드를 포함하고 있다. 일례(1100A-1100C)는 다수의 물리적 컴퓨팅 장치와 연결된 호스트 시스템[도 1의 호스팅 시스템(101) 등]에서 실행 중인 응용 프로그램에 의해 실행될 수 있다. 일례(1100A-1100C)는 병렬 프로그래밍 언어의 호스트 함수를 지정할 수 있다. 일례(1100A-1100C)에서의 처리 동작들은 도 4의 프로세스(400) 및/또는 도 5의 프로세스(500)와 같은 프로세스에 의해 API 호출로서 수행될 수 있다. 컴퓨팅 장치, 컴퓨팅 장치 그룹 또는 논리적 컴퓨팅 장치로부터 컨텍스트 객체를 생성하는 처리 동작(1101)은 도 4의 블록(411)에서의 프로세스(400)의 처리 논리에 의해 수행될 수 있다. 입/출력 이미지 메모리 객체(예를 들어, 계산 메모리 객체)를 할당하는 처리 동작은 도 5의 블록(501)에서의 프로세스(500)의 처리 논리에 의해 수행될 수 있다.
이제 도 11b를 참조하면, 어레이 메모리 객체를 할당하고 로드하는 처리 동작(1103b)은 도 5의 블록(501)에서의 프로세스(500)의 처리 논리에 의해 수행될 수 있다. 계산 프로그램 객체를 생성하는 처리 동작(1105)은 도 5의 블록(503)에서의 프로세스(500)의 처리 논리에 의해 수행될 수 있다. 처리 동작(1107)은 도 9의 일례(900)와 같은 계산 프로그램 소스를 생성된 계산 프로그램 객체에 로드할 수 있다. 처리 동작(1109)은 로드된 계산 프로그램 소스로부터 계산 프로그램 실행파일을 명시적으로 빌드할 수 있다. 일 실시예에서, 처리 동작(1109)은 이미 빌드된 계산 프로그램 실행파일을 생성된 계산 프로그램 객체에 로드할 수 있다. 이어서, 처리 동작(1111)은 컴퓨팅 장치 상에서의 실행을 스케줄링하기 위해 빌드된 계산 프로그램 실행파일을 가리키는 계산 커널 객체를 생성할 수 있다.
이제 도 11c를 참조하면, 일 실시예에서, 처리 동작(1113)은 변수 및 계산 메모리 객체를 생성된 계산 커널 객체에 대한 함수 인수로서 첨부할 수 있다. 처리 동작(1113)은 도 5의 블록(505)에서의 프로세스(500)의 처리 논리에 의해 수행될 수 있다. 처리 동작(1115)은 생성된 계산 커널 객체를 실행할 수 있다. 일 실시예에서, 처리 동작(1115)은 도 5의 블록(511)에서의 프로세스(500)의 처리 논리에 의해 수행될 수 있다. 처리 동작(1115)은 실행 큐가 생성된 계산 커널 객체에 대응하는 계산 커널 실행 인스턴스로 업데이트되게 할 수 있다. 처리 동작(1117)은 생성된 계산 커널 객체의 실행이 완료되기를 동기적으로 기다릴 수 있다. 일 실시예에서, 처리 동작(1119)은 계산 커널 객체를 실행한 것으로부터의 결과를 검색할 수 있다. 이어서, 처리 동작(1121)은 이벤트 객체, 생성된 계산 커널 객체 및 할당된 메모리와 같은, 계산 커널 객체를 실행하기 위해 할당된 리소스를 해제할 수 있다. 일 실시예에서, 처리 동작(1117)은 커널 이벤트 객체가 설정되어 있는지 여부에 기초하여 비동기적으로 수행될 수 있다. 처리 동작(1117)은 도 5의 블록(519)에서의 프로세스(500)에 의해 수행될 수 있다.
도 12는 본 발명의 일 실시예에서 사용될 수 있는 컴퓨터 시스템(1200)의 일례를 나타낸 것이다. 예를 들어, 시스템(1200)은 도 1에 도시된 시스템의 일부로서 구현될 수 있다. 유의할 점은, 도 12가 컴퓨터 시스템의 다양한 구성요소들을 나타내고 있지만, 이러한 상세가 본 발명과 관련이 없기 때문에 이들 구성요소를 상호연결시키는 임의의 특정의 아키텍처 또는 방식을 나타내기 위한 것이 아니라는 것이다. 또한, 더 적은 구성요소 또는 어쩌면 더 많은 구성요소를 갖는 네트워크 컴퓨터 및 기타 데이터 처리 시스템(예를 들어, 핸드헬드 컴퓨터, PDA(personal digital assistant), 휴대폰, 엔터테인먼트 시스템, 가전 제품, 기타)도 역시 본 발명의 하나 이상의 실시예를 구현하는 데 사용될 수 있다는 것을 잘 알 것이다.
도 12에 도시된 바와 같이, 데이터 처리 시스템의 일종인 컴퓨터 시스템(1200)은 CPU 및/또는 GPU와 같은 마이크로프로세서(들)(1205), ROM(Read Only Memory)(1207), 휘발성 RAM(1209) 및 비휘발성 메모리(1211)에 연결되어 있는 버스(1203)를 포함한다. 마이크로프로세서(1205)는, 상기한 동작들을 수행하기 위해, 메모리(1207, 1209, 1211)로부터 명령어를 검색하고 캐시(1221)를 사용하여 명령어를 실행할 수 있다. 버스(1203)는 이들 다양한 구성요소들을 서로 상호연결시키고 또한 이들 구성요소(1205, 1207, 1209, 및 1211)를 디스플레이 제어기 및 디스플레이 장치(1213)와 주변 장치[마우스, 키보드, 모뎀, 네트워크 인터페이스, 프린터 및 공지된 기타 장치일 수 있는 입/출력(I/O) 장치 등]에 상호연결시킨다. 통상적으로, 입/출력 장치(915)는 입/출력 제어기(1217)를 통해 시스템에 연결된다. 휘발성 RAM(Random Access Memory)(1209)은 통상적으로 메모리 내의 데이터를 리프레시 또는 유지하기 위해 계속하여 전력을 필요로 하는 동적 RAM(DRAM)으로서 구현된다. 디스플레이 장치(1213)와 연결된 디스플레이 제어기는, 선택적으로, 디스플레이 데이터를 처리하는 하나 이상의 GPU를 포함할 수 있다. 선택적으로, 디스플레이 장치(1213)에 포함된 GPU를 지원하기 위해 GPU 메모리(1219)가 제공될 수 있다.
대용량 저장 장치(1211)는 통상적으로 자기 하드 드라이브 또는 자기 광 드라이브 또는 광 드라이브 또는 DVD RAM 또는 플래시 메모리 또는 시스템으로부터 전력이 제거된 후에도 데이터(예를 들어, 대량의 데이터)를 유지하는 기타 유형의 메모리 시스템이다. 통상적으로, 대용량 저장 장치(1211)가 또한 랜덤 액세스 메모리일 것이지만, 꼭 그럴 필요는 없다. 도 12가 대용량 저장 장치(1211)이 데이터 처리 시스템의 나머지 구성요소들에 직접 연결된 로컬 장치인 것으로 도시하고 있지만, 본 발명이 시스템으로부터 원격지에 있는 비휘발성 메모리[모뎀 또는 이더넷 인터페이스 또는 무선 네트워킹 인터페이스 등의 네트워크 인터페이스를 통해 데이터 처리 시스템에 연결되어 있는 네트워크 저장 장치 등]를 이용할 수 있다는 것을 잘 알 것이다. 버스(1203)는 공지되어 있는 다양한 브리지, 제어기, 및/또는 어댑터를 통해 서로 연결되어 있는 하나 이상의 버스를 포함할 수 있다.
이상에서 설명한 것의 일부분이 전용 논리 회로와 같은 논리 회로로 또는 프로그램 코드 명령어를 실행하는 마이크로컨트롤러 또는 기타 형태의 처리 코어로 구현될 수 있다. 따라서, 이상의 설명에서 개시된 프로세스는 이들 명령어를 실행하는 기계로 하여금 특정 기능을 수행하게 하는 기계-실행가능 명령어 등의 프로그램 코드로 수행될 수 있다. 이와 관련하여, "기계(machine)"는 중간 형태(또는 "추상적") 명령어를 프로세서 고유 명령어로 변환하는 기계[예를 들어, "가상 기계"(예를 들어, 자바 가상 기계), 인터프리터(interpreter), CLR(Common Language Runtime), 고수준 언어 가상 기계, 기타와 같은 추상적 실행 환경], 및/또는 범용 프로세서 및/또는 특수-목적 프로세서 등의 명령어를 실행하도록 설계된, 반도체 칩 상에 배치된 전자 회로(예를 들어, 트랜지스터로 구현되는 "논리 회로")일 수 있다. 이상의 설명에서 개시된 프로세스는 또한 (기계에 대한 대안으로서 또는 기계와 함께) 프로그램 코드의 실행 없인 프로세스(또는 그의 일부분)를 수행하도록 설계된 전자 회로에 의해 수행될 수 있다.
예를 들어, 다수의 토큰을 포함하는 프로그램 코드를 저장하는 데 제조 물품이 사용될 수 있다. 프로그램 코드를 저장하는 제조 물품은 하나 이상의 메모리[예를 들어, 하나 이상의 플래시 메모리, 랜덤 액세스 메모리(정적, 동적 또는 기타)], 광 디스크, CD-ROM, DVD ROM, EPROM, EEPROM, 자기 또는 광 카드 또는 전자 명령어를 저장하는 데 적합한 기타 유형의 기계-판독가능 매체로서 구현될 수 있지만, 이들로 제한되지 않는다. 프로그램 코드는 또한 [예를 들어, 통신 링크(예를 들어, 네트워크 연결)를 사용하여] 전파 매체에 구현된 디지털 신호를 통해 원격 컴퓨터(예를 들어, 서버)로부터 요청측 컴퓨터(예를 들어, 클라이언트)로 다운로드될 수 있다.
이전의 상세한 설명이 컴퓨터 메모리 내의 데이터 비트들에 대한 동작들의 알고리즘 및/또는 심볼 표현으로 제시되어 있다. 이 알고리즘적 설명 및/또는 표현은 데이터 처리 분야의 당업자가 다른 당업자들에게 자신의 연구의 내용을 가장 효과적으로 전달하는 데 시용되는 도구이다. 알고리즘은 여기서 일반적으로 원하는 결과를 가져오는 일관성있는 동작들의 시퀀스로 생각된다. 이 동작들은 물리적 양의 물리적 조작을 필요로 하는 동작들이다. 꼭 그럴 필요는 없지만, 보통 이들 양은 저장, 전송, 결합, 비교, 및/또는 다른 방식으로 조작될 수 있는 전기 또는 자기 신호의 형태를 갖는다. 이들 신호를 비트, 값, 요소, 심볼, 문자, 용어, 숫자, 기타로 말하는 것이, 주로 통상적으로 사용하기 때문에, 때때로 편리한 것으로 밝혀졌다.
그렇지만, 염두에 두어야 할 점은, 이 용어들 및 유사한 용어들 전부가 적절한 물리적 양과 연관되어야 하고 또 이들 양에 적용되는 편리한 호칭에 불과하다는 것이다. 달리 구체적으로 언급하지 않는 한, 이상의 설명으로부터 명백한 바와 같이, 이 설명 전체에 걸쳐, "처리" 또는 "계산" 또는 "산출" 또는 "결정" 또는 "디스플레이" 기타 등등의 용어들을 이용하는 설명이, 컴퓨터 시스템의 레지스터 및 메모리 내에 물리적(전자적) 양으로 표현된 데이터를, 컴퓨터 시스템 메모리 또는 레지스터 또는 다른 이러한 정보 저장, 전송 또는 디스플레이 장치 내의 물리적 양으로 유사하게 표현되는 다른 데이터로 조작 및 변환하는 컴퓨터 시스템 또는 유사한 전자 컴퓨팅 장치의 동작 및 프로세스를 말한다는 것을 잘 알 것이다.
본 발명은 또한 본 명세서에 기술된 동작을 수행하는 장치에 관한 것이다. 이 장치는 특히 요구된 목적에 맞도록 구성될 수 있거나, 컴퓨터에 저장된 컴퓨터 프로그램에 의해 선택적으로 활성화되거나 재구성되는 범용 컴퓨터를 포함할 수 있다. 이러한 컴퓨터 프로그램은 플로피 디스크, 광 디스크, CD-ROM, 및 광자기 디스크를 비롯한 임의의 유형의 디스크, 판독 전용 메모리(ROM), RAM, EPROM, EEPROM, 자기 또는 광 카드, 또는 전자 명령어를 저장하는 데 적합한 임의의 유형의 매체(이들로 제한되지 않음)와 같은 컴퓨터 판독가능 저장 매체에 저장될 수 있으며, 이들 저장 매체 각각이 컴퓨터 시스템 버스에 연결되어 있다.
본 명세서에 제시된 프로세스 및 디스플레이는 본질적으로 어떤 특정의 컴퓨터 또는 기타 장치에도 관련되어 있지 않다. 본 명세서의 개시 내용에 따른 프로그램에 다양한 범용 시스템이 사용될 수 있거나, 보다 특수화된 장치를 기술된 동작들을 수행하도록 구성하는 것이 편리한 것으로 밝혀질 수 있다. 각종의 이들 시스템에 대해 요구된 구조가 이하의 설명으로부터 명백하게 될 것이다. 그에 부가하여, 본 발명이 임의의 특정의 프로그래밍 언어를 참조하여 기술되어 있지 않다. 본 명세서에 기술된 본 발명의 개시 내용을 구현하는 데 각종의 프로그래밍 언어가 사용될 수 있다는 것을 알 것이다.
이상의 설명은 단지 본 발명의 몇몇 예시적인 실시예를 기술한 것에 불과하다. 당업자라면, 이러한 설명, 첨부 도면 및 특허청구범위로부터, 본 발명의 사상 및 범위를 벗어나지 않고 다양한 수정이 행해질 수 있다는 것을 잘 알 것이다.

Claims (24)

  1. 병렬 컴퓨팅 시스템으로서,
    호스트 프로세서,
    상기 호스트 프로세서에 연결된 하나 이상의 계산 유닛들, 및
    상기 호스트 프로세서 및 상기 하나 이상의 계산 유닛들 중 적어도 하나에 연결된 메모리 - 상기 메모리에 병렬 컴퓨팅 프로그램이 저장되어 있음 -
    를 포함하고,
    상기 병렬 컴퓨팅 프로그램은, 상기 호스트 프로세서가,
    데이터 처리 작업에 대한 소스 코드에 대응하는 프로그램 객체를 발생시키는 동작,
    상기 프로그램 객체로부터 상기 하나 이상의 계산 유닛들에 대한 실행가능 코드들을 발생시키는 동작, 및
    상기 데이터 처리 작업을 수행하기 위해 상기 하나 이상의 계산 유닛들 간에 동시에 실행될 실행가능 코드들을 로드하는 동작
    을 수행하도록 하는 하나 이상의 API(application programming interface)들에 대한 호출들을 포함하는, 병렬 컴퓨팅 시스템.
  2. 제1항에 있어서, 상기 프로그램 객체가 상기 소스 코드로부터 컴파일된 바이너리 코드를 포함하고, 상기 바이너리 코드가 상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에 대한 설명(descriptions)을 포함하며, 상기 하나 이상의 계산 유닛들이 CPU(central processing unit) 또는 GPU(graphics processing unit) 를 포함하는, 병렬 컴퓨팅 시스템.
  3. 제2항에 있어서, 상기 프로그램 객체를 발생시키는 동작은,
    사전 컴파일된 라이브러리로부터 상기 바이너리 코드를 검색하는 동작을 포함하고, 상기 바이너리 코드가 상기 실행가능 코드들을 포함하는, 병렬 컴퓨팅 시스템.
  4. 제2항에 있어서, 상기 실행가능 코드들을 발생시키는 동작은,
    상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에서 실행가능 코드들 중 하나의 실행가능 코드를 실행하기 위한 스레드들의 수를 지정하는 다차원 값을 포함하는 하나 이상의 컴파일 플래그들(compilation flags)에 따라 상기 소스 코드를 바이너리 코드로 컴파일하는 동작을 포함하는, 병렬 컴퓨팅 시스템.
  5. 제1항에 있어서, 상기 실행가능 코드들을 로드하는 동작은,
    상기 소스 코드들에서의 데이터 처리 작업을 구현하는 함수를 식별해주는 함수 이름과 연관된 커널 객체를 발생시키는 동작 - 상기 커널 객체는 상기 함수의 인수(argument)들에 대한 저장소를 포함함 -, 및
    상기 하나 이상의 계산 유닛들 간에 상기 실행가능 코드들의 실행을 스케줄링하는 동작
    을 포함하고,
    상기 실행이 상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에서 상기 실행가능 코드들 중 하나의 실행가능 코드를 동시에 실행할 스레드 그룹 내의 스레드들의 수를 포함하는, 병렬 컴퓨팅 시스템.
  6. 제5항에 있어서, 상기 실행가능 코드를 로드하는 동작은,
    상기 인수들의 저장소들에 대응하는 상기 메모리 내의 하나 이상의 메모리 객체들을 할당하는 동작을 더 포함하는, 병렬 컴퓨팅 시스템.
  7. 제5항에 있어서, 상기 스케줄링하는 동작은,
    상기 하나 이상의 계산 유닛들에서 병렬로 상기 실행가능 코드들을 실행할 스레드들의 총수를 결정하는 동작을 포함하는, 병렬 컴퓨팅 시스템.
  8. 제7항에 있어서, 상기 결정하는 동작은,
    상기 데이터 처리 작업을 수행할 함수에 대한 리소스 요구사항을 결정하기 위해 바이너리 코드를 분석하는 동작을 포함하는, 병렬 컴퓨팅 시스템.
  9. 제8항에 있어서, 상기 결정하는 동작은,
    상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛의 런타임 리소스 이용가능성에 따라 상기 스레드 그룹 내의 스레드들의 수를 결정하는 동작을 더 포함하는, 병렬 컴퓨팅 시스템.
  10. 제5항에 있어서, 상기 로드하는 동작은,
    상기 하나 이상의 API들에 대한 호출들 중 하나 이상의 호출에 응답하여 상기 스레드 그룹 내의 스레드들의 수를 검색하는 동작을 더 포함하는, 병렬 컴퓨팅 시스템.
  11. 복수의 프로그램 코드들을 저장하는 기계-판독가능 매체로서,
    호스트 프로세서가 하나 이상의 호스트 함수(function)들을 수행하도록 하는 하나 이상의 API(application programming interface)들에 대응하는 호스트 함수 코드들 - 상기 호스트 함수는, 데이터 처리 작업에 대한 소스 코드에 대응하는 프로그램 객체를 발생시키는 단계, 상기 프로그램 객체로부터 상기 호스트 프로세서에 연결된 하나 이상의 계산 유닛들에 대한 실행가능 코드들을 발생시키는 단계, 및 상기 데이터 처리 작업을 수행하기 위해 상기 하나 이상의 계산 유닛들 간에 동시에 실행될 실행가능 코드들을 로드하는 단계를 포함함 -, 및
    상기 데이터 처리 작업에 대한 소스 코드에 대응하는 커널 함수 코드들
    을 포함하는, 기계-판독가능 매체.
  12. 제11항에 있어서, 상기 프로그램 객체가 상기 소스 코드로부터 컴파일된 바이너리 코드를 포함하고, 상기 바이너리 코드가 상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에 대한 설명들을 포함하는, 기계-판독가능 매체.
  13. 제12항에 있어서, 상기 프로그램 객체를 발생시키는 단계가,
    사전 컴파일된 라이브러리로부터 상기 바이너리 코드를 검색하는 단계를 포함하고, 상기 바이너리 코드들은 상기 실행가능 코드들을 포함하는, 기계-판독가능 매체.
  14. 제12항에 있어서, 상기 실행가능 코드들을 발생시키는 단계가,
    상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에서 실행가능 코드들 중 하나의 실행가능 코드를 실행하기 위한 스레드들의 수를 지정하는 다차원 값을 포함하는 하나 이상의 컴파일 플래그들에 따라 상기 소스 코드를 바이너리 코드로 컴파일하는 단계를 포함하는, 기계-판독가능 매체.
  15. 제11항에 있어서, 상기 실행가능 코드들을 로드하는 단계가,
    상기 소스 코드들에서의 데이터 처리 작업을 구현하는 함수를 식별해주는 함수 이름과 연관된 커널 객체를 발생시키는 단계 - 상기 커널 객체는 상기 함수의 인수들에 대한 저장소들을 포함함 -, 및
    상기 하나 이상의 계산 유닛들 간에 상기 실행가능 코드들의 실행을 스케줄링하는 단계
    를 포함하고,
    상기 스케줄링이 상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛에서 상기 실행가능 코드들 중 하나의 실행가능 코드를 동시에 실행할 스레드 그룹 내의 스레드들의 수를 포함하는, 기계-판독가능 매체.
  16. 제15항에 있어서, 상기 실행가능 코드들을 로드하는 단계가,
    상기 인수들의 저장소들에 대한 메모리 내의 하나 이상의 메모리 객체들을 할당하는 단계를 더 포함하는, 기계-판독가능 매체.
  17. 제15항에 있어서, 상기 스케줄링하는 단계가,
    상기 하나 이상의 계산 유닛들에서 병렬로 상기 실행가능 코드들을 실행할 스레드들의 총수를 결정하는 단계를 포함하는, 기계-판독가능 매체.
  18. 제17항에 있어서, 상기 결정하는 단계가,
    상기 데이터 처리 작업을 수행할 함수에 대한 리소스 요구사항을 결정하기 위해 바이너리 코드를 분석하는 단계를 포함하는, 기계-판독가능 매체.
  19. 제18항에 있어서, 상기 결정하는 단계가,
    상기 하나 이상의 계산 유닛들 중 적어도 하나의 계산 유닛의 런타임 리소스 이용가능성에 따라 상기 스레드 그룹 내의 스레드들의 수를 결정하는 단계를 더 포함하는, 기계-판독가능 매체.
  20. 제15항에 있어서, 상기 스케줄링된 실행이 완료되었는지 여부를 나타내는 상태 값을 포함하는 이벤트 객체를 발생시키는 단계, 및
    상기 하나 이상의 API들에 대한 호출들 중 하나 이상의 호출에 응답하여 병렬 컴퓨팅 프로그램에 대한 상태 값을 검색하는 단계
    를 더 포함하는, 기계-판독가능 매체.
  21. 삭제
  22. 삭제
  23. 삭제
  24. 삭제
KR1020117000309A 2008-06-06 2009-04-20 다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들 KR101239025B1 (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US5973908P 2008-06-06 2008-06-06
US61/059,739 2008-06-06
US12/264,896 2008-11-04
US12/264,896 US8286198B2 (en) 2008-06-06 2008-11-04 Application programming interfaces for data parallel computing on multiple processors
PCT/US2009/041152 WO2009148714A1 (en) 2008-06-06 2009-04-20 Application programming interfaces for data parallel computing on multiple processors

Publications (2)

Publication Number Publication Date
KR20110019775A KR20110019775A (ko) 2011-02-28
KR101239025B1 true KR101239025B1 (ko) 2013-03-04

Family

ID=40720829

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020117000309A KR101239025B1 (ko) 2008-06-06 2009-04-20 다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들

Country Status (6)

Country Link
US (5) US8286198B2 (ko)
EP (1) EP2304563B1 (ko)
JP (1) JP5232914B2 (ko)
KR (1) KR101239025B1 (ko)
CN (2) CN105159761B (ko)
WO (1) WO2009148714A1 (ko)

Families Citing this family (97)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102006033863A1 (de) * 2006-07-21 2008-01-24 Siemens Ag Verschaltungsschnittstelle für flexibles Online/Offline-Deployment einer n-schichtigen Softwareapplikation
US9191625B2 (en) * 2008-09-26 2015-11-17 Janos Redei System and methods for transmitting and distributing media content
US9354944B2 (en) * 2009-07-27 2016-05-31 Advanced Micro Devices, Inc. Mapping processing logic having data-parallel threads across processors
US20110063304A1 (en) * 2009-09-16 2011-03-17 Nvidia Corporation Co-processing synchronizing techniques on heterogeneous graphics processing units
CN102023844B (zh) * 2009-09-18 2014-04-09 深圳中微电科技有限公司 并行处理器及其线程处理方法
US20110161495A1 (en) * 2009-12-26 2011-06-30 Ralf Ratering Accelerating opencl applications by utilizing a virtual opencl device as interface to compute clouds
KR101613971B1 (ko) * 2009-12-30 2016-04-21 삼성전자주식회사 프로그램 코드의 변환 방법
US9830889B2 (en) 2009-12-31 2017-11-28 Nvidia Corporation Methods and system for artifically and dynamically limiting the display resolution of an application
US8392463B2 (en) * 2010-04-22 2013-03-05 International Business Machines Corporation GPU enabled database systems
US8782657B2 (en) 2010-09-17 2014-07-15 Oracle International Corporation Dynamic creation and destruction of IO resources based on actual load and resource availability
US9489183B2 (en) 2010-10-12 2016-11-08 Microsoft Technology Licensing, Llc Tile communication operator
US9430204B2 (en) 2010-11-19 2016-08-30 Microsoft Technology Licensing, Llc Read-only communication operator
US9507568B2 (en) 2010-12-09 2016-11-29 Microsoft Technology Licensing, Llc Nested communication operator
US8830245B2 (en) * 2010-12-14 2014-09-09 Amazon Technologies, Inc. Load balancing between general purpose processors and graphics processors
US9395957B2 (en) 2010-12-22 2016-07-19 Microsoft Technology Licensing, Llc Agile communication operator
KR101754998B1 (ko) * 2011-01-27 2017-07-06 삼성전자주식회사 멀티 코어 시스템 및 멀티 코어 시스템에서의 데이터 병렬 처리 방법
US20120259843A1 (en) * 2011-04-11 2012-10-11 Timothy Child Database acceleration using gpu and multicore cpu systems and methods
WO2013010318A1 (zh) * 2011-07-19 2013-01-24 天津海润恒通高性能计算系统科技有限公司 一种利用通用处理器进行软件无线电的方法和装置
US8789026B2 (en) * 2011-08-02 2014-07-22 International Business Machines Corporation Technique for compiling and running high-level programs on heterogeneous computers
TWI523144B (zh) * 2011-10-31 2016-02-21 財團法人國家實驗研究院國家晶片系統設計中心 具有履歷電路單元之晶片結構
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
CN103282888B (zh) * 2011-12-27 2017-03-08 华为技术有限公司 数据处理方法、图像处理器gpu及第一节点设备
US9348676B2 (en) * 2012-01-05 2016-05-24 Google Technology Holdings LLC System and method of processing buffers in an OpenCL environment
KR101332839B1 (ko) * 2012-01-05 2013-11-27 서울대학교산학협력단 병렬 컴퓨팅 프레임워크 기반 클러스터 시스템의 호스트 노드 및 메모리 관리 방법
US9424089B2 (en) * 2012-01-24 2016-08-23 Samsung Electronics Co., Ltd. Hardware acceleration of web applications
US9996394B2 (en) * 2012-03-01 2018-06-12 Microsoft Technology Licensing, Llc Scheduling accelerator tasks on accelerators using graphs
KR20130115574A (ko) * 2012-04-12 2013-10-22 삼성전자주식회사 단말기에서 태스크 스케줄링을 수행하는 방법 및 장치
US10599404B1 (en) * 2012-06-01 2020-03-24 Altera Corporation M/A for compiling parallel program having barrier synchronization for programmable hardware
US9830172B2 (en) * 2012-06-30 2017-11-28 Microsoft Technology Licensing, Llc Implementing functional kernels using compiled code modules
US20150212862A1 (en) * 2012-07-30 2015-07-30 Gregory Stuart Snider Compilation system for executable objects
KR101893796B1 (ko) 2012-08-16 2018-10-04 삼성전자주식회사 동적 데이터 구성을 위한 방법 및 장치
GB2506595A (en) * 2012-10-02 2014-04-09 Ibm Provisioning systems in parallel based on success rate
TWI482118B (zh) * 2012-10-18 2015-04-21 Wistron Corp 處理圖形運算負載平衡之方法及系統
KR20140054948A (ko) * 2012-10-30 2014-05-09 한국전자통신연구원 임베디드 시스템을 위한 오픈씨엘 응용 소프트웨어 개발 지원 도구 구성 및 방법
US20140259023A1 (en) * 2013-03-07 2014-09-11 Seagate Technology Llc Adaptive vibration mitigation
US9424079B2 (en) 2013-06-27 2016-08-23 Microsoft Technology Licensing, Llc Iteration support in a heterogeneous dataflow engine
KR102213668B1 (ko) 2013-09-06 2021-02-08 삼성전자주식회사 제너럴 퍼포즈 프로그래머블 컴퓨팅 디바이스에서의 멀티미디어 데이터 프로세싱 방법 및 그에 따른 데이터 프로세싱 시스템
US9473545B2 (en) * 2013-09-13 2016-10-18 Lenovo Enterprise Solutions (Singapore) Pte. Ltd. Administering group identifiers of processes in a parallel computer
US10200508B2 (en) * 2013-09-17 2019-02-05 Nvidia Corporation System and method for sharing special-purpose processing resources
CN103713902B (zh) * 2013-12-26 2017-10-24 Tcl集团股份有限公司 一种基于Android系统的BOA编译方法和系统
CN105900065A (zh) * 2014-01-13 2016-08-24 华为技术有限公司 模式处理方法
US9632761B2 (en) * 2014-01-13 2017-04-25 Red Hat, Inc. Distribute workload of an application to a graphics processing unit
US9547553B1 (en) 2014-03-10 2017-01-17 Parallel Machines Ltd. Data resiliency in a shared memory pool
US9436972B2 (en) 2014-03-27 2016-09-06 Intel Corporation System coherency in a distributed graphics processor hierarchy
US9781027B1 (en) 2014-04-06 2017-10-03 Parallel Machines Ltd. Systems and methods to communicate with external destinations via a memory network
US9529622B1 (en) 2014-12-09 2016-12-27 Parallel Machines Ltd. Systems and methods for automatic generation of task-splitting code
US9690713B1 (en) 2014-04-22 2017-06-27 Parallel Machines Ltd. Systems and methods for effectively interacting with a flash memory
US9594688B1 (en) 2014-12-09 2017-03-14 Parallel Machines Ltd. Systems and methods for executing actions using cached data
US10430169B2 (en) 2014-05-30 2019-10-01 Apple Inc. Language, function library, and compiler for graphical and non-graphical computation on a graphical processor unit
US9740464B2 (en) 2014-05-30 2017-08-22 Apple Inc. Unified intermediate representation
US20150348224A1 (en) * 2014-05-30 2015-12-03 Apple Inc. Graphics Pipeline State Object And Model
US10346941B2 (en) 2014-05-30 2019-07-09 Apple Inc. System and method for unified application programming interface and model
GB2524346B (en) * 2014-09-19 2016-12-21 Imagination Tech Ltd Separating Cores
CN104391747A (zh) * 2014-11-18 2015-03-04 北京锐安科技有限公司 一种并行计算方法及装置
US9639473B1 (en) 2014-12-09 2017-05-02 Parallel Machines Ltd. Utilizing a cache mechanism by copying a data set from a cache-disabled memory location to a cache-enabled memory location
US9632936B1 (en) 2014-12-09 2017-04-25 Parallel Machines Ltd. Two-tier distributed memory
US9781225B1 (en) 2014-12-09 2017-10-03 Parallel Machines Ltd. Systems and methods for cache streams
US9753873B1 (en) 2014-12-09 2017-09-05 Parallel Machines Ltd. Systems and methods for key-value transactions
CN105808342B (zh) * 2014-12-30 2019-12-13 中国电信股份有限公司 用于分配客户请求的方法、判断装置和系统
US10185547B2 (en) * 2015-06-26 2019-01-22 Intel Corporation Techniques for distributed operation of secure controllers
US10249073B2 (en) * 2015-07-21 2019-04-02 Intel Corporation Distributed frame buffer and API for scalable parallel rendering
KR102402584B1 (ko) * 2015-08-26 2022-05-27 삼성전자주식회사 사용자 어플리케이션의 특성에 따른 연산 디바이스 동적 제어 기법
CN105159679A (zh) * 2015-09-15 2015-12-16 北京国科世纪激光技术有限公司 视窗类软件的消息响应和处理方法及系统
US9898261B1 (en) 2015-09-30 2018-02-20 Open Text Corporation Method and system for configuring processes of software applications using activity fragments
US9626627B1 (en) * 2016-01-26 2017-04-18 International Business Machines Corporation Predicting API storytelling mapping
US10484479B2 (en) * 2016-01-31 2019-11-19 QC Ware Corp. Integration of quantum processing devices with distributed computers
US10614370B2 (en) 2016-01-31 2020-04-07 QC Ware Corp. Quantum computing as a service
KR101858565B1 (ko) 2016-02-19 2018-05-16 서영준 대용량 데이터 처리를 위한 분산 플랫폼 독립적 병렬 처리 방법 및 시스템
CN105786523B (zh) * 2016-03-21 2019-01-11 北京信安世纪科技股份有限公司 数据同步系统及方法
CN106560794A (zh) * 2016-08-08 2017-04-12 柏建民 基于远程智能存储单元的分布式多处理器单元系统
US10565017B2 (en) * 2016-09-23 2020-02-18 Samsung Electronics Co., Ltd. Multi-thread processor and controlling method thereof
KR102592330B1 (ko) * 2016-12-27 2023-10-20 삼성전자주식회사 OpenCL 커널을 처리하는 방법과 이를 수행하는 컴퓨팅 장치
US10541927B2 (en) * 2016-12-29 2020-01-21 Google Llc System and method for hardware-independent RDMA
CN107066378B (zh) * 2017-01-24 2020-12-04 成都皓图智能科技有限责任公司 一种实时在线gpu通用计算模拟及调试方法
US10929294B2 (en) 2017-03-01 2021-02-23 QC Ware Corp. Using caching techniques to improve graph embedding performance
US11353868B2 (en) * 2017-04-24 2022-06-07 Intel Corporation Barriers and synchronization for machine learning at autonomous machines
CN108958796B (zh) * 2017-05-23 2023-08-04 创新先进技术有限公司 业务请求处理方法及装置、业务请求处理系统
US10664943B2 (en) * 2017-06-02 2020-05-26 Apple Inc. Compound shader object and use thereof
US11385930B2 (en) * 2017-06-21 2022-07-12 Citrix Systems, Inc. Automatic workflow-based device switching
US10796240B2 (en) 2017-07-22 2020-10-06 QC Ware Corp. Performing fault tree analysis on quantum computers
CN107678752B (zh) * 2017-08-31 2021-09-21 北京百度网讯科技有限公司 一种面向异构集群的任务处理方法及装置
US11567807B2 (en) * 2018-03-30 2023-01-31 EMC IP Holding Company LLC Allocation of shared computing resources using source code feature extraction and machine learning
US11487573B2 (en) * 2018-05-08 2022-11-01 Thomson Reuters Enterprise Centre Gmbh Systems and method for automating security workflows in a distributed system using encrypted task requests
CN110659278A (zh) * 2018-06-12 2020-01-07 上海郑明现代物流有限公司 基于cpu-gpu异构架构的图数据分布式处理系统
US11436056B2 (en) 2018-07-19 2022-09-06 EMC IP Holding Company LLC Allocation of shared computing resources using source code feature extraction and clustering-based training of machine learning models
JP7141905B2 (ja) * 2018-10-12 2022-09-26 株式会社日立産機システム コントロール装置及びコントロール方法
CN111327921A (zh) * 2018-12-17 2020-06-23 深圳市炜博科技有限公司 视频数据处理方法及设备
CN110032407B (zh) * 2019-03-08 2020-12-22 创新先进技术有限公司 提升cpu并行性能的方法及装置和电子设备
US10884664B2 (en) * 2019-03-14 2021-01-05 Western Digital Technologies, Inc. Executable memory cell
CN110413317B (zh) * 2019-08-02 2023-06-06 四川新网银行股份有限公司 基于配置化的流程接口调用方法
US11567555B2 (en) * 2019-08-30 2023-01-31 Intel Corporation Software assisted power management
WO2021068115A1 (en) 2019-10-08 2021-04-15 Citrix Systems, Inc. Application and device recommendation engine
US20210149719A1 (en) * 2019-11-15 2021-05-20 Nvidia Corporation Techniques for modifying executable graphs to perform different workloads
CN111292223B (zh) 2020-01-22 2023-07-25 北京百度网讯科技有限公司 图计算的处理方法、装置、电子设备及存储介质
CN111447561B (zh) * 2020-03-16 2023-04-18 阿波罗智联(北京)科技有限公司 车辆的图像处理系统
CN112579215B (zh) * 2020-12-23 2023-12-15 潍柴动力股份有限公司 一种调度函数的生成方法及装置
US11941722B2 (en) * 2021-10-13 2024-03-26 Mellanox Technologies, Ltd. Kernel optimization and delayed execution

Family Cites Families (98)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE4129614C2 (de) 1990-09-07 2002-03-21 Hitachi Ltd System und Verfahren zur Datenverarbeitung
US5301324A (en) 1992-11-19 1994-04-05 International Business Machines Corp. Method and apparatus for dynamic work reassignment among asymmetric, coupled processors
US6179489B1 (en) 1997-04-04 2001-01-30 Texas Instruments Incorporated Devices, methods, systems and software products for coordination of computer main microprocessor and second microprocessor coupled thereto
US5946487A (en) 1996-06-10 1999-08-31 Lsi Logic Corporation Object-oriented multi-media architecture
US6513057B1 (en) * 1996-10-28 2003-01-28 Unisys Corporation Heterogeneous symmetric multi-processing system
US6115550A (en) 1997-06-11 2000-09-05 Digital Equipment Corporation Loader conditionally replacing a code sequence with a functionally-alike code sequence in an executable program intended for execution in different run-time environments
WO1999040551A1 (en) * 1998-01-26 1999-08-12 Unif/X Inc. A transaction execution system interface and enterprise system architecture thereof
US6425017B1 (en) * 1998-08-17 2002-07-23 Microsoft Corporation Queued method invocations on distributed component applications
JP3633404B2 (ja) * 1999-11-04 2005-03-30 日本電気株式会社 メモリ割り付け最適化システム、方法、及び記録媒体
JP2001147819A (ja) * 1999-11-19 2001-05-29 Fujitsu Ltd 最適化装置および記録媒体
US6986128B2 (en) 2000-01-07 2006-01-10 Sony Computer Entertainment Inc. Multiple stage program recompiler and method
US7159041B2 (en) 2000-03-07 2007-01-02 Microsoft Corporation Method and system for defining and controlling algorithmic elements in a graphics display system
US6588008B1 (en) 2000-04-11 2003-07-01 International Business Machines Corporation Assembler tool for processor-coprocessor computer systems
US6970206B1 (en) 2000-04-20 2005-11-29 Ati International Srl Method for deinterlacing interlaced video by a graphics processor
US20030154284A1 (en) * 2000-05-31 2003-08-14 James Bernardin Distributed data propagator
US6768901B1 (en) 2000-06-02 2004-07-27 General Dynamics Decision Systems, Inc. Dynamic hardware resource manager for software-defined communications system
US7137124B2 (en) * 2001-10-05 2006-11-14 International Business Machines Corporation Storage area network methods and apparatus for storage device masking
US7234144B2 (en) 2002-01-04 2007-06-19 Microsoft Corporation Methods and system for managing computational resources of a coprocessor in a computing system
US6919896B2 (en) 2002-03-11 2005-07-19 Sony Computer Entertainment Inc. System and method of optimizing graphics processing
US20040068716A1 (en) 2002-10-04 2004-04-08 Quicksilver Technology, Inc. Retargetable compiler for multiple and different hardware platforms
CN100557550C (zh) * 2002-10-16 2009-11-04 鲍志超 计算机通用关联应用处理器
US7406699B2 (en) * 2003-04-02 2008-07-29 Microsoft Corporation Enhanced runtime hosting
US7181382B2 (en) * 2003-05-08 2007-02-20 Microsoft Corporation System and method for testing, simulating, and controlling computer software and hardware
US7015913B1 (en) 2003-06-27 2006-03-21 Nvidia Corporation Method and apparatus for multithreaded processing of data in a programmable graphics processor
US6862027B2 (en) 2003-06-30 2005-03-01 Microsoft Corp. System and method for parallel execution of data generation tasks
US7546553B2 (en) 2003-07-28 2009-06-09 Sap Ag Grid landscape component
US7272730B1 (en) 2003-07-31 2007-09-18 Hewlett-Packard Development Company, L.P. Application-driven method and apparatus for limiting power consumption in a processor-controlled hardware platform
US7389508B2 (en) 2003-09-25 2008-06-17 International Business Machines Corporation System and method for grouping processors and assigning shared memory space to a group in heterogeneous computer environment
US7068284B2 (en) 2003-11-10 2006-06-27 Microsoft Corporation Color management system that supports legacy and advanced color management applications
US8274517B2 (en) 2003-11-14 2012-09-25 Microsoft Corporation Systems and methods for downloading algorithmic elements to a coprocessor and corresponding techniques
US20050132239A1 (en) 2003-12-16 2005-06-16 Athas William C. Almost-symmetric multiprocessor that supports high-performance and energy-efficient execution
FR2865047B1 (fr) * 2004-01-14 2006-04-07 Commissariat Energie Atomique Systeme de generation automatique de codes optimises
US7472391B2 (en) 2004-02-20 2008-12-30 Microsoft Corporation Resource loader for applications that utilize relative uniform resource identifiers
US7847800B2 (en) 2004-04-16 2010-12-07 Apple Inc. System for emulating graphics operations
US7725643B1 (en) 2004-05-04 2010-05-25 Oracle America, Inc. Methods and systems for detecting and avoiding an address dependency between tasks
US20060048157A1 (en) 2004-05-18 2006-03-02 International Business Machines Corporation Dynamic grid job distribution from any resource within a grid environment
US7426724B2 (en) * 2004-07-02 2008-09-16 Nvidia Corporation Optimized chaining of vertex and fragment programs
CN101091175B (zh) 2004-09-16 2012-03-14 辉达公司 负载均衡
US20060069909A1 (en) 2004-09-23 2006-03-30 Roth Steven T Kernel registry write operations
US7603546B2 (en) 2004-09-28 2009-10-13 Intel Corporation System, method and apparatus for dependency chain processing
US7800620B2 (en) 2004-11-05 2010-09-21 Microsoft Corporation Optimizing automated shader program construction
US7598953B2 (en) 2004-11-05 2009-10-06 Microsoft Corporation Interpreter for simplified programming of graphics processor units in general purpose programming languages
US7733347B2 (en) 2004-11-05 2010-06-08 Microsoft Corporation Automated construction of shader programs
US20070208956A1 (en) * 2004-11-19 2007-09-06 Motorola, Inc. Energy efficient inter-processor management method and system
US20060132489A1 (en) 2004-12-21 2006-06-22 Hewlett-Packard Development Company, L.P. Remote computing
JP4367337B2 (ja) * 2004-12-28 2009-11-18 セイコーエプソン株式会社 マルチメディア処理システム及びマルチメディア処理方法
US7665143B2 (en) * 2005-05-16 2010-02-16 Microsoft Corporation Creating secure process objects
JP2006350686A (ja) * 2005-06-16 2006-12-28 Seiko Epson Corp 命令セット・シミュレータ生成装置及びシミュレータ生成方法
US7725496B2 (en) 2005-06-17 2010-05-25 Computer Associates Think, Inc. System and method for identifying application resources
US7353369B1 (en) 2005-07-13 2008-04-01 Nvidia Corporation System and method for managing divergent threads in a SIMD architecture
US20070033592A1 (en) 2005-08-04 2007-02-08 International Business Machines Corporation Method, apparatus, and computer program product for adaptive process dispatch in a computer system having a plurality of processors
US7856618B2 (en) 2005-08-04 2010-12-21 International Business Machines Corporation Adaptively generating code for a computer program
US7463268B2 (en) 2005-09-15 2008-12-09 Microsoft Corporation Providing 3D graphics across partitions of computing device
TWI348652B (en) 2005-10-17 2011-09-11 Via Tech Inc Driver assisted asynchronous command processing
KR100713505B1 (ko) 2005-10-24 2007-04-30 삼성전자주식회사 디지털 방송 수신 단말기의 선호 채널 공유 방법
US7330962B2 (en) 2005-11-14 2008-02-12 Nvidia Corporation Dynamic instruction sequence selection during scheduling
US7861060B1 (en) 2005-12-15 2010-12-28 Nvidia Corporation Parallel data processing systems and methods using cooperative thread arrays and thread identifier values to determine processing behavior
US7788468B1 (en) 2005-12-15 2010-08-31 Nvidia Corporation Synchronization of threads in a cooperative thread array
US7958509B2 (en) 2005-12-21 2011-06-07 International Business Machines Corporation Method and system for scheduling of jobs
US9038040B2 (en) * 2006-01-25 2015-05-19 International Business Machines Corporation Method for partitioning programs between a general purpose core and one or more accelerators
US7441224B2 (en) * 2006-03-09 2008-10-21 Motorola, Inc. Streaming kernel selection for reconfigurable processor
JP4784827B2 (ja) * 2006-06-06 2011-10-05 学校法人早稲田大学 ヘテロジニアスマルチプロセッサ向けグローバルコンパイラ
US8549499B1 (en) * 2006-06-16 2013-10-01 University Of Rochester Parallel programming using possible parallel regions and its language profiling compiler, run-time system and debugging support
US20070294693A1 (en) 2006-06-16 2007-12-20 Microsoft Corporation Scheduling thread execution among a plurality of processors based on evaluation of memory access data
US8375368B2 (en) 2006-06-20 2013-02-12 Google Inc. Systems and methods for profiling an application running on a parallel-processing computer system
US8756264B2 (en) 2006-06-20 2014-06-17 Google Inc. Parallel pseudorandom number generation
US8136104B2 (en) 2006-06-20 2012-03-13 Google Inc. Systems and methods for determining compute kernels for an application in a parallel-processing computer system
US8443348B2 (en) 2006-06-20 2013-05-14 Google Inc. Application program interface of a parallel-processing computer system that supports multiple programming languages
WO2007149884A2 (en) 2006-06-20 2007-12-27 Google, Inc. A multi-thread high performance computing system
US8136102B2 (en) 2006-06-20 2012-03-13 Google Inc. Systems and methods for compiling an application for a parallel-processing computer system
US8146066B2 (en) 2006-06-20 2012-03-27 Google Inc. Systems and methods for caching compute kernels for an application running on a parallel-processing computer system
US7814486B2 (en) 2006-06-20 2010-10-12 Google Inc. Multi-thread runtime system
US8108844B2 (en) 2006-06-20 2012-01-31 Google Inc. Systems and methods for dynamically choosing a processing element for a compute kernel
CN100377042C (zh) 2006-07-04 2008-03-26 浙江大学 结合静态编译器和动态调频技术优化运行频率的节能方法
US8116207B2 (en) * 2006-08-21 2012-02-14 Citrix Systems, Inc. Systems and methods for weighted monitoring of network services
US7750913B1 (en) 2006-10-24 2010-07-06 Adobe Systems Incorporated System and method for implementing graphics processing unit shader programs using snippets
US20080109795A1 (en) 2006-11-02 2008-05-08 Nvidia Corporation C/c++ language extensions for general-purpose graphics processing unit
JP4785710B2 (ja) * 2006-11-14 2011-10-05 富士通株式会社 資源に対する重要度算出方法及び装置
US8370818B2 (en) * 2006-12-02 2013-02-05 Time Warner Cable Inc. Methods and apparatus for analyzing software interface usage
US7969444B1 (en) 2006-12-12 2011-06-28 Nvidia Corporation Distributed rendering of texture data
US8719807B2 (en) * 2006-12-28 2014-05-06 Intel Corporation Handling precompiled binaries in a hardware accelerated software transactional memory system
US8321849B2 (en) * 2007-01-26 2012-11-27 Nvidia Corporation Virtual architecture and instruction set for parallel thread computing
US7925900B2 (en) 2007-01-26 2011-04-12 Microsoft Corporation I/O co-processor coupled hybrid computing device
US7975001B1 (en) 2007-02-14 2011-07-05 The Mathworks, Inc. Bi-directional communication in a parallel processing environment
US8010954B2 (en) * 2007-02-14 2011-08-30 The Mathworks, Inc. Parallel programming interface to dynamically allocate program portions
US8549500B2 (en) 2007-02-14 2013-10-01 The Mathworks, Inc. Saving and loading graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment
US7685409B2 (en) 2007-02-21 2010-03-23 Qualcomm Incorporated On-demand multi-thread multimedia processor
JP2008226181A (ja) * 2007-03-15 2008-09-25 Fujitsu Ltd 並列実行プログラム、該プログラムを記録した記録媒体、並列実行装置および並列実行方法
US8286196B2 (en) 2007-05-03 2012-10-09 Apple Inc. Parallel runtime execution on multiple processors
US8341611B2 (en) 2007-04-11 2012-12-25 Apple Inc. Application interface on multiple processors
US8108633B2 (en) 2007-04-11 2012-01-31 Apple Inc. Shared stream memory on multiple processors
EP2135163B1 (en) 2007-04-11 2018-08-08 Apple Inc. Data parallel computing on multiple processors
US8276164B2 (en) 2007-05-03 2012-09-25 Apple Inc. Data parallel computing on multiple processors
US7941791B2 (en) * 2007-04-13 2011-05-10 Perry Wang Programming environment for heterogeneous processor resource integration
US8996846B2 (en) 2007-09-27 2015-03-31 Nvidia Corporation System, method and computer program product for performing a scan operation
US20090158299A1 (en) * 2007-10-31 2009-06-18 Carter Ernst B System for and method of uniform synchronization between multiple kernels running on single computer systems with multiple CPUs installed
US8074087B2 (en) * 2008-06-24 2011-12-06 Microsoft Corporation Configuring processors and loads for power management
US8286172B2 (en) * 2008-10-02 2012-10-09 Nec Laboratories America, Inc. Systems and methods for implementing best-effort parallel computing frameworks

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
PAPAKIPOS, M. The peakstream platform: high-productivity software development for multi-core processors, PeakStream Inc. USA, April 2007. *
R. Dolbeau, et al. HMPP: A hybrid multicore parallel programming environment, in Workshop on General Purpose Processing on Graphics Processing Units, 2007. *

Also Published As

Publication number Publication date
JP2011523141A (ja) 2011-08-04
CN105159761B (zh) 2019-01-15
KR20110019775A (ko) 2011-02-28
EP2304563B1 (en) 2020-05-06
US10067797B2 (en) 2018-09-04
JP5232914B2 (ja) 2013-07-10
US20090307699A1 (en) 2009-12-10
US9477525B2 (en) 2016-10-25
US9250697B2 (en) 2016-02-02
EP2304563A1 (en) 2011-04-06
US20140237457A1 (en) 2014-08-21
WO2009148714A1 (en) 2009-12-10
US8286198B2 (en) 2012-10-09
US20170075730A1 (en) 2017-03-16
CN102099788B (zh) 2015-05-13
US20130081066A1 (en) 2013-03-28
CN102099788A (zh) 2011-06-15
US8806513B2 (en) 2014-08-12
US20160188371A1 (en) 2016-06-30
CN105159761A (zh) 2015-12-16

Similar Documents

Publication Publication Date Title
KR101239025B1 (ko) 다수의 프로세서들에서 데이터 병렬 컴퓨팅을 하기 위한 응용 프로그래밍 인터페이스들
KR101248318B1 (ko) 다수의 프로세서에 대한 다차원 스레드 그룹화
US10552226B2 (en) Data parallel computing on multiple processors
US8957906B2 (en) Subbuffer objects
AU2008239696B2 (en) Data parallel computing on multiple processors
US8108633B2 (en) Shared stream memory on multiple processors
EP2140352A2 (en) Parallel runtime execution on multiple processors
AU2018226440B2 (en) Data parallel computing on multiple processors
AU2014202203B2 (en) Subbuffer objects

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20160127

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20170201

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20180201

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20190129

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20200129

Year of fee payment: 8