KR20080070599A - 병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트 - Google Patents

병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트 Download PDF

Info

Publication number
KR20080070599A
KR20080070599A KR1020080008740A KR20080008740A KR20080070599A KR 20080070599 A KR20080070599 A KR 20080070599A KR 1020080008740 A KR1020080008740 A KR 1020080008740A KR 20080008740 A KR20080008740 A KR 20080008740A KR 20080070599 A KR20080070599 A KR 20080070599A
Authority
KR
South Korea
Prior art keywords
virtual
thread
threads
cta
program
Prior art date
Application number
KR1020080008740A
Other languages
English (en)
Other versions
KR101026689B1 (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 KR20080070599A publication Critical patent/KR20080070599A/ko
Application granted granted Critical
Publication of KR101026689B1 publication Critical patent/KR101026689B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • 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
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors

Abstract

가상 아키텍처 및 명령어 세트가 명시적인 병렬 스레드 컴퓨팅을 지원한다. 가상 아키텍처는, 상이한 가상 스레드들 간의 복수 레벨의 데이터 공유 및 조정을 갖는 복수의 가상 스레드들의 동시 실행을 지원하는 가상 프로세서 및 가상 프로세서를 제어하는 가상 실행 드라이버를 지원한다. 가상 스레드의 거동을 정의하기 위해 가상 프로세서를 위한 가상 명령어 세트 아키텍처가 이용되며, 병렬 스레드 거동, 예를 들어, 데이터 공유 및 동기화에 관련된 명령어들을 포함한다. 가상 플랫폼을 이용하여, 프로그래머들은 데이터를 처리하기 위해 가상 스레드들이 동시에 실행하는 애플리케이션 프로그램들을 개발할 수 있고, 가상 변환기들 및 드라이버들은 프로그램에 투명하게, 실행할 특정 하드웨어에 애플리케이션 코드를 적응시킨다.
프로그램 코드, 프로세서, 명령어, 스레드, 함수 호출, 명령어 변환기

Description

병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트{VIRTUAL ARCHITECTURE AND INSTRUCTION SET FOR PARALLEL THREAD COMPUTING}
본 발명은 일반적으로 병렬 처리에 관한 것이고, 구체적으로는 병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트에 관한 것이다.
병렬 처리에서, 다수의 처리 유닛들(예를 들면, 다수의 프로세서 칩들 또는 단일 칩 내의 다수의 프로세싱 코어들)은 데이터를 처리하기 위해 동시에 작동한다. 그러한 시스템들은 다수의 부분들로 분해하기 적합한 문제들을 해결하기 위해 이용될 수 있다. 일 예는 이미지 필터링인데, 이미지 필터링에서는 출력 이미지(혹은 이미지들)의 각 픽셀이 입력 이미지(혹은 이미지들)의 소정 수의 픽셀들로부터 계산된다. 각 출력 픽셀의 계산은 일반적으로 다른 모든 것들과는 독립적이어서, 상이한 처리 유닛들이 상이한 출력 픽셀들을 병렬로 계산할 수 있다. 많은 다른 형태의 문제들도 병렬 분해로 다룰 수 있다. 일반적으로, N-웨이(N-way) 병렬 실행은 그러한 문제들에 대한 해결책을 대략 N배 빠르게 구할 수 있다.
다른 부류의 문제들은 실행 병렬 스레드들이 서로 협력될 수 있다면 병렬 처리로 다룰 수 있다. 일 예는 FFT(Fast Fourier Transform)인데, 재귀적 알고리즘 에 있어서, 출력 스테이지에 도달할 때까지, 각 스테이지에서, 다음 스테이지에 대한 입력들로서 이용되는 새로운 값들을 생성하기 위해 이전 스테이지의 출력들에 대해 계산이 수행된다. 실행 단일 스레드는, 스레드가 이전의 스테이지들로부터 출력 데이터를 신뢰성 있게 얻을 수 있는 한, 다수의 스테이지를 수행할 수 있다. 태스크가 다수의 스레드로 분할될 것이라면, 예를 들면 스레드가 아직 기입되지 않은 입력 데이터를 읽을 시도를 하지 않도록 하기 위해, 소정의 조정 메커니즘이 제공되어야 한다. (이 문제에 대한 하나의 해결책은 본원과 공동으로 양도되고, 함께 계류중인 2005년 12월 15일자 출원된 U.S. 특허 출원 제11/303,780호에 설명되어 있다.)
그러나, 병렬 처리 시스템들을 프로그래밍하는 것은 어려울 수 있다. 프로그래머는 처리 유닛들이 실제로 실행할 수 있는 코드를 생성하기 위해, 일반적으로, 가용의 처리 유닛들의 수와 그들의 기능들(명령어 세트들, 데이터 레지스터들의 수, 상호 연결성, 등)을 알 필요가 있다. 머신-특정 컴파일러들이 이 영역에서 상당한 도움을 제공할 수 있지만, 코드가 상이한 프로세서에 포트(port)될 때마다 코드를 재컴파일하는 것이 여전히 필요하다.
또한, 병렬 처리 아키텍처들의 다양한 양태들이 빠르게 진화하고 있다. 예를 들어, 새로운 플랫폼 아키텍처들, 명령어 세트들, 및 프로그래밍 모델들이 계속적으로 개발되고 있다. 병렬 아키텍처의 다양한 양태들(예를 들면, 프로그래밍 모델 또는 명령어 세트)이 한 세대에서 다음 세대로 변화하기 때문에, 애플리케이션 프로그램들, 소프트웨어 라이브러리들, 컴파일러들 및 다른 소프트웨어 및 툴들도 이에 따라 변화되어야 한다. 이러한 불안정성은 병렬 처리 코드의 개발 및 유지보수에 상당한 오버헤드를 부가할 수 있다.
스레드들 사이의 조정이 필요할 때, 병렬 프로그래밍은 더 어려워진다. 프로그래머는 스레드간 통신을 지원(혹은 에뮬레이트)하기 위해 특정 프로세서 또는 컴퓨터 시스템 내의 가용의 메커니즘들이 무엇인지를 결정해야 하고, 가용의 메커니즘들을 이용하는 코드를 작성해야 한다. 상이한 컴퓨터 시스템들 상의 가용 및/또는 최적의 메커니즘들이 일반적으로 서로 다르기 때문에, 이러한 종류의 병렬 코드는 일반적으로 포트가능하지 않고, 그것이 실행될 각 하드웨어 플랫폼을 위해 재기입되어야 한다.
또한, 프로세서들에 실행가능한 코드를 제공하는 것 외에도, 프로그래머는 다양한 처리 유닛들의 동작들을 조정하는, 예를 들면 각 처리 유닛에 어떤 프로그램을 실행할지와 어떤 입력 데이터를 처리할지를 지시하는 "마스터" 프로세서에 제어 코드를 제공해야 한다. 그러한 제어 코드는 일반적으로 특정 마스터 프로세서 및 프로세서간 통신 프로토콜에 대해 특정적이고, 상이한 마스터 프로세서가 대체될 것이라면 일반적으로 재기입되어야 한다.
병렬 처리 코드의 컴파일 및 재컴파일에 있어서의 어려움은, 사용자들이 그들의 시스템들을 컴퓨팅 기술이 진화하는 것에 따라 갱신하는 것을 단념하게 한다. 따라서, 특정 하드웨어 플랫폼으로부터 컴파일된 병렬 처리 코드를 분리하고, 병렬 애플리케이션들 및 툴들을 위한 안정적인 병렬 처리 아키텍처 및 명령어 세트를 타겟에 제공하는 것이 바람직할 것이다.
본 발명의 실시예들은 병렬 스레드 컴퓨팅을 위한 가상 아키텍처 및 가상 명령어 세트를 제공한다. 가상 병렬 아키텍처는 상이한 가상 스레드들 사이의 다중 레벨의 데이터 공유 및 조정(예를 들면, 동기화)으로 다수의 가상 스레드들의 동시적인 실행을 지원하는 가상 프로세서와, 가상 프로세서를 제어하는 가상 실행 드라이버를 정의한다. 가상 프로세서를 위한 가상 명령어 세트 아키텍처는 가상 스레드의 거동을 정의하기 위해 이용되고, 예를 들면 데이터 공유 및 동기화와 같은 병렬 스레드 거동에 관련된 명령어들을 포함한다. 가상 병렬 플랫폼을 이용하여, 프로그래머들은 데이터를 처리하기 위해 가상 스레드들이 동시적으로 실행하는 애플리케이션 프로그램들을 개발할 수 있다. 애플리케이션 프로그램들은 고도로 포트가능한(portable) 중간 형태로, 예를 들면 가상 병렬 플랫폼을 타겟으로 하는 프로그램 코드로서 저장될 수 있고 분배될 수 있다. 설치시 혹은 실행시에, 하드웨어-특정 가상 명령어 변환기들 및 실행 드라이버들은 중간 형태의 애플리케이션 코드를 그것이 실행될 특정 하드웨어에 적응시킨다. 그 결과, 개발 프로세스가 특정 프로세싱 하드웨어에 독립적으로 되므로, 애플리케이션 프로그램들은 더욱 포트가능하고, 개발하기 쉬워진다.
본 발명의 일 양태에 따르면, 병렬 처리 연산을 정의하는 방법은 협력 가상 스레드들의 어레이 내의 다수의 가상 스레드들 각각에 대해 수행될 연산들의 시퀀 스를 정의하는 제1 프로그램 코드를 제공하는 단계를 포함한다. 제1 프로그램 코드는, 그 어레이의 대표 가상 스레드에 대해 실행될 스레드-당(per-thread) 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램으로 컴파일되고, 상기 스레드-당 명령어들의 시퀀스는, 어레이의 대표 가상 스레드와 하나 이상의 다른 가상 스레드 사이의 협력 거동(cooperative behavior)을 정의하는 적어도 하나의 명령어를 포함한다. 가상 스레드 프로그램은 (예를 들면, 메모리 내에 혹은 디스크 상에) 저장되고, 후속하여 타겟 플랫폼 아키텍처에 맞는 명령어들의 시퀀스로 변환될 수 있다.
또한, 제2 프로그램 코드가 입력 데이터 세트를 처리하여 출력 데이터 세트를 생성하도록 구성된 협력 가상 스레드들의 어레이를 정의하기 위해 제공될 수 있는데, 상기 어레이 내의 각 가상 스레드는 가상 스레드 프로그램을 동시에 실행한다. 제2 프로그램 코드는, 가상 함수들의 라이브러리 내의 함수 호출들의 시퀀스로 유리하게 변환되는데, 라이브러리는 협력 가상 스레드들의 어레이의 실행을 초기화 및 유발시키는 가상 함수들을 포함한다. 이 함수 호출들의 시퀀스도 저장될 수 있다. 저장된 가상 스레드 프로그램 및 함수 호출들의 시퀀스는, 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환될 수 있는데, 실행가능한 프로그램 코드는 협력 가상 스레드들의 어레이를 실행하는 하나 이상의 플랫폼 스레드들을 정의한다. 실행가능한 프로그램 코드는 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 실행될 수 있고, 이에 의해, 출력 데이터 세트를 생성하고, 출력 데이터 세트는 저장 매체(예를 들면, 컴퓨터 메모리, 디스크 등)에 저장될 수 있 다.
언급되었던 바와 같이, 가상 스레드 프로그램 코드 내의 스레드-당 명령어들의 시퀀스는, 어레이의 대표 가상 스레드와 하나 이상의 다른 가상 스레드 사이의 협력 거동을 정의하는 적어도 하나의 명령어를 포함하는 것이 유리하다. 예를 들어, 스레드-당 명령어들의 시퀀스는, 시퀀스 내의 특정 포인트에서 대표 가상 스레드에 대한 연산들의 실행을, 하나 이상의 상기 다른 가상 스레드들이 그 특정 포인트에 도달할 때까지, 일시정지하는 명령어, 대표 가상 스레드가 데이터를 하나 이상의 다른 가상 스레드들이 액세스하는 공유 메모리에 저장하도록 하는 명령어, 대표 가상 스레드가 하나 이상의 다른 가상 스레드들이 액세스하는 공유 메모리에 저장된 데이터를 원자적으로(atomically) 판독 및 갱신하게 하는 명령어 등을 포함할 수 있다.
가상 스레드 프로그램은 또한 다수의 가상 상태 공간들 중 하나 내의 변수를 정의하는 변수 정의문(variable definition statement)을 포함할 수 있고, 상이한 가상 상태 공간들은 가상 스레드들 사이의 상이한 데이터 공유 모드들에 대응한다. 일 실시예에서, 적어도 스레드-당 공유되지 않는 모드(per-thread unshared mode) 및 전체적으로 공유되는 모드(globally shared mode)가 지원된다. 다른 실시예에서, 가상 스레드들의 일 어레이 내의 공유 모드 및/또는 가상 스레드들의 복수의 어레이들 사이의 공유 모드와 같은 추가의 모드들도 지원될 수 있다.
본 발명의 다른 양태에 따르면, 타겟 프로세서를 동작시키는 방법은 입력 프로그램 코드를 제공하는 단계를 포함한다. 입력 프로그램 코드는 입력 데이터 세 트를 처리하여 출력 데이터 세트를 생성하도록 구성된 가상 스레드들의 어레이 내의 다수의 가상 스레드들 각각에 대해 수행될 연산들의 시퀀스를 정의하는 제1 부분을 포함하고, 가상 스레드들의 어레이의 차원(dimension)을 정의하는 제2 부분을 또한 포함한다. 입력 프로그램 코드의 제1 부분은, 어레이의 대표 가상 스레드에 대해 실행될 스레드-당 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램으로 컴파일된다. 스레드-당 명령어들의 시퀀스는, 어레이의 대표 가상 스레드와 하나 이상의 다른 가상 스레드들 사이의 협력 거동을 정의하는 적어도 하나의 명령어를 포함한다. 입력 프로그램 코드의 제2 부분은, 가상 함수 라이브러리에 대한 함수 호출들의 시퀀스로 전환되는데, 라이브러리는 협력 가상 스레드들의 어레이의 실행을 초기화 및 유발시키는 가상 함수들을 포함한다. 가상 스레드 프로그램 및 함수 호출들의 시퀀스는, 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환되는데, 실행가능한 프로그램 코드는 협력 가상 스레드들의 어레이를 실행하는 하나 이상의 실제 스레드들을 정의한다. 실행가능한 프로그램 코드는 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 실행되고, 이에 의해 출력 데이터 세트를 생성하고, 출력 데이터 세트는 저장 매체에 저장될 수 있다.
일부 실시예들에서, 가상 스레드들의 어레이들은 2 또는 그 이상의 차원들로 정의될 수 있다. 또한, 입력 프로그램 코드의 제2 부분은 가상 스레드들의 어레이들의 그리드의 1 이상의 차원들을 정의하는 함수 호출을 포함할 수 있으며, 그리드 내의 각 어레이가 실행된다.
임의의 타겟 플랫폼 아키텍처가 이용될 수 있다. 일부 실시예들에서, 타겟 플랫폼 아키텍처는 마스터 프로세서 및 코프로세서를 포함한다. 변환 동안, 가상 스레드 프로그램은, 코프로세서 상에 정의된 다수의 스레드들에 의해 병렬로 실행가능한 프로그램 코드로 변환될 수 있고, 함수 호출들의 시퀀스는, 마스터 프로세서 상에서 실행하는 코프로세서를 위한 드라이버 프로그램에 대한 호출들의 시퀀스로 변환될 수 있다. 다른 실시예들에서, 타겟 플랫폼 아키텍처는 중앙 처리 장치(CPU)를 포함한다. 변환 동안, 가상 스레드 프로그램 및 함수 호출들의 시퀀스의 적어도 일부분은, 가상 스레드의 수보다 적은 CPU 스레드들의 수를 이용하여, 가상 스레드 어레이를 실행하는 타겟 프로그램 코드로 변환된다.
본 발명의 다른 실시예에 따르면, 타겟 프로세서를 동작시키는 방법은, 입력 데이터 세트를 처리하여 출력 데이터 세트를 생성하도록 구성된 가상 스레드 어레이 내의 다수의 가상 스레드의 대표 가상 스레드에 대해 실행될 스레드-당 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램을 획득하는 단계를 포함한다. 스레드-당 명령어들의 시퀀스는, 어레이의 대표 가상 스레드와 하나 이상의 다른 가상 스레드들 사이의 협력 거동을 정의하는 적어도 하나의 명령어를 포함한다. 또한, 가상 스레드 어레이의 차원들을 정의하는 추가 프로그램 코드가 획득된다. 가상 스레드 프로그램 및 추가 프로그램 코드는, 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환되고, 이 실행 가능한 프로그램 코드는 가상 스레드 어레이를 실행하는 하나 이상의 플랫폼 스레드들을 정의한다. 실행가능한 프로그램 코드는 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 실행되고, 이에 의해 출력 데이터 세트를 생성하고 출력 데이터 세트를 메모리에 저장한다.
일부 실시예들에서, 가상 스레드 프로그램은 고레벨의 프로그래밍 언어로 쓰여진 소스 프로그램 코드를 수신하고, 소스 프로그램 코드를 컴파일하여 가상 스레드 프로그램을 생성함으로써 획득될 수 있다. 대안적으로, 가상 스레드 프로그램은 저장 매체로부터 판독될 수 있으며, 혹은 원격 컴퓨터 시스템으로부터 네트워크를 통해 수신될 수 있다. 판독되거나 수신되는 가상 스레드 프로그램은 이전에 고레벨 언어로부터 컴파일되었을 수 있고, 또는 가상 명령어 세트 아키텍처에 따른 코드로서 직접 생성되었을 수 있다는 것을 이해할 것이다.
본 발명의 실시예들은 병렬 스레드 컴퓨팅을 위한 가상 아키텍처 및 명령어 세트를 제공한다. 가상 아키텍처는 상이한 스레드들 사이의 다중 레벨의 데이터 공유 및 조정(예를 들면, 동기화)으로 다수의 가상 스레드들의 동시적인 실행을 지원하는 프로세서의 모델과, 모델 프로세서를 제어하는 가상 실행 드라이버를 제공한다. 프로세싱 스레드의 거동을 정의하기 위해 이용되는 가상 명령어 세트는, 예를 들면 특정 스레드들에 걸친 데이터의 공유를 가능하게 하는 명령어들, 및 상이한 스레드들이 프로그램 내의 특정 프로그래머-지정 포인트들에서 동기화되도록 요구하는 명령어들과 같은 병렬 스레드 거동과 관련된 명령어들을 포함한다. 가상 플랫폼을 이용하여, 프로그래머들은 데이터를 처리하기 위해 동시적인 협력 스레드들이 실행되는 애플리케이션 프로그램들을 개발할 수 있다. 하드웨어-특정 가상 명령어 변환기들 및 실행 드라이버들은 애플리케이션 코드를 그것이 실행될 특정 하드웨어에 적응시킨다. 그 결과, 개발 프로세스가 특정 프로세싱 하드웨어에 독 립적이게 되므로, 애플리케이션 프로그램들은 더욱 포트가능하고, 개발하기 쉬워진다.
첨부 도면들과 함께 아래의 상세한 설명은 본 발명의 특징 및 이점에 대한 더 나은 이해를 제공할 것이다.
1. 시스템 개관
도 1은 본 발명의 실시예에 따른 컴퓨터 시스템(100)의 블록도이다. 컴퓨터 시스템(100)은 메모리 브리지(105)를 포함하는 버스 경로를 통해 통신하는 중앙 처리 장치(CPU)(102)와 시스템 메모리(104)를 포함한다. 예를 들어, 노스브리지(Northbridge) 칩일 수 있는 메모리 브리지(105)는 버스 혹은 다른 통신 경로(106)(예를 들면, HyperTransport 링크)를 통해 I/O(Input/Output) 브리지(107)에 접속된다. 예를 들어 사우스브리지(Southbridge) 칩일 수 있는 I/O 브리지(107)는 하나 이상의 사용자 입력 디바이스들(108)(예를 들면, 키보드, 마우스)로부터 사용자 입력을 수신하여 그 입력을 경로(106) 및 메모리 브리지(105)를 통해 CPU(102)에 전달한다. 병렬 처리 서브시스템(112)은 버스 혹은 다른 통신 경로(113)(예를 들어, PCI Express 혹은 Accelerated Graphic Port link)를 통해 메모리 브리지(105)에 연결되며, 일 실시예에서 병렬 처리 서브시스템(112)은 픽셀들을 디스플레이 장치(110)(예를 들면, 통상의 CRT 혹은 LCD 기반 모니터)에 전달하는 그래픽 서브시스템이다. 시스템 디스크(114)는 또한 I/O 브리지(107)에 접속된다. 스위치(116)는 I/O 브리지(107)와, 네트워크 어댑터(118) 및 다양한 애드인 카드들(add-in cards)(120, 121)과 같은 다른 컴포넌트들 사이의 접속들을 제공한다. USB 혹은 다른 포트 접속들, CD 드라이브들, DVD 드라이브들 등을 포함하는 다른 컴포넌트들(명시적으로 도시되지는 않음)도 I/O 브리지(107)에 접속될 수 있다. 도 1의 다양한 컴포넌트들을 상호접속하는 통신 경로들은 임의의 적합한 프로토콜들, 예를 들면 PCI(Peripheral Component Interconnect), PCI Express(PCI-E), AGP(Accelerated Graphics Port), HyerTransport, 혹은 임의의 다른 버스 또는 점대점 통신 프로토콜(들)을 이용하여 구현될 수 있고, 상이한 장치들 사이의 접속들은 당업계에 공지된 다른 프로토콜들을 이용할 수 있다.
병렬 처리 서브시스템(112)은 병렬 처리 유닛(PPU)(122) 및 병렬 처리(PP) 메모리(124)를 포함하는데, 이들은 예를 들면 프로그램가능 프로세서들, ASICs(Application Specific Integrated Circuits), 및 메모리 장치들과 같은 하나 이상의 집적 회로 장치들을 이용하여 구현될 수 있다. PPU(122)는 하나 이상의 프로세싱 코어들을 포함하는 고도의 병렬 프로세서를 유리하게 구현하는데, 프로세싱 코어들 각각은 다수의(예를 들면, 수백개의) 스레드들을 동시적으로 실행할 수 있다. PPU(122)는 선형 및 비선형 데이터 변환, 비디오 및/또는 오디오 데이터의 필터링, 모델링(예를 들면, 위치, 속도, 및 오브젝트들의 다른 속성들을 결정하기 위해 물리 법칙들을 적용), 이미지 렌더링 등을 포함하는 광범위한 어레이의 계산들을 수행하기 위해 프로그램될 수 있다. PPU(122)는 데이터를 시스템 메모리(104) 및/또는 PP 메모리(124)로부터 내부 메모리로 전달할 수 있고, 데이터를 처리할 수 있고, 결과 데이터를 시스템 메모리(104) 및/또는 PP 메모리(124)에 기입할 수 있 는데, 그러한 데이터는 예를 들면 CPU(102)를 포함하는 다른 시스템 컴포넌트들에 의해 액세스될 수 있다. 일부 실시예들에서, PPU(122)는 메모리 브리지(105) 및 버스(113)를 통해 CPU(102) 및/또는 시스템 메모리(104)에 의해 공급되는 그래픽 데이터로부터 픽셀 데이터를 생성하고, 픽셀 데이터를 저장하고 갱신하기 위해 PP 메모리(124)(예를 들면, 통상의 프레임 버퍼를 포함하는 그래픽 메모리로서 이용될 수 있음)와 상호작용하고, 픽셀 데이터를 디스플레이 장치(110)에 전달하는 것 등과 관련되는 다양한 태스크들을 수행하도록 구성될 수도 있다. 일부 실시예들에서, PP 서브시스템(112)은 그래픽 프로세서로서 동작하는 하나의 PPU(122), 및 범용 계산을 위해 이용되는 다른 PPU(122)를 포함할 수 있다. PPU들은 서로 동일하거나 상이할 수 있으며, 각 PPU는 그 자체의 전용 PP 메모리 장치(들)를 가질 수 있다.
CPU(102)는 다른 시스템 컴포넌트들의 동작들을 제어하고 조정하는 시스템(100)의 마스터 프로세서로서 동작한다. 특히, CPU(102)는 PPU(122)의 동작을 제어하는 커맨드들을 발행한다. 일부 실시예들에서, CPU(102)는 시스템 메모리(104), PP 메모리(124), 혹은 CPU(102) 및 PPU(122) 모두에 의해 액세스가능한 다른 저장 위치 내에 있을 수 있는 커맨드 버퍼에 PPU(122)에 대한 커맨드들의 스트림을 기입한다. PPU(122)는 커맨드 버퍼로부터 커맨드 스트림을 판독하고 커맨드들을 CPU(102)의 동작과 비동기적으로 실행한다.
본 명세서에 개시된 시스템은 예시적인 것이고, 변형들 및 수정들이 가능함을 알 것이다. 브리지들의 개수와 배열을 포함하는, 접속 토폴로지는 원하는 대로 변경될 수 있다. 예를 들면, 일부 실시예들에서, 시스템 메모리(104)는 브리지를 통하지 않고 직접 CPU(102)에 접속되고, 다른 장치들은 메모리 브리지(105) 및 CPU(102)를 통해 시스템 메모리(104)와 통신한다. 다른 대안적인 토폴로지들에서, PP 서브시스템(112)은 메모리 브리지(105)가 아니라 I/O 브리지(107)에 접속된다. 다른 실시예들에서, I/O 브리지(107)와 메모리 브리지(105)는 단일 칩으로 집적될 수 있다. 본 명세서에 도시된 특정 컴포넌트들은 옵션적이고, 예를 들면, 임의의 수의 애드인 카드들 혹은 주변 장치들이 지원될 수 있다. 일부 실시예들에서, 스위치(116)는 제거되고, 네트워크 어댑터(118) 및 애드인 카드들(120, 121)은 직접 I/O 브리지(107)에 접속한다.
PPU(122)의 시스템(100)의 나머지 부분과의 접속도 변경될 수 있다. 일부 실시예들에서, PP 시스템(112)은 시스템(100)의 확장 슬롯에 삽입될 수 있는 애드인 카드로서 구현된다. 다른 실시예들에서, PPU는 메모리 브리지(105) 혹은 I/O 브리지(107)와 같은 버스 브리지와 함께 단일 칩 상에 일체화될 수 있다. 다른 실시예들에서, PPU의 일부 혹은 모든 소자들은 CPU(102)와 함께 일체화될 수 있다.
PPU는 로컬 메모리가 없는 경우를 포함하여 임의의 양의 로컬 PP 메모리가 제공될 수 있고, 로컬 메모리와 시스템 메모리를 임의의 조합으로 이용할 수 있다. 예를 들어, PPU(122)는 통합된 메모리 아키텍처(Unified Memory Architecture: UMA) 실시예에서 그래픽 프로세서일 수 있고, 그러한 실시예들에서 전용 그래픽 메모리는 거의 혹은 전혀 제공되지 않고, PPU(122)는 시스템 메모리를 배타적으로 혹은 거의 배타적으로 이용할 것이다. UMA 실시예들에서, PPU는 브리지 칩으로 일체 화될 수 있으며, 또는 PPU를 브리지 칩 및 시스템 메모리에 접속하는 고속 링크(예를 들면 PCI-E)와 별개의 칩으로서 제공될 수 있다.
또한, 예를 들어 단일 애드인 카드 상의 다수의 PPU들을 포함함으로써, 다수의 애드인 카드들을 경로(113)에 접속함으로써, 그리고/또는 하나 이상의 PPU들을 시스템 마더보드에 직접 접속함으로써 임의의 수의 PPU들이 시스템에 포함될 수 있다는 것을 이해할 것이다. 다수의 PPU들은 단일 PPU로 가능한 것보다 더 높은 처리량(throughput)으로 데이터를 처리하기 위해 병렬적으로 동작될 수 있다.
당업자들은 CPU와 PPU가 단일 디바이스로 일체화될 수 있고, 명령어 로직, 버퍼들, 캐시들, 메모리들, 처리 엔진들 등과 같은 다양한 자원들을 공유할 수 있고, 혹은 별도의 자원들이 병렬 처리 및 다른 연산들을 위해 제공될 수 있다는 것도 알 것이다. 따라서, PPU와 연관된 것으로서 본 명세서에 설명된 회로들 및/또는 기능들 중 임의의 것이나 그 모두는 적합하게 구비된 CPU 내에 구현되어 CPU에 의해 수행될 수도 있다.
PPU들을 포함하는 시스템들은, 데스크 탑, 랩탑, 혹은 휴대형 퍼스널 컴퓨터들, 서버들, 워크스테이션들, 게임 콘솔들, 내장 시스템들 등을 포함한 다양한 구성들 및 폼 팩터들(form factors)로 구현될 수 있다.
당업자들은 본 발명의 하나의 이점이 특별한 컴퓨팅 하드웨어로부터의 독립성의 증가라는 것임을 알 것이다. 따라서, 본 발명의 실시예들은 PPU를 제공하지 않는 시스템들을 포함하는, 임의의 컴퓨터 시스템을 이용하여 실현될 수 있다는 것을 이해할 것이다.
2. 가상 프로그래밍 모델 개관
본 발명의 실시예들에서, 스레드 어레이들을 이용하는 범용 계산들을 실행하기 위해 PPU(112) 혹은 컴퓨팅 시스템의 다른 프로세서(들)를 이용하는 것이 바람직하다. 본 명세서에 이용된 바와 같이, "스레드 어레이"는 입력 데이터 세트에 동일한 프로그램을 동시적으로 실행하여 출력 데이터 세트를 생성하는 다수(n0)의 스레드들로 구성된 그룹이다. 스레드 어레이 내의 각 스레드에는 스레드의 실행 동안 그 스레드에 액세스할 수 있는 고유의 스레드 식별자("스레드 ID")가 할당된다. 스레드 ID는 일차원 혹은 다차원 수치적 값(예를 들면 0 내지 n0-1)으로서 정의될 수 있고, 스레드의 처리 거동의 다양한 양태들을 제어한다. 예를 들어, 스레드 ID는 입력 데이터 세트의 어느 부분을 스레드가 처리할지를 결정하고 그리고/또는 출력 데이터 세트의 어느 부분을 스레드가 생성하거나 기입할지를 결정하기 위해 이용될 수 있다.
일부 실시예들에서, 스레드 어레이들은 "협력적인" 스레드 어레이들("Cooperative" Thread Arrays), 즉, CTA들이다. 다른 타입의 스레드 어레이들과 마찬가지로, CTA는 입력 데이터 세트에 동일한 프로그램(본 명세서에서 "CTA 프로그램"으로서 일컬음)을 동시적으로 실행하여 출력 데이터 세트를 생성하는 다수의 스레드들의 그룹이다. CTA에서, 스레드들은 스레드 ID에 의존하는 방식으로 서로 데이터를 공유함으로써 협력할 수 있다. 예를 들어, CTA에서, 데이터는 하나의 스레드에 의해 생성될 수 있고 다른 스레드에 의해 소비(consume)될 수 있다. 일 부 실시예들에서, 동기화 명령어들은, 소비 스레드(consuming thread)가 데이터를 액세스하려고 시도하기 전에 그 데이터가 생성 스레드에 의해 실제로 생성되었음을 보장하기 위해 데이터가 공유되어야 하는 포인트들에서 CTA 프로그램 코드 내에 삽입될 수 있다. CTA의 스레드들 간의 데이터 공유가 존재한다면 그 범위는 CTA 프로그램에 의해 결정되고, 따라서, CTA들을 이용하는 특별한 애플리케이션에서, CTA 프로그램에 따라, CTA의 스레드들은 서로 데이터를 실제로 공유할 수도 혹은 공유하지 않을 수도 있으며, "CTA" 및 "스레드 어레이"라는 용어들은 동의어로서 본 명세서에서 사용된다는 것을 이해해야 한다.
일부 실시예들에서, CTA 내의 스레드들은 동일한 CTA 내의 다른 스레드들과 입력 데이터 및/또는 중간 결과들을 공유한다. 예를 들어, CTA 프로그램은, 특정 데이터가 기입될 공유 메모리 내의 어드레스를 계산하기 위한 명령어를 포함할 수 있는데, 이 어드레스는 스레드 ID의 함수일 수 있다. 각 스레드는 그 자신의 스레드 ID를 이용하는 함수를 계산하여 대응하는 위치에 기입한다. 어드레스 함수는 상이한 스레드들이 상이한 위치들에 기입하도록 유리하게 정의되고, 함수가 결정론적인 한, 임의의 스레드에 의해 기입되는 위치는 예측가능하다. CTA 프로그램은 데이터가 판독되어질 수 있는 공유 메모리 내의 어드레스를 계산하기 위한 명령어를 포함할 수도 있는데, 이 어드레스는 스레드 ID의 함수이다. 적합한 함수들을 정의하고 동기화 기술들을 제공함으로써, 데이터는 CTA의 하나의 스레드에 의해 공유 메모리 내의 주어진 위치에 기입될 수 있고, 예측가능한 방식으로 동일한 CTA의 다른 스레드에 의해 그 위치로부터 판독될 수 있다. 결과적으로, 스레드들 간의 임의의 원하는 패턴의 데이터 공유가 지원될 수 있고, CTA 내의 임의의 스레드는 동일한 CTA 내의 임의의 다른 스레드와 데이터를 공유할 수 있다.
CTA들(혹은 다른 타입들의 스레드 어레이들)은 그 자신들을 데이터-병렬적으로 분해하는 계산을 수행하기 위해 유리하게 채용된다. 본 명세서에서 사용된 바와 같이, "데이터-병렬 분해"는 계산 문제가 입력 데이터에 동일한 알고리즘을 병렬로 다수회 실행하여 출력 데이터를 생성함으로써 해결되는 임의의 상황을 포함하는데, 예를 들면, 데이터 병렬 분해의 하나의 통상적인 예는 출력 데이터 세트의 상이한 부분들을 생성하기 위해 입력 데이터의 상이한 부분들에 동일한 알고리즘을 적용하는 것을 수반한다. 데이터-병렬 분해로 다룰 수 있는 문제들의 예들은 행렬 대수, 임의 수의 차원들의 선형 및/또는 비선형 변환들(예를 들면, FFT(Fast Fourier Transforms)), 및 임의 수의 차원들의 컨볼루션 필터들과 다수의 차원들의 분리가능 필터들 등을 포함하는 다양한 필터링 알고리즘들을 포함한다. 입력 데이터 세트의 각 부분에 적용될 프로세싱 알고리즘은 CTA 프로그램 내에 특정되고, CTA 내의 각 스레드는 입력 데이터 세트의 일부분에 대해 동일한 CTA 프로그램을 실행한다. CTA 프로그램은 광범위한 수학적 및 논리적 연산들을 이용하는 알고리즘들을 구현할 수 있고, 프로그램은 조건부 혹은 분기(branching) 실행 경로들 및/또는 직접적인 그리고/또는 간접적인 메모리 액세스를 포함할 수 있다.
CTA들 및 그 실행은 앞서 언급한 미국특허출원번호 제11/303,780호에 더 상세히 설명되어 있다.
또한, 일부 상황들에서는, 관련된 CTA들(혹은 보다 일반적으로 스레드 어레 이들)의 "그리드"를 정의하는 것이 유용하다. 본 명세서에서 이용되는 바와 같이, CTA들의 "그리드"는 다수(n1)의 CTA들의 컬렉션(collection)일 수 있는데, "그리드" 내의 모든 CTA들은 동일한 사이즈(즉, 스레드들의 개수)이고 동일한 CTA 프로그램을 실행한다. 그리드 내의 n1 CTA들은 유리하게 서로 독립적인데, 이것은 그리드 내의 임의의 CTA의 실행이 그리드 내의 임의의 다른 CTA의 실행에 의해 영향을 받지 않는다는 것을 의미한다. 명백하게 되는 바와 같이, 이 특징은 CTA들을 가용 프로세싱 코어들에 분배함에 있어서 상당한 유연성을 제공한다.
그리드 내의 상이한 CTA들을 구별하기 위해, "CTA 식별자"(혹은 CTA ID)가 그리드의 각 CTA에 유리하게 할당된다. 스레드 ID들과 같이, 임의의 고유한 식별자(숫자 식별자들을 포함하지만 이들로만 제한되지는 않음)가 CTA ID로서 이용될 수 있다. 일 실시예에서, CTA ID들은 0부터 n1-1까지의 단순히 순차적인 (일-차원적인) 인덱스 값들이다. 다른 실시예들에서, 다차원적인 인덱싱 스킴들이 이용될 수 있다. CTA ID는 CTA의 모든 스레드들에 공통적이고, 그리드 내의 주어진 CTA의 스레드는, 예를 들어 입력 데이터의 판독을 위한 소스 위치 및/또는 출력 데이터를 기입하기 위한 목적지 위치를 결정하기 위해, 그의 스레드 ID와 관련하여 그의 CTA ID를 이용할 수 있다. 이러한 방식으로, 동일한 그리드의 상이한 CTA들 내의 스레드들은 동일한 데이터 세트에 대해 동시적으로 작동할 수 있지만, 일부 실시예들에서는 그리드 내의 상이한 CTA들 사이의 데이터의 공유가 지원되지 않는다.
예를 들어, 거대한 단일 문제의 상이한 부분들을 해결하기 위해 다수의 CTA 들을 이용하는 것이 바람직한 경우에, CTA들의 그리드의 정의가 유용하다. 예를 들면, 고선명 텔레비전(HDTV) 이미지를 생성하기 위해 필터링 알고리즘을 수행하는 것이 바람직할 수 있다. 당업계에 공지된 바와 같이, HDTV 이미지는 2백만 픽셀을 넘어서 포함할 수 있다. 각 스레드가 하나의 픽셀을 생성하면, 실행될 스레드들의 수는 단일 CTA 내에서 처리될 수 있는 스레드들의 수를 초과할 것이다(합리적인 크기와 비용의 프로세싱 플랫폼이 종래 기술들을 이용하여 구축된다고 가정함).
이 거대한 프로세싱 태스크는 이미지를 다수의 CTA들 중에 분할하여, 각 CTA가 출력 픽셀들의 상이한 부분(예를 들면, 16×16 타일)을 생성하게 함으로써 다루어질 수 있다. 모든 CTA들은 동일한 프로그램을 실행하고, 스레드들은 입력 데이터를 판독하고 출력 데이터를 기입하기 위한 위치들을 결정하기 위해 CTA ID 및 스레드 ID의 조합을 이용함으로써, 각 CTA가 입력 데이터 세트의 정확한 부분에 대해 작동하고 출력 데이터 세트의 그의 부분을 정확한 위치에 기입한다.
(데이터를 공유할 수 있는) CTA 내의 스레드들과는 다르게, 그리드 내의 CTA들은 유리하게는 데이터를 서로 공유하지 않거나, 혹은 달리는 서로에 의존한다는 것을 유의한다. 즉, 동일한 그리드의 두개의 CTA들은 순차적으로(어느 순서로도) 혹은 동시적으로 실행될 수 있고, 여전히 동일한 결과들을 생성한다. 결과적으로, 프로세싱 플랫폼(예를 들면, 도 1의 시스템(100))은 CTA들의 그리드를 실행할 수 있고 하나의 CTA를 첫번째로 실행하고, 그 후 다음 CTA 등을, 그리드의 모든 CTA들이 실행될 때까지, 실행함으로써 결과를 얻을 수 있다. 대안적으로, 충분한 자원들이 가용이라면, 프로세싱 플랫폼은 동일한 그리드를 실행할 수 있고, 다수의 CTA 들을 병렬로 실행함으로써 동일한 결과를 얻는다.
일부 예들에서, CTA들의 다수(n2)의 그리드들을 정의하는 것이 바람직할 수 있는데, 각 그리드는 데이터-프로세싱 프로그램 혹은 태스크의 상이한 부분을 실행한다. 예를 들어, 데이터 프로세싱 태스크는 다수의 "해결 단계들"로 나뉘어질 수 있는데, 각 해결 단계는 CTA들의 그리드를 실행함으로써 수행된다. 다른 예로서, 데이터 프로세싱 태스크는 일련의 입력 데이터 세트들(예를 들면, 연속적인 비디오 데이터의 프레임들)에 대해 동일 또는 유사한 연산들을 수행하는 것을 포함할 수 있고, CTA들의 그리드는 각각의 입력 데이터 세트에 대해 실행될 수 있다. 가상 프로그래밍 모델은 유리하게는 적어도 이들 세 레벨의 작업 정의(즉, 스레드들, CTA들, 및 CTA들의 그리드들)를 지원하고, 추가적인 레벨들도 원한다면 지원될 수 있다.
특정 문제를 해결하기 위해 사용되는 CTA의 크기(스레드들의 수 n0), 그리드의 크기(CTA들의 수 n1), 및 그리드들의 수(n2)는 문제의 파라미터들, 및 문제 분해를 정의하는 자동 에이전트 혹은 프로그래머의 선호도에 의존할 것임을 이해할 것이다. 따라서, 일부 실시예들에서, CTA의 크기, 그리드의 크기, 그리드들의 수는 유리하게는 프로그래머에 의해 정의된다.
CTA 접근법(approach)으로부터 이익을 얻는 문제들은 일반적으로 병렬로 처리될 수 있는 다수의 데이터 요소들이 존재한다는 것에 특징이 있다. 일부 예들에서, 데이터 요소들은 출력 요소들이고, 그 각각의 요소는 입력 데이터 세트의 상이 한(가능하게는 중첩하는) 부분들에 대해 동일한 알고리즘을 수행함으로써 생성된다. 다른 예들에서, 데이터 요소들은 그 각각이 동일한 알고리즘을 이용하여 처리될 입력 요소들일 수 있다.
그러한 문제들은 항상 적어도 2개의 레벨로 분해하여 전술한 스레드들, CTA들 및 그리드들에 맵핑할 수 있다. 예컨대, 각 그리드는 복잡한 데이터 처리 태스크에서 하나의 해결 단계의 결과를 나타낼 수 있다. 각 그리드는 유리하게는 각각 단일 CTA로서 처리될 수 있는 다수의 "블록"으로 분할된다. 각 블록은 유리하게는 다수의 "요소", 즉 해결할 문제의 기본적인 부분(예컨대, 단일 입력 데이터 포인트 또는 단일 출력 데이터 포인트)를 포함한다. CTA 내의 각 스레드는 하나 이상의 요소를 처리한다.
도 2a 및 도 2b는 본 발명의 실시예들에서 이용되는 가상 프로그래밍 모델에서의 그리드들, CTA들 및 스레드들 사이의 관계를 예시한다. 도 2a는 각각이 CTA들(202)의 이차원(2-D) 어레이로 이루어진 다수의 그리드(200)를 도시한다. (여기서, 같은 오브젝트들의 다수의 인스턴스는 오브젝트를 식별하는 참조 번호와 필요시 인스턴스를 식별하는 괄호 번호로 표시된다.) 도 2b에 도시한 바와 같이 CTA (202(0,0))의 경우, 각 CTA(202)는 스레드들(Θ)(204)의 2-D 어레이를 포함한다. 각 그리드(200)의 각 CTA(202)의 각 스레드(204)의 경우, I=[ig,ic,it] 형태의 고유한 식별자가 정의될 수 있으며, 여기서 그리드 식별자 ig는 그리드를 고유하게 식별하고, CTA ID ic는 그리드 내의 CTA를 고유하게 식별하며, 스레드 ID it는 CTA 내의 스레드를 고유하게 식별한다. 본 실시예에서, 식별자 I는 일차원 그리드 식별자 ig, 이차원 CTA 식별자 ic, 및 이차원 스레드 식별자 it로 구성될 수 있다. 다른 실시예들에서, 고유한 식별자 I는 0≤ig<n2; 0≤ic<n1; 및 0≤it<n0 인 트리플릿triplet) 정수이다. 또 다른 실시예들에서, 그리드, CTA 및 스레드 식별자 중 어느 하나 또는 모두는 일차원 정수, 2D 좌표쌍, 3D 트리플릿 등으로 표현될 수 있다. 고유한 스레드 식별자 I는 예컨대 전체 그리드나 다수의 그리드에 대한 입력 데이터 세트를 포함하는 어레이 내의 입력 데이터에 대한 소스 위치를 결정, 및/또는 전체 그리드나 다수의 그리드에 대한 출력 데이터 세트를 포함하는 어레이 내의 출력 데이터를 저장하기 위한 타겟 위치를 결정하는 데에 이용될 수 있다.
예를 들어, HDTV 이미지의 경우, 각 스레드(204)는 출력 이미지의 픽셀에 대응할 수 있다. CTA(202)의 사이즈(스레드(204)의 수)는 문제 분해 시의 선택의 문제이며, (프로세서 자원의 유한 특성을 반영하는) 단일 CTA(202)의 최대수의 스레드에 대한 제약에 의해서만 제한된다. 그리드(200)가 HDTV 데이터의 전체 프레임에 대응하거나, 다수의 그리드가 단일 프레임에 맵핑될 수 있다.
일부 실시예들에서, 문제 분해는 균일한데, 이것은 모든 그리드(200)가 동일한 수 및 구성의 CTA(202)를 갖고, 모든 CTA(202)가 동일한 수 및 구성의 스레드(204)를 갖는다는 것을 의미한다. 다른 실시예들에서, 문제 분해는 불균일할 수 있다. 예를 들면, 상이한 그리드들은 상이한 수의 CTA를 포함하고, (동일한 그리드 또는 상이한 그리드 내의) 상이한 CTA들은 상이한 수의 스레드를 포함할 수 있 다.
전술한 바와 같이 CTA는 수십 또는 심지어 수백의 동시적인 스레드(concurrent thread)를 포함할 수 있다. CTA를 실행할 병렬 처리 시스템은 그와 같이 많은 수의 동시 스레드를 지원할 수도 지원하지 않을 수도 있다. 일 양태에서, 본 발명은 프로그래머가 실제 하드웨어 성능과 상관없이 CTA들 및 CTA들의 그리드들의 모델을 이용하여 처리 태스크를 정의할 수 있게 함으로써 그러한 하드웨어 제한으로부터 프로그래머를 분리해준다. 예를 들어, 프로그래머는 CTA의 단일 대표 스레드에 의해 수행될 처리 태스크(들)를 정의하고, 각각이 고유한 식별자를 갖는 그러한 다수의 스레드로서 CTA를 정의하고, 각각이 고유한 식별자를 갖는 다수의 CTA로서 그리드를 정의하는 코드("CTA 프로그램")를 기입할 수 있다. 후술하는 바와 같이, 그러한 코드는 특정 플랫폼 상에서 실행 가능한 코드로 자동 변환된다. 예컨대, n0개의 동시 스레드를 포함하나 타겟 플랫폼이 하나의 스레드만을 지원하는 것으로서 CTA를 정의한 경우, 변환기는 n0개의 스레드 전체에 할당된 태스크를 수행하는 하나의 실제 스레드를 정의할 수 있다. 타겟 플랫폼이 하나보다는 많으나 n0개보다는 적은 동시 스레드를 지원하는 경우, 태스크들은 필요에 따라 이용가능한 수의 스레드들 중에 분할될 수 있다.
따라서, CTA 및 그리드의 프로그래밍 모델은 가상 모델, 즉 어떠한 특정의 물리적인 실현으로부터 분리되어, 개념상 프로그래머를 돕는 모델로서 이해되어야 한다. CTA 및 그리드의 가상 모델은 병렬 처리에 대한 하드웨어의 지원 정도에 따 라 각종 타겟 플랫폼에서 실현될 수 있다. 특히, 본원에서 사용하는 "CTA 스레드"란 용어는 (가능한 한 하나 이상의 다른 처리 태스크와 협력하는) 이산 처리 태스크의 가상 모델을 의미하며, 이것은 CTA 스레드들이 타겟 플랫폼 상의 스레드들에 일대일로 맵핑될 수도 혹은 맵핑되지 않을 수도 있다는 것을 이해해야 한다.
Ⅲ. 가상 아키텍처
본 발명의 일 양태에 따르면, CTA들 및 CTA들의 그리드들을 실행하는 가상 병렬 아키텍처가 정의된다. 가상 병렬 아키텍처는 데이터를 공유하고 원하는 시간에 서로 동기하는 등의 협력 거동이 가능한 다수의 동시 CTA 스레드의 실행을 지원하는 병렬 프로세서 및 관련 메모리 공간들의 표현이다. 이 가상 병렬 아키텍처는, 예를 들면 도 1의 시스템(100)의 PPU(122)를 포함하는, 각종 실제 프로세서 및/또는 처리 시스템에 맵핑될 수 있다. 가상 아키텍처는, 유리하게는, 가상 프로세서에 의해 실행가능한 모든 함수들을 식별하는 가상 명령어 세트 아키텍처(ISA) 뿐만 아니라 상이한 레벨의 데이터 공유 및 액세스 타입을 지원하는 많은 가상 메모리 공간들도 정의한다. 가상 아키텍처는 또한 유리하게는, 예를 들어, CTA 또는 CTA들의 그리드를 정의 및 론칭(launching)함으로써, CTA 실행을 제어하는데 사용될 수 있는 가상 실행 드라이버를 정의한다.
도 3은 본 발명의 일 실시예에 따른 가상 아키텍처(300)의 블록도이다. 가상 아키텍처(300)는 다수의 CTA 스레드들을 병렬로 실행하도록 구성되는 가상 코어(308)를 갖는 가상 프로세서(302)를 포함한다. 가상 아키텍처(300)는 또한, 가상 프로세서(302)에 액세스가능한 전역 메모리(304) 및 가상 프로세서(302)의 동작 을 제어하라는 커맨드들을 공급하는 가상 드라이버(320)를 포함한다. 가상 드라이버(320)는 또한 전역 메모리(304)에 액세스할 수 있다.
가상 프로세서(302)는 가상 드라이버(320)로부터의 커맨드들을 수신하여 해석하는 프론트 엔드(front end)(306) 및 단일 CTA의 모든 no개의 스레드들을 동시에 실행할 수 있는 가상 코어(308)를 포함한다. 가상 코어(308)는 다수의(no개 또는 그 이상) 가상 처리 엔진(310)을 포함하고; 일 실시예에서, 각 가상 처리 엔진(310)은 하나의 CTA 스레드를 실행한다. 가상 처리 엔진(310)은 그들 각각의 CTA 스레드들을, 반드시 병렬이 아닐지라도, 동시에 실행한다. 일 실시예에서, 가상 아키텍처(300)는 가상 처리 엔진(310)의 수 T(예컨대, 384, 500, 768 등)를 지정하며; 이 수는 CTA 내의 스레드의 수 no에 대한 상한을 설정한다. 가상 아키텍처(300)의 실현은, 지정된 수 T보다 적은 물리 처리 엔진을 포함할 수 있으며, 단일 처리 엔진이, 단일의 "실제(real)"(즉, 플랫폼-지원형) 스레드와 복수의 동시 실제 스레드 중 어느 하나로서, 수 개의 CTA 스레드들을 실행할 수 있음을 이해해야 한다.
가상 프로세서(302)는 또한 가상 처리 엔진들(310)에 그들 각각의 CTA 스레드들에 대한 명령어가 공급되도록 유지하는 가상 명령어 유닛(312)을 포함하고; 그 명령어들은 가상 아키텍처(300)의 일부인 가상 ISA에 의해 정의된다. 병렬 스레드 계산을 위한 가상 ISA의 일례를 후술한다. 명령어 유닛(312)은 가상 처리 엔진(310)에 명령어를 공급하는 중에 CTA 스레드 동기화 및 CTA 스레드 거동의 다른 협력 양태들을 관리한다.
가상 코어(308)는 상이한 레벨의 액세스성(accessibility)을 갖는 내부 데이터 저장을 제공한다. 특수 레지스터들(311)은 가상 처리 엔진(310)에 의해 판독은 가능하지만 기입가능하지는 않으며, 도 2의 문제 분해 모델 내의 각각의 CTA 스레드의 "위치"를 정의하는 파라미터들을 저장하는데 사용된다. 일 실시예에서, 특수 레지스터들(311)은 스레드 ID를 저장하는 CTA 스레드마다 (또는 가상 처리 엔진(310)마다) 하나의 레지스터를 포함하며; 각각의 스레드 ID 레지스터는 가상 처리 엔진들(310) 각각에 의해서만 액세스가능하다. 특수 레지스터들(311)은 또한 CTA 식별자, CTA 차원들, 그 CTA가 속한 그리드의 차원들, 및 그 CTA가 속한 그리드의 식별자를 저장하는 모든 CTA 스레드들에 의해(또는 모든 가상 처리 엔진들(310)에 의해) 판독가능한, 부가적인 레지스터들을 포함할 수 있다. 특수 레지스터들(311)은 가상 드라이버(320)로부터 프론트 엔드(306)를 통해 수신된 커맨드들에 응답하여 초기화 중에 기입되어, CTA 실행 동안 변경되지 않는다.
로컬 가상 레지스터들(314)은 스크래치 공간으로서 각 CTA 스레드에 의해 사용되고; 각 레지스터가 하나의 CTA 스레드(또는 하나의 가상 처리 엔진(310))의 배타적 사용을 위해 할당되며, 로컬 레지스터들(314) 중 임의의 레지스터 내의 데이터는 그것이 할당된 CTA 스레드에만 액세스 가능하다. 공유 메모리(316)는 (단일의 CTA 내의) 모든 CTA 스레드들에 액세스 가능하며; 공유 메모리(316) 내의 임의의 위치가 동일 CTA 내의 임의의 CTA 스레드에 (또는 가상 코어(308) 내의 임의의 가상 처리 엔진(310)에) 액세스 가능하다. 파라미터 메모리(318)는 임의의 CTA 스 레드(또는 임의의 가상 처리 엔진(310))에 의해 판독될 수는 있지만 기입될 수는 없는 런타임 파라미터들(상수들)을 저장한다. 일 실시예에서, 가상 드라이버(320)는 이러한 파라미터들을 이용하는 CTA의 실행을 시작하라고 가상 프로세서(302)에 지시하기 전에 파라미터 메모리(318)에 파라미터들을 제공한다. 임의의 CTA 내의 임의의 CTA 스레드(또는 가상 코어(308) 내의 임의의 가상 처리 엔진(310))는 메모리 인터페이스(322)를 통해 전역 메모리(304)를 액세스할 수 있다.
가상 아키텍처(300)에서, 가상 프로세서(302)는 가상 드라이버(320)의 제어 하에 코프로세서로서 동작된다. 가상 아키텍처 명세(specification)는, 유리하게는, 가상 드라이버(320)에 의해 인식된 함수 호출 및 각 함수 호출이 생성할 것으로 예상되는 거동을 식별하는 가상 애플리케이션 프로그램 인터페이스(API)를 포함한다. 병렬 스레드 컴퓨팅을 위한 가상 API에 대한 예시적인 함수 호출을 후술한다.
가상 아키텍처(300)는 다양한 하드웨어 플랫폼 상에서 실현될 수 있다. 일 실시예에서, 가상 아키텍처(300)는, 도 1의 시스템(100)에서, 가상 프로세서(302)를 구현하는 PPU(122) 및 가상 드라이버(320)를 구현하는 CPU(102) 상에서 실행하는 PPU 드라이버 프로그램으로 실현된다. 전역 메모리(304)는 시스템 메모리(104) 및/또는 PP 메모리(124) 내에 구현될 수 있다.
일 실시예에서, PPU(122)는 (가상 명령어 유닛(312)을 구현하는) 단일 명령어 유닛(single instruction unit)으로부터의 다수의(예를 들어, 384 또는 768) 스레드(thread)들의 동시(concurrent) 실행을 지원하기 위해, 단일-명령어, 다중-데 이터(single-instruction, multiple-data; SIMD) 및 다중스레딩 기술들을 이용하는 하나 이상의 프로세싱 코어들을 포함한다. 각 코어는 명령어 유닛으로부터의 SIMD 명령어들을 수신하여 실행하도록 구성된 P(예를 들어, 8, 16, 등) 병렬 처리 엔진들(302)의 어레이를 포함함으로써, 최대 P 스레드들의 그룹들이 병렬로 처리될 수 있게 한다. 각 처리 엔진이 스레드 그룹들의 소정 수 G(예를 들어, 24)까지 동시에 실행 가능하게 함에 따라, 예를 들어, 처리 엔진이 하나의 스레드에서 다른 스레드로 신속히 전환할 수 있도록 각 스레드와 연관된 현재의 상태 정보를 유지함으로써, 코어는 다중스레드된다. 따라서, 코어는 전체 P*G 동시 스레드들에 대해 P 스레드들의 G SIMD 그룹들 각각을 동시에 실행한다. 이러한 실현에서, P*G≥n0 이면, (가상) CTA 스레드들과 실제 PPU(122) 상에서 실행하는 동시 스레드들 사이의 일대일 대응이 존재할 수 있다.
특수 레지스터들(311)은, 스레드 ID 저장이 가능한 각 엔트리를 가진, P*G 엔트리 레지스터 파일을 각 프로세싱 코어에 제공함으로써 및 CTA ID, 그리드 ID, 및 CTA와 그리드 차원(dimension)들을 저장하기 위한 전역 판독가능 레지스터들의 세트를 제공함으로써, PPU(122)에서 구현될 수 있다. 대안적으로, 특수 레지스터들(311)은 다른 저장 위치들을 이용하여 구현될 수 있다.
로컬 레지스터(local resistor)들(314)은 물리적으로 또는 논리적으로 P 레인(lane)들로 나누어진 로컬 레지스터 파일로서 PPU(122)에서 구현될 수 있고, 각각의 레인은 (각 엔트리가 예를 들어, 32-비트 워드를 저장할 수 있는) 소정 수의 엔트리들을 갖는다. 하나의 레인은 P 처리 엔진들 각각에 할당되고, 상이한 레인들에서의 대응하는 엔트리들은 SIMD 실행을 용이하게 하기 위해 동일 프로그램을 실행하는 상이한 스레드들에 대한 데이터로 채워질 수 있다. 레인들의 상이한 부분들은 G 동시 스레드 그룹들 중 상이한 것들에 할당될 수 있어, 로컬 레지스터 파일 내의 소정의 엔트리는 특정 스레드에만 액세스 가능하다. 일 실시예에서, 로컬 레지스터 파일 내의 특정 엔트리들은 스레드 식별자들을 저장하기 위해 예비되어(reserved), 특수 레지스터들(311) 중 하나를 구현한다.
공유 메모리(316)는, 임의의 처리 엔진이 공유 메모리의 임의의 위치로부터 판독하거나 또는 임의의 위치에 기입할 수 있게 하는 상호접속(interconnect)을 갖는 공유 레지스터 파일 또는 공유 온-칩 캐시 메모리로서, PPU(122)에서 구현될 수 있다. 파라미터 메모리(318)는, 공유 메모리(316)를 구현하는 동일한 공유 레지스터 파일 또는 공유 캐시 메모리 내의 지정된 부분으로서 또는 처리 엔진들이 판독 전용 액세스를 갖는 개별의 공유 레지스터 파일 또는 온-칩 캐시 메모리로서, PPU(122)에서 구현될 수 있다. 일 실시예에서, 파라미터 메모리를 구현하는 영역(area)은 CTA ID 및 그리드 ID뿐만 아니라 CTA와 그리드 차원들을 저장하는데 이용되기도 하여, 특수 레지스터들(311)의 일부분들을 구현한다.
일 실시예에서, 도 1의 CPU(102)를 실행하는 PPU 드라이버 프로그램은, 각 커맨드들이 PPU(122)에 의해 판독되는, 메모리(예를 들어, 시스템 메모리(104)) 내의 푸시버퍼(pushbuffer)(명시적으로 도시되지 않음)에 커맨드들을 기입함으로써 가상 API 함수 호출들에 대해 응답한다. 커맨드들은 유리하게는 CTA에서의 스레드 들의 수, CTA를 이용하여 처리될 입력 데이터 세트의 전역 메모리에서의 위치, 실행될 CTA 프로그램의 전역 메모리에서의 위치, 및 출력 데이터가 기입되는 전역 메모리에서의 위치와 같은, 상태 파라미터들과 연관된다. 커맨드들 및 상태 파라미터들에 응답하여, PPU(122)는 상태 파라미터들을 그의 코어들 중 하나에 로드하고, 그 후 CTA 파라미터들에서 특정된 스레드들의 수가 론칭(launching)될 때까지 스레드들을 론칭하기 시작한다. 일 실시예에서, PPU(122)는 스레드들이 론칭될 때 스레드들에 순차적으로 스레드 IC들을 할당하는 제어 로직을 포함하고, 스레드 ID는 예를 들어, 로컬 레지스터 파일 내의 지정된 위치에서 또는 이 목적 전용의 특수 레지스터에 저장될 수 있다.
대안적인 실시예에서, 가상 아키텍처(300)는 실제 스레드들 n0 보다 더 적은 스레드들을 이용하여 모든 CTA 스레드들을 실행하는 단일-스레드된 프로세싱 코어에서(예를 들어, 일부 CPU들에서) 실현되며, 가상 프로그래밍 모델이 상이한 CTA 스레드들과 연관시키는 프로세싱 태스크들은 예를 들어, 하나의 CTA 스레드에 대해 태스크(또는 그의 일부분)를 실행하고, 그 후 다음 CTA 스레드에 대해 태스크를 실행하는 등에 의해 단일 스레드에 결합될 수 있다. 벡터 실행, SIMD 실행, 및/또는 머신에서 이용가능한 임의의 다른 형태의 병렬법(parallelism)은 다수의 CTA 스레드들과 연관된 프로세싱 태스크들을 병렬로 실행하거나 또는 동일 CTA 스레드와 연관된 다수의 프로세싱 태스크들을 병렬로 실행하는 데 이용될 수 있다. 따라서, CTA는 단일 스레드, n0 스레드들, 또는 임의의 다른 수의 스레드들을 이용하여 실현 될 수 있다. 하기 기재되는 바와 같이, 가상 명령어 변환기는 유리하게는 타겟 가상 아키텍처(300)에 기입된 코드를 타겟 플랫폼에 특정한 명령어들로 변환한다.
본 명세서에 기재된 가상 아키텍처는 예시적인 것이며, 변경들 및 수정들이 가능하다는 것이 이해될 것이다. 예로서, 하나의 대안적인 실시예에서, 각 가상 처리 엔진은 이러한 목적을 위해, 로컬 가상 레지스터들 내의 공간을 이용하기보다는 그의 스레드에 할당된 고유한 스레드 ID를 저장하는 전용 스레드-ID 레지스터를 가질 수 있다.
다른 예로서, 가상 아키텍처는 가상 코어(308)의 내부 구조에 대해 보다 상세히 또는 덜 상세히 특정할 수 있다. 예로서, 가상 코어(308)는 P-웨이(way) SIMD 그룹들에서 CTA 스레드들을 실행하는데 이용된 P 다중스레드된 가상 처리 엔진들을 포함하고, 최대 G SIMD 그룹들이 코어(308)에 공존하여, P*G가 T(CTA에서의 스레드들의 최대 수)를 결정한다는 것이 특정될 수 있다. 상이한 메모리 타입들 및 공유 레벨들도 특정될 수 있다.
가상 아키텍처는 각 컴포넌트를 정의하고 제어하기 위해 하드웨어 및/또는 소프트웨어 요소들의 임의의 조합을 이용하여 다양한 컴퓨터 시스템들에서 실현될 수 있다. 하드웨어 컴포넌트들을 이용한 하나의 실현이 예로서 설명되었지만, 본 발명은 특정 하드웨어 실현으로부터 프로그래밍 태스크들을 분리시키는 것에 관한 것임이 이해될 것이다.
4. 가상 아키텍처 프로그래밍
도 4는 본 발명의 실시예에 따른 타겟 프로세서 또는 플랫폼(440)을 동작하 기 위해 가상 아키텍처(300)를 이용하는 것에 대한 개념적 모델(400)이다. 모델(400)이 나타내는 바와 같이, 가상 아키텍처(300)의 존재는 타겟 프로세서 또는 플랫폼의 하드웨어 구현으로부터 컴파일된 애플리케이션들과 API들을 분리한다.
애플리케이션 프로그램(402)은 단일 CTA 및/또는 CTA들의 그리드들을 포함하는, 상술된 가상 프로그래밍 모델을 이용하는 데이터-처리 애플리케이션을 정의한다. 일반적으로, 애플리케이션 프로그램(402)은 다수의 양태를 포함한다. 첫째, 프로그램은 단일 CTA 스레드의 거동을 정의한다. 둘째, 프로그램은 (CTA 스레드들의 수에서의) CTA의 차원, 및 그리드들이 이용되는 경우에는, (CTA들의 수에서의) 그리드의 차원들을 정의한다. 셋째, 프로그램은 CTA(또는 그리드)에 의해 처리될 입력 데이터 세트 및 출력 데이터 세트가 저장될 위치를 정의한다. 넷째, 프로그램은 예를 들어, 각 CTA 또는 그리드를 론칭할 때를 포함하는 전반적인 프로세싱 거동을 정의한다. 프로그램은 CTA 또는 그리드의 차원들, 새로운 CTA들 또는 그리드들의 론칭을 유지할지, 등을 동적으로 결정하는 추가 코드를 포함할 수 있다.
애플리케이션 프로그램(402)은 C/C++, 포트란, 등과 같은 고레벨의 프로그래밍 언어로 기입될 수 있다. 일 실시예에서, 애플리케이션 C/C++ 프로그램은 하나의 (가상) CTA 스레드의 거동을 직접적으로 특정한다. 다른 실시예에서, 애플리케이션 프로그램은 데이터-병렬 언어(예를 들어, 포트란 90, C+ 또는 데이터 병렬 C)를 이용하여 기입되고, 어레이들 및 집합체 데이터 구조들(aggregate data structures)에 대한 데이터 병렬 연산들을 특정하며, 그러한 프로그램은 하나의 (가상) CTA 스레드의 거동을 특정하는 가상 ISA 프로그램 코드로 컴파일될 수 있 다. CTA 스레드의 거동이 정의되도록 하기 위해, 프로그래머가 병렬 CTA 스레드 거동을 특정할 수 있는 언어 확장 또는 함수 라이브러리가 제공될 수 있다. 예로서, 특수 심볼들 또는 변수들은 스레드 ID, CTA ID, 및 그리드 ID에 대응하도록 정의될 수 있고, CTA 스레드가 다른 CTA 스레드들과 동기해야 할 때 프로그래머가 지시할 수 있는 함수들이 제공될 수 있다.
애플리케이션 프로그램(402)이 컴파일될 때, 컴파일러(408)는 CTA 스레드 거동을 정의하는 애플리케이션 프로그램(402)의 그러한 부분들에 대해 가상 ISA 코드(410)를 생성한다. 일 실시예에서, 가상 ISA 코드(410)는 도 3의 가상 아키텍처의 가상 ISA에 표현된다. 가상 ISA 코드(410)는 프로그램 코드이며, 코드는 반드시 특정 타겟 플랫폼에서 실행될 수 있는 형태의 것일 필요는 없다. 그와 같이, 가상 ISA 코드(410)는 임의의 다른 프로그램 코드로서 저장되거나 및/또는 분배될 수 있다. 다른 실시예들에서, 애플리케이션 프로그램들은 가상 ISA 코드(410)로서 전체적으로 또는 부분적으로 특정될 수 있고, 컴파일러(408)는 전체적으로 또는 부분적으로 바이패스될 수 있다.
가상 명령어 변환기(410)는 가상 ISA 코드(410)를 타겟 ISA 코드(414)로 변환한다. 일부 실시예들에서, 타겟 ISA 코드(414)는 타겟 플랫폼(440)에 의해 직접 실행될 수 있는 코드이다. 예로서, 도 4에 점으로 된 박스들로서 나타낸 바와 같이, 일 실시예에서, 타겟 ISA 코드(414)는 PPU(122)의 명령어 유닛(430)에 의해 수신되어 정확하게 복호화될 수 있다. 타겟 플랫폼(440)의 상세들에 따라, 가상 ISA 코드(410)는 타겟 플랫폼(440)에서 n0 스레드들 각각에 의해 실행되는 스레드-당(per-thread) 코드로 변환될 수 있다. 대안적으로, 가상 ISA 코드(410)는 n0 보다 적은 스레드들로 실행될 프로그램 코드로 변환되며, 각 스레드는 하나보다 많은 CTA 스레드들과 관련된 프로세싱 태스크들을 포함한다.
일부 실시예들에서, CTA들 및/또는 그리드들의 차원들을 정의하는 것뿐만 아니라 입력 데이터 세트들 및 출력 데이터 세트들을 정의하는 것은, 가상 API에 의해 다루어진다. 애플리케이션 프로그램(402)은 가상 API 함수들의 라이브러리(404)로의 호출들을 포함할 수 있다. 일 실시예들에서, 가상 API의 사양(예를 들어, 함수 이름들, 입력들, 출력들 및 효과들을 포함하며, 이것들은 구현 상세들이 아님)이 프로그래머에게 제공되고, 프로그래머는 애플리케이션 프로그램(402)에 직접 가상 API 호출들을 통합하여, 가상 API 코드(406)를 직접 생성한다. 다른 실시예에서, 가상 API 코드(406)는 CTA들 및 그리드들을 정의하기 위해 일부 다른 신택스(syntax)를 이용하는 애플리케이션 프로그램(402)을 컴파일함으로써 생성된다.
가상 API 코드(406)는 가상 실행 드라이버(416)를 제공함으로써 부분적으로 실현되며, 가상 실행 드라이버(416)는 코드(406)의 가상 API 커맨드들을 타겟 플랫폼(440)에 의해 처리될 수 있는 타겟 API 커맨드들(418)로 변환한다. 예로서, 도 4에 점으로 된 박스들로서 나타낸 바와 같이, 일 실시예에서, 타겟 API 커맨드들(418)은 PPU 드라이버(432)에 의해 수신되어 처리될 수 있고, PPU 드라이버(432)는 PPU(122) 프론트 엔드(434)로 대응하는 커맨드들을 전달한다. (본 실시예에서, 가상 실행 드라이버(416)는 PPU 드라이버(432)의 일 양태 또는 일부분일 수 있다.) 다른 실시예에서, 가상 실행 드라이버는 코프로세서에 대한 드라이버에 대응하지 않을 수 있고, 가상 실행 드라이버는 단순히 가상 실행 드라이버를 구동하는 동일 프로세서에서 다른 프로그램들 또는 스레드들을 론칭하는 제어 프로그램일 수 있다.
가상 명령어 변환기(412) 및 가상 실행 드라이버(416)는 CTA 실행을 지원하는 것이 가능한 임의의 플랫폼 또는 아키텍처를 위해 생성될 수 있다는 것을 이해할 것이다. 상이한 플랫폼들 또는 아키텍처들에 대한 가상 명령어 변환기들(412)이 동일한 가상 ISA로부터 변환될 수 있는 범위까지, 동일한 가상 ISA 코드(410)는 임의의 플랫폼 또는 아키텍처와 이용될 수 있다. 따라서, 애플리케이션 프로그램(402)은 각 가능한 플랫폼 또는 아키텍처를 위해 재컴파일될 필요가 없다.
또한, 도 4에 나타낸 바와 같이, 타겟 플랫폼(440)이 PPU 및/또는 PPU 드라이버를 포함하는 것은 반드시 필요한 것이 아니다. 예로서, 하나의 대안적인 실시예에서, 타겟 플랫폼은 다수의 스레드들의 동시 실행을 에뮬레이트하기 위해 소프트웨어 기술들을 이용하는 CPU이고, 타겟 ISA 코드 및 타겟 API 커맨드들은, 예를 들어, 단일-코어 또는 다중-코어 CPU일 수 있는 타겟 CPU에 의해 실행되는 프로그램(또는 상호통신하는 프로그램들의 그룹)에서의 명령어들에 대응한다.
5. 가상 ISA 의 예
본 발명의 실시예에 따른 가상 ISA의 예가 지금 설명될 것이다. 상기 기재된 바와 같이, 가상 ISA는 유리하게는 상술된 가상 프로그래밍 모델(CTA들 및 그리 드들)에 대응한다. 따라서, 본 실시예에서, 컴파일러(408)에 의해 생성된 가상 ISA 코드(410)는 도 3의 가상 코어(308)의 가상 처리 엔진들(310) 중 하나에 의해 실행되는 단일 CTA 스레드의 거동을 정의하며, 그 거동은 동기화 및/또는 데이터 공유와 같은, 다른 CTA 스레드들과의 협력적인 상호작용들을 포함할 수 있다.
본 명세서에 기술된 가상 ISA는 단지 예시를 위한 것이고, 본 명세서에 기술된 특정 요소들 또는 요소들의 조합들이 본 발명의 범위를 제한하지 않는다는 것이 이해될 것이다. 일부 실시예들에서, 프로그래머는 가상 ISA로 코드를 기입할 수 있으며, 다른 실시예들에서, 프로그래머는 다른 고레벨 언어(예를 들어, 포트란, C, C++)로 코드를 기입할 수 있고, 컴파일러(408)는 가상 ISA 코드를 생성한다. 프로그래머는 고레벨 언어로 된 코드의 일부 부분들 및 가상 ISA로 기입된 다른 부분들을 갖는 "혼용(mixed)" 코드를 기입할 수도 있다.
5.1 특수 변수들
도 5는 예시적인 가상 ISA에 의해 정의된 "특수" 변수들을 나열한 표(500)이다(본 명세서에서 "%" 접두어는 특수 변수를 알리는 데 이용된다). 이러한 변수들은 도 2의 프로그래밍 모델과 관련되고, 여기서 각 스레드(204)는 CTA(202) 내에서의 그의 위치에 의해 식별되며, CTA(202)는 소정 수의 그리드들(200) 중 특정한 하나의 그리드 내에 있다. 일부 실시예들에서, 표(500)의 특수 변수들은 도 3의 가상 아키텍처(300)에서의 특수 레지스터들(311)에 대응한다.
표(500)에서, CTA들 및 그리드들이 3차원 공간에서 각각 정의되고, 상이한 그리드들이 1차원 공간에서 순차적으로 넘버링된다고 가정한다. 가상 ISA는 도 5 의 특수 변수들이 CTA가 론칭될 때 초기화될 것임을 예상하고, 가상 ISA 코드는 초기화없이 이러한 변수들을 간단하게 이용할 수 있다. 특수 변수들의 초기화는 가상 API를 참조하여 하기에 설명된다.
도 5에 나타낸 바와 같이, 특수 변수들의 제1의 3-벡터 %ntid=(%ntid.x, %ntid .y, %ntid .z)는 CTA의 (스레드들의 수에서의) 차원들을 정의한다. CTA의 모든 스레드들은 동일한 %ntid 벡터를 공유할 것이다. 가상 아키텍처(300)에서, %ntid 벡터에 대한 값들은 하기 기술된 바와 같이, CTA의 차원들을 확립하는 가상 API 함수 호출을 통하여 가상 프로세서(302)에 제공될 것임이 예상된다.
도 5에 나타낸 바와 같이, 특수 변수들의 제2의 3-벡터 %tid=(%tid .x, %tid.y, %tid .z)는 CTA내의 소정의 스레드의 스레드 ID를 일컫는다. 도 3의 가상 아키텍처(300)에서, 가상 프로세서(302)는 CTA의 각 스레드가 론칭될 때 제약들 0≤%tid .x<%ntid .x, 0≤%tid .y<%ntid .y 및 0≤%tid .z<%ntid .z를 만족하는 고유의 %tid 벡터를 할당할 것임이 예상된다. 일 실시예에서, %tid 벡터는 패킹된 32-비트 워드(예를 들어, %tid .x에 대해 16 비트, %tid .y에 대해 10 비트, %tid .z에 대해 6 비트)에 저장될 수 있도록 정의될 수 있다.
도 5에 나타낸 바와 같이, 특수 변수들의 제3의 3-벡터 %nctaid=(%nctaid.x, %nctaid .y, %nctaid .z)는 그리드의 (CTA들의 수에서의) 차원들을 정의한다. 도 3의 가상 아키텍처(300)에서, %nctaid 벡터에 대한 값들은 CTA들의 그리드의 차원들을 확립하는 가상 API 함수 호출들을 통해 가상 프로세 서(302)에 제공될 것임이 예상된다.
도 5에 나타낸 바와 같이, 특수 변수들의 제4의 3-벡터 %ctaid=(%ctaid.x, %ctaid .y, %ctaid .z)는 그리드 내의 소정의 CTA의 CTA ID를 일컫는다. 도 3의 가상 아키텍처(300)에서, CTA에 대해 제약들 0≤%ctaid .x<%nctaid .x, 0≤%ctaid .y<%nctaid .y 및 0≤%ctaid .z<%nctaid .z를 만족하는 고유의 %ctaid 벡터는 CTA가 론칭될 때 가상 프로세서(302)에 제공될 것임이 예상된다.
특수 변수들은 CTA가 속하는 그리드에 대해 그리드 식별자를 제공하는 스칼라 %gridid 변수도 포함한다. 도 3의 가상 아키텍처(300)에서, 현재의 CTA가 일부분인 그리드를 식별하기 위해 %gridid 값이 가상 프로세서(302)에 제공될 것임이 예상된다. %gridid 값은 유리하게는 예를 들어, 다수의 그리드들이 커다란 문제의 상이한 부분들을 해결하는데 이용될 때, 가상 ISA 코드에 이용된다.
5.2. 프로그램-정의된 변수들 및 가상 상태 공간들
가상 ISA는 프로그래머(또는 컴파일러)가 처리되는 데이터 아이템들을 나타내기 위해 임의 수의 변수들을 정의할 수 있게 한다. 변수는, 변수가 어떻게 이용되고 어떤 범위까지 공유되는지를 나타내는 타입 및 "가상 상태 공간"에 의해 정의된다. 변수들은 타겟 플랫폼에서 이용 가능한 레지스터들 또는 다른 메모리 구조들을 이용하여 실현되고, 많은 타겟 플랫폼들에서, 상태 공간은 특정 변수를 실현하는데 이용될 메모리 구조의 선택에 영향을 미칠 수 있다.
도 6은 예시적인 가상 ISA 실시예에서 지원되는 변수 타입들을 나열한 표(600)이다. 타입 없는 비트들(untyped bits), 부호 있는 정수(signed integer), 부호 없는 정수(unsigned integer), 및 부동-소수점과 같은 네 가지 타입들이 지원된다. 타입 없는 변수들은 단순히 단일 비트 또는 특정 길이의 비트들의 그룹들이다. 부호 있는 및 부호 없는 정수 포맷들뿐만 아니라 부동-소수점 포맷들은 종래 포맷들(예를 들어, IEEE 754 표준들)에 따라 정의될 수 있다.
본 실시예에서, 다수의 폭들이 각 타입에 대해 지원되며, 폭을 특정하기 위해 파라미터 <n>가 이용되며, 따라서, 예를 들어, .s16은 16 비트의 부호 있는 정수를 나타내고, .f32는 32 비트의 부동-소수점 수를 나타낸다. 표(600)에 나타낸 바와 같이, 일부 변수 타입들은 소정의 폭들로 제한되는데, 예로서, 부동-소수점 변수들은 적어도 16 비트여야 하고, 정수 타입들은 적어도 8 비트여야 한다. 가상 ISA의 실현이 특정된 폭들 모두를 지원할 것으로 예상되며, 프로세서의 데이터 경로들 및/또는 레지스터들이 가장 넓은 폭보다 좁다면, 다수의 레지스터들 및 프로세서 사이클들은 이 기술분야에 알려진 바와 같이 더 넓은 타입을 핸들링하는데 이용될 수 있다.
본 명세서에 이용된 데이터 타입들 및 폭들은 예시적인 것이며, 본 발명을 제한하는 것이 아님을 이해할 것이다.
도 7은 예시적인 가상 ISA에서 지원되는 가상 상태 공간들을 나열한 표이다. 도 3의 가상 아키텍처(300)에서의 상이한 공유 레벨들 및 가능한 저장 위치들에 대응하여 9개의 상태 공간들이 정의된다.
제1의 3개의 상태 공간들은 스레드 레벨에서 공유되고, 그것은 각 CTA 스레 드가 변수의 개별 인스턴스(instance)를 가질 것이고, 어떠한 CTA 스레드도 임의의 다른 CTA 스레드의 인스턴스로의 액세스를 갖지 않을 것이라는 것을 의미한다. 가상 레지스터(. reg) 상태 공간은 유리하게는 오퍼랜드(operand)들, 일시적인 값들, 및/또는 각 CTA 스레드에 의해 수행되는 계산(computation)의 결과를 정의하는 데 이용된다. 프로그램은 임의 수의 가상 레지스터들을 선언할 수 있다. 가상 레지스터들은 계산된 어드레스에 의해서가 아니라, 정적 컴파일-시간 이름에 의해서만 어드레스할 수 있다. 이러한 상태 공간은 도 3의 가상 아키텍처(300)에서의 로컬 가상 레지스터들(314)에 대응한다.
특수-레지스터(. sreg) 상태 공간은 도 5의 소정의 특수 변수들에 대응하고, 이 변수들은 가상 아키텍처(300)에서의 특수 레지스터들(311)에 저장된다. 일부 실시예들에서, 가상 ISA 코드는 . sreg 공간에서 임의의 다른 변수들을 선언하지 않을 수 있지만, 계산들에 대한 입력들로서 특수 변수들을 이용할 수 있다. 모든 CTA 스레드들은 . sreg 상태 공간에서 임의의 변수를 판독할 수 있다. %tid(또는 그의 컴포넌트들)에 대해, 각 CTA 스레드는 그의 고유한 스레드 식별자를 판독할 것이고, . sreg 상태 공간에서의 다른 변수들에 대해, 동일한 CTA에서의 모든 CTA 스레드들은 동일한 값들을 판독할 것이다.
스레드-당 로컬 메모리(.local) 변수들은 퍼-CTA-스레드 기초(per-CTA-thread basis)로 할당되고 어드레스되는 전역 메모리(304)의 영역에 대응한다. 다시 말해, CTA 스레드가 .local 변수를 액세스할 때, CTA 스레드는 변수의 그 자신의 인스턴스를 액세스하여, 하나의 CTA 스레드에서 이루어진 .local 변수로의 변화 들은 다른 CTA 스레드들에 영향을 미치지 않는다. . reg . sreg 상태 공간들과 다르게, 스레드-당 로컬 메모리는 계산된 어드레스들을 이용하여 어드레스될 수 있다.
다음 2개의 상태 공간들은 CTA-당 변수들을 정의하며, 이것은 각 CTA가 변수의 하나의 인스턴스를 가질 것이고, 그것은 그의 임의의 (가상) 스레드들에 의해 액세스될 수 있다는 것을 의미한다. 공유(.shared) 변수들은 임의의 CTA 스레드들에 의해 판독되거나 기입될 수 있다. 일부 실시예들에서, 이러한 상태 공간은 가상 아키텍처(300)(도 3)의 가상 공유 메모리(316)에 맵핑한다. 가상 아키텍처(300)의 실현에서, .shared 상태 공간은 온-칩 공유 메모리 구현(예를 들어, 공유 레지스터 파일 또는 공유 캐시 메모리)에 맵핑할 수 있고, 다른 실현들에서, .shared 상태 공간은 임의의 다른 전역 액세스 가능 메모리로서 할당되고 어드레스되는 오프-칩 메모리의 CTA-당 영역에 맵핑할 수 있다.
파라미터(. param) 변수들은 판독 전용(read-only)이고, CTA의 임의의 (가상) 스레드에 의해 판독될 수 있다. 이러한 상태 공간은 가상 아키텍처(300)의 파라미터 메모리(318)에 맵핑하며, 예를 들어, 온-칩 공유 파라미터 메모리 또는 캐시 메모리 또는 임의의 다른 전역 액세스 가능 메모리로서 할당되고 어드레스되는 전역 액세스 가능 오프-칩 메모리 영역에서 실현될 수 있다. 이러한 변수들은 가상 드라이버(320)로부터의 드라이버 커맨드들에 응답하여 초기화될 것임이 예상된다.
상수 (. const) 상태 공간은 그리드에서의 임의의 CTA에서의 임의의 (가상) 스레드에 의해 판독될 수 있는 (그러나 수정되지 않는) 그리드-당 상수들을 정의하 는데 이용된다. 가상 아키텍처(300)에서, . const 상태 공간은 CTA 스레드들이 판독 전용 액세스를 갖는 전역 메모리의 영역에 맵핑될 수 있다. . const 상태 공간은 온-칩 공유 파라미터 메모리 또는 캐시 메모리에서 또는 임의의 다른 전역 액세스 가능 메모리로서 할당되고 어드레스되는 전역 액세스 가능 오프-칩 메모리의 그리드-당 영역에서 실현될 수 있다. . param 상태 공간과 유사하게, . const 상태 공간에서의 변수들은 가상 드라이버(320)로부터의 드라이버 커맨드들에 응답하여 초기화될 것임이 예상된다.
남은 3개의 상태 공간들은, 애플리케이션과 연관된 임의의 CTA에서의 임의의 (가상) 스레드에 액세스가능한, "콘텍스트(context)" 변수들을 정의한다. 이러한 상태 공간들은 가상 아키텍처(300)에서의 전역 메모리(304)에 맵핑한다. 전역(.global) 변수들은 일반적인 목적들을 위해 이용될 수 있다. 일부 실시예들에서, 공유 텍스처(.tex) 및 표면들(.surf)에 대한 특정 상태 공간들도 정의될 수 있다. 예를 들어, 그래픽 관련 애플리케이션들에 대해 유용할 수 있는, 이러한 상태 공간들은 2-D (또는 일부 실시예들에서, 3-D) 어레이의 각 픽셀에 대응하는 데이터 값들을 제공하는 그래픽 텍스처 및 픽셀 표면 데이터 구조들에 대한 액세스를 정의하고 제공하는데 이용될 수 있다.
도 4의 가상 ISA 코드(410)에서, 변수들은 상태 공간, 타입 및 이름을 특정함으로써 선언된다. 이름은 위치 보유자(placeholder)이고, 프로그래머 또는 컴파일러에 의해 선택될 수 있다. 따라서, 예를 들어:
Figure 112008007153682-PAT00001
vrl로 이름지어진 가상 레지스터 상태 공간에서 32 비트의 타입 없는 변수를 선언한다. 가상 ISA 코드의 후속 라인들은 예를 들어, 연산을 위한 소스 또는 목적지로서 vrl을 가리킬 수 있다.
예시적인 가상 ISA는 가상 변수들의 어레이들 및 벡터들도 지원한다. 예를 들어:
Figure 112008007153682-PAT00002
는 32 비트 부동-소수점 수들의 가상 전역-액세스가능 1000-by-1000 어레이를 선언한다. 가상 명령어 변환기(412)는 할당된 상태 공간에 대응하는 어드레스가능한 메모리 영역들로 어레이들을 맵핑할 수 있다.
일 실시예에서, 벡터들은 벡터 접두어 .v<m>을 이용하여 정의될 수 있고, 여기서 m은 벡터의 컴포넌트들의 수이다. 예를 들어;
Figure 112008007153682-PAT00003
는 스레드-당 가상 레지스터 상태 공간에서의 32-비트 부동-소수점 수들의 3-컴포넌트 벡터를 선언한다. 벡터가 선언되면, 그의 컴포넌트들은 예를 들어, vpos.x, vpos .y, vpos .z인 접미어들을 이용하여 식별될 수 있다. 일 실시예에서, m=2, 3 또는 4가 허여되고, (.x, .y, .z, .w), (.0, .1, .2, .3), 또는 (.r, .g, .b, .a)와 같은 접미어들이 컴포넌트들을 식별하는데 이용된다.
변수들이 가상이므로, 가상 ISA 코드(410)는 (변수들이 미리 정의된 . sreg를 제외하고) 임의의 상태 공간들에서의 임의 수의 변수들을 정의하거나 일컬을 수 있 다. 가상 ISA 코드(410)에서의 특정 상태 공간에 대해 정의된 변수들의 수는 특정 하드웨어 구현에서 대응하는 타입의 저장량을 초과할 수 있다는 것이 가능하다. 가상 명령어 변환기(412)는 유리하게는 (예를 들어, 레지스터들과 오프-칩 메모리 사이의 데이터를 이동시키는) 적당한 저장 관리 명령어들을 포함하도록 구성되어, 필요할 때 변수들이 이용가능하도록 한다. 가상 명령어 변환기(412)는, 임시 변수가 더 이상 필요하지 않고 그의 할당된 공간이 다른 변수에 의해 재이용될 수 있게 하는 경우를 검출할 수도 있으며, 레지스터들을 할당하기 위한 종래의 컴파일러 기술들이 이용될 수 있다.
부가적으로, 예시적인 가상 ISA가 벡터 변수 타입들을 정의하지만, 타겟 플랫폼이 벡터 변수들을 지원하는 것은 요구되지 않는다. 가상 명령어 변환기(412)는 적정 수(예를 들어, 2, 3, 또는 4)의 스칼라들의 집합으로서 임의의 벡터 변수를 구현할 수 있다.
5.3 가상 명령어들
도 8a 내지 도 8h는 예시적인 가상 ISA에서 정의된 가상 명령어들을 나열한 표들이다. 명령어는 예를 들어, 하나 이상의 오퍼랜드들을 이용한 특정 결과를 계산하여 그 결과를 목적지 레지스터에 위치시키고, 레지스터 값을 설정하는 등의 효과에 의해 정의된다. 대부분의 가상 명령어들은 입력들 및/또는 출력들의 포맷을 식별하는 타입으로 되어 있고, 명령어 실행의 양태들은 그 타입에 의존적일 수 있다. 일반적인 명령어의 포맷은,
Figure 112008007153682-PAT00004
이고, 여기서, name은 명령어 이름이고, <type>은 도 6에 나열된 임의의 타입들에 대한 위치 보유자이고, result는 결과가 저장되는 변수이고, operands는 명령어에 대한 입력들로서 제공되는 하나 이상의 변수들이다. 일 실시예에서, 가상 아키텍처(300)는 레지스터-대-레지스터 프로세서(register-to-register processor)이고, 메모리 액세스(도 8f) 이외 연산들을 위한 resultoperands는 가상 레지스터 상태 공간 . reg (또는 일부 오퍼랜드들의 경우에 특수 레지스터 상태 공간 .sreg)에서의 변수들일 것이 요구된다.
타겟 플랫폼이 가상 ISA에서의 각 명령어들을 실현하는 것이 예상된다. 명령어는, ("하드웨어 지원"으로서 명세서에 언급된) 특수 효과를 발생시키는, 대응하는 머신 명령어로서, 또는 실행될 때, ("소프트웨어 지원"으로서 명세서에 언급된) 특정 효과를 발생시키는 머신 명령어들의 시퀀스로서 실현될 수 있다. 특정 타겟 플랫폼에 대한 가상 명령어 변환기(412)는 유리하게는 각 가상 명령어에 대응하는 머신 명령어 또는 머신 명령어 시퀀스를 식별하도록 구성된다.
다음의 서브섹션들은 도 8a 내지 도 8h에 나열된 다수의 명령어 클래스들을 설명한다. 명세서에 제시된 명령어들의 목록은 예시적인 것이고, 가상 ISA는 본 명세서에 명시적으로 기재되지 않은 추가 명령어들을 포함할 수 있으며, 본 명세서에 기재된 명령어들의 일부 또는 전부를 배제할 수 있다는 것이 이해될 것이다.
5.3.1. 가상 명령어들 - 산술(arithmetic)
도 8a는 예시적인 가상 ISA에서 정의된 산술 연산을 나열한 표(800)이다. 본 실시예에서, 가상 아키텍처는 레지스터-대-레지스터 연산만을 지원하고, 모든 산술 연산들은 (도 8a에서 a, b, c로서 나타낸) 하나 이상의 가상 레지스터 오퍼랜드들을 조작하여 가상 레지스터에 기입된 결과(d)를 발생시킨다. 따라서, (특수 레지스터 상태 공간 . sreg에서) 도 5의 특수 레지스터들이 오퍼랜드로서 이용될 수 있다는 것을 제외하고, 산술 연산들에 대한 오퍼랜드들 및 목적지들은 항상 가상 레지스터 상태 공간 . reg에 있다.
표(800)의 산술 연산의 목록은 4개의 기본적인 산술 연산들인, 더하기(add), 빼기(sub), 곱하기(mul) 및 나누기(div)를 포함한다. 이러한 연산은 모든 정수 및 부동-소수점 데이터 타입들에 대해 수행될 수 있고, 그 입력들로서 동일한 타입의 결과를 발생시키며, 일부 실시예들에서, 프로그래머가 그 결과가 어떻게 라운드(round)되는지 및 정수 오퍼랜드들의 경우에, 포화 한계들이 부과되어야 하는지 여부를 특정할 수 있게 하는 명령어에 라운딩-모드 한정자(qualifier)가 추가될 수도 있다.
오퍼랜드들 a, bc을 갖는 3개의 복합 산술 연산들도 지원되는데, 곱하기-더하기(mad), 연합된 곱하기-더하기(fma), 및 절대 차의 합(sad)이 있다. 곱하기-더하기는 (괄호로 나타낸, 라운딩으로) 곱 a*b를 계산하여 그 결과에 c를 더한다. 연합된 곱하기-더하기는 곱 a*b가 c를 더하기 이전에 라운드되지 않는다는 점에서 mad와 상이하다. 절대 차의 합은 절대값 │a-b│를 계산한 후 c를 더한다.
나머지(rem) 연산은 정수 오퍼랜드들에 대해서만 수행되고, 오퍼랜드 a가 오퍼랜드 b로 나누어질 때 나머지(a mod b)를 계산한다. 절대값(abs) 및 부정(negation)(neg)은 부동-소수점 또는 부호 있는 정수 포맷에서의 오퍼랜드 a에 적용될 수 있는 단항의(unary) 연산들이다. 정수 또는 부동-소수점 오퍼랜드들에 적용될 수 있는 최소(min) 및 최대(max) 연산들은 더 작은 오퍼랜드 또는 더 큰 오퍼랜드로 목적지 레지스터를 설정하며, 하나 또는 두 오퍼랜드가 (예를 들어, IEEE 754 표준들에 따른) 비-정규 수(non-normal number)인 특수한 경우들을 다루는 것도 또한 특정될 수 있다.
표(800)의 남아있는 연산들은 부동-소수점 타입들에 대해서만 수행된다. 소수부(fraction)(frc) 연산은 그 입력의 소수 부분을 되돌린다. 사인(sin), 코사인(cos) 및 아크탄젠트 비(atan2)는 삼각 함수들에 대응하는 편리한 명령어들을 제공한다. 베이스-2(base-2) 대수(logarithm)(lg2) 및 누승법(exponentiation)(ex2)도 지원된다. 가역(reciprocal)(rcp), 제곱근(sqrt) 및 가역 제곱근(rsqrt)도 지원된다.
이러한 산술 연산들의 목록은 예시적인 것이며, 본 발명을 제한하는 것이 아님에 주목해야 한다. 충분한 빈도로 호출(invoke)될 것으로 기대되는 임의의 연산들을 포함하는, 다른 연산들 및 연산들의 조합들이 지원될 수 있다.
일부 실시예들에서, 가상 ISA는 또한 벡터 연산들을 정의한다. 도 8b는 예시적인 가상 ISA에 의해 지원되는 벡터 연산들을 나열한 표(810)이다. 벡터 연산들은 오퍼랜드 벡터들 a 및 b의 스칼라 내적(scalar dot-product) d를 계산하는 내적(dot) 연산; 오퍼랜드 벡터들 a 및 b의 벡터 외적(vector cross-product) d를 계산하는 외적(cross) 연산; 및 오퍼랜드 벡터 a의 스칼라 길이 d를 계산하는 크기(mag) 연산을 포함한다. 벡터 환산(vector reduction)(vred) 연산은 벡터 오퍼 랜드 a의 요소들에 걸쳐서 반복적으로 지정 연산 <op>을 수행함으로써 스칼라 결과 d를 계산한다. 일 실시예에서, 환원 연산들 add, mul, minmax만이 부동 소수점 벡터들에 대해 지원되며, 정수 벡터들에 대해, 부가 환산 연산(예를 들어, 하기 기술된 바와 같은, and, orxor)이 또한 지원된다.
이러한 연산들 이외에, (도 8b에 나열되지 않은) 벡터 덧셈, 벡터 스케일링(vector scaling) 등과 같은 다른 벡터 연산들도 가상 ISA에 정의될 수 있다.
상기 주목된 바와 같이, 가상 아키텍처(300)의 일부 하드웨어 실현들은 벡터 프로세싱을 지원하지 않을 수 있다. 그러한 실현들에 대한 가상 명령어 변환기(412)는 유리하게는 이러한 연산들을 수행하기 위해 스칼라 머신 명령어들의 적절한 시퀀스들을 생성하도록 구성되며, 본 기술분야의 당업자들은 적절한 시퀀스들을 결정할 수 있을 것이다.
5.3.2. 가상 명령어들 - 선택 및 설정-레지스터
도 8c는 예시적인 가상 ISA에서 정의된 선택 및 설정-레지스터 연산들을 나열한 표(820)이다. 임의의 숫자식 데이터 타입에 대해 수행될 수 있는 이러한 연산들은 비교 연산의 결과(outcome)에 기초하여 목적지 레지스터를 설정한다. 기본적인 선택(sel) 연산은 c가 0이 아니라면, 오퍼랜드 a를, c가 0이라면, 오퍼랜드 b를 선택한다. 비교 및 설정(set)은 오퍼랜드 a b에 대해 비교 연산 <cmp>를 수행하여 비교 결과 t를 생성하고, 그 후, 비교 결과 t가 참(~0) 또는 거짓(0)인지 여부에 기초하여 부울(boolean) 참(~0) 또는 거짓(0)으로 목적지 레지스터 d를 설정한다. 일 실시예에서, 허여된 비교 연산들 <cmp>은, 동등(a=b 라면, t는 참), 초과(a>b 라면, t는 참), 미만(a<b 라면, t는 참), 이상(a≥b 라면, t는 참), 이하(a≤b 라면, t는 참), 및 예를 들어, a 및/또는 b가 숫자식 또는 미정(undefined) 값들인지 여부를 포함하는 다른 비교들을 포함한다.
setb 연산은 비교 연산 <cmp>의 결과 t와 제3 오퍼랜드 c 사이에서 추가 부울 연산 <bop>을 수행하는 비교-및-설정에 대한 변형이며, 부울 연산 t <bop> c의 결과는 목적지 레지스터 d가 부울 참 또는 거짓으로 설정되는지 여부를 결정한다. 일 실시예에서, 허여된 부울 연산들 <bop>은 and, orxor를 포함한다(하기 기재된 도 8c를 참조). setp 연산은 2개의 1-비트 "술어(predicate)" 목적지 레지스터들이 설정되는 것을 제외하고는, setb와 유사한데, 목적지 레지스터 d1은 t <bop> c의 결과로 설정되고, 목적지 레지스터 d2는 (!t) <bop> c의 결과로 설정된다.
5.3.3. 가상 명령어들 - 논리 및 비트 조작
도 8d는 예시적인 가상 ISA에서 정의된 논리 및 비트-조작 연산들을 나열한 표(830)이다. 비트의 부울 연산들 and, orxor 는 오퍼랜드들 ab의 각 비트에 대해 특정 연산을 수행하고 레지스터 d에서의 대응하는 비트를 그 결과에 설정함으로써 수행된다. 비트의 부정(not) 연산은 오퍼랜드 a의 각 비트를 반전시키고, 논리 부정(cnot) 연산은 a가 0(부울 거짓)이면 목적지 레지스터를 1(부울 참)로 설정하고, 그렇지 않으면 0(부울 거짓)으로 설정한다.
비트-시프팅(bit-shifting)은 오퍼랜드 a에서의 비트 필드를 오퍼랜드 b에 의해 특정된 비트들의 수만큼 좌로 또는 우로 시프트하는 좌-시프트(shl) 및 우-시프트(shr)에 의해 지원된다. 부호 있는 포맷들에 대해, 우-시프트는 유리하게는 부호 있는 비트에 기초하여 선두(leading) 비트를 채우고, 부호 없는 포맷들에 대해, 우-시프트는 0으로 선두 비트들을 채운다.
5.3.4. 가상 명령어들 - 포맷 전환
도 8e는 예시적인 가상 ISA에서 정의된 포맷 전환 연산들을 나열한 표(840)이다. 포맷 전환(cvt) 명령어는 제1 타입 <atype>의 오퍼랜드 a를 타겟 타입 <dtype>에서의 동등한 값으로 전환하여 목적지 레지스터 d에 그 결과를 저장한다. 일 실시예에서, 유효 타입이 도 6에 나열되는데, 타입 없는 값들(.b<n>)은 정수 또는 부동-소수점 타입들로 또는 그 타입들로부터 전환되지 않을 수 있다. 포맷 전환 명령어의 변형은 프로그래머가 라운딩 모드 <mode>를 특정할 수 있게 하고, 타겟 타입으로 표현될 때 포화하는(saturate) 수들을 핸들링하는 것이 또한 특정될 수 있다.
5.3.5. 가상 명령어들 - 데이터 이동 및 데이터 공유
도 8f는 예제의 가상 ISA에서 정의된 데이터 이동 및 데이터 공유를 나열한 표(850)이다. 이동(mov) 연산은 목적지 레지스터 d를 즉시(immediate) 오퍼랜드 a의 값으로 설정하거나, 또는 오퍼랜드 a가 레지스터이면, 레지스터 a의 내용으로 설정한다. 이동 연산은 가상 레지스터-타입 상태 공간들, 예를 들어, 도 7의 . reg. sreg로 제한될 수 있다.
로드(ld) 명령어는 메모리의 소스 위치로부터의 값을, 일 실시예에서 가상 레지스터 (. reg) 상태 공간에 있어야 하는, 목적지 레지스터 d로 로드한다. .<space> 한정자는 소스 위치의 상태 공간을 특정하고, 도 7의 어드레스 가능한 상태 공간들, 예를 들어, (이동 연산이 대신 이용될 수 있는) . reg. sreg 이외의 공간들로 제한될 수 있다. 본 실시예의 가상 아키텍처(300)는 레지스터-대-레지스터 프로세서이기 때문에, 로드 명령어는 유리하게는 어드레스가능한 상태 공간들로부터의 변수들을 가상 레지스터 . reg 상태 공간으로 변환하는데 이용될 수 있어, 그들은 오퍼랜드들로서 이용될 수 있다.
특정 소스 위치는 상이한 어드레싱 모드들을 지원하는 다양한 방법들로 정의될 수 있는 소스 파라미터 <src>를 이용하여 식별된다. 예로서, 일부 실시예들에서, 소스 파라미터 <src>는 값이 d에 저장될 명명된(named) 어드레스 가능한 변수, 소스 어드레스를 유지하는 레지스터에 대한 참조(reference), (즉시 오퍼랜드로서 제공되는) 오프셋 값에 추가되는 어드레스를 유지하는 레지스터에 대한 참조, 또는 즉시 절대 어드레스 중 임의의 하나일 수 있다.
유사하게, 저장 (st) 연산은 소스 레지스터 a에서의 값을 목적지 파라미터 <dst>에 의해 식별된 메모리 위치로 저장한다. 일 실시예의 소스 레지스터 a. reg 상태 공간에 있어야 하며, 목적지는 기입가능하고 어드레스 가능한 상태 공간(예를 들어, 도 7의 .local, .global, 또는 .shared)에 있어야 한다. 목적지 파라미터 <dst>는 로드 명령어의 소스 파라미터 <src>와 유사하게, 상이한 어드레싱 모드들을 지원하는 다양한 방법들로 정의될 수 있다. 저장 명령어는 예를 들어, 레지스터로부터의 연산 결과를 어드레스가능한 상태 공간으로 변환하는데 이용될 수 있다.
텍스처 및 표면 상태 공간들이 제공되는 실시예들에서, 부가적인 가상 명령 어들은 텍스처 메모리 상태 공간(tex)으로부터 판독하고 (suld)로부터 판독하고, (sust)를 표면 메모리 상태 공간에 기입하는데 이용될 수 있다. 텍스처 판독을 위한 오퍼랜드들(t, x, y)은 텍스처 식별자(t) 및 좌표들(x, y)을 특정하고; 유사하게, 표면 판독 또는 기입을 위한 오퍼랜드들(s, x, y)은 표면 식별자(s) 및 좌표들(x, y)을 특정한다.
CTA 스레드는 데이터를 다른 CTA 스레드들과 공유함으로써 다른 CTA 스레드들과 협력할 수 있다. 예로서, CTA 내의 데이터를 공유하기 위해, CTA 스레드들은 CTA-당 가상 상태 공간들에 데이터를 기입하고 CTA-당 가상 상태 공간들로부터 데이터를 판독하기 위해, 로드 및 저장 가상 명령어들(뿐만 아니라, 하기 기술된 원자-갱신 명령어)을 이용할 수 있다. 따라서, 하나의 CTA 스레드는 적절하게 정의된 목적지 어드레스를 갖는 st.shared 명령어를 이용하여 .shared 상태 공간에 데이터를 기입할 수 있으며, 동일 CTA 내의 다른 CTA 스레드는 ld.shared 명령어에서 동일 어드레스를 이용함으로써 데이터를 후속하여 판독할 수 있다. 하기 기술된 동기화 명령어들(예를 들어, barmembar)은, 예를 들어, 데이터-소비(data-consuming) CTA 스레드가 데이터를 판독하기 전에 데이터-생성(data-producing) CTA 스레드가 데이터를 기입하는 CTA 스레드들에 걸쳐서 데이터-공유 연산들의 적정 시퀀스를 보장하는데 이용될 수 있다. 유사하게, st.globalld.global 명령어들은 동일 CTA의 CTA 스레드들, 동일 그리드의 CTA들, 및/또는 동일 애플리케이션에서의 상이한 그리드들 사이에 데이터를 협력 및 공유하는데 이용될 수 있다.
5.3.6. 가상 명령어들 - 프로그램 제어
도 8g는 예시적인 가상 ISA에 제공된 프로그램 제어 연산들을 나열한 표(860)이다. 이 제어 연산들은, 이 기술분야의 당업자들에게 친숙할 것이고, 프로그래머가 프로그램 실행 방향을 바꿀 수 있게 한다. 분기(bra)는 프로그램 흐름을 타겟 위치 <target>로 바꾼다. 일부 실시예들에서, 가상 ISA 코드 내의 타겟 명령어의 앞에 영숫자 라벨을 배치하고 그 라벨을 분기 명령어의 타겟 식별자 <target>로서 이용하는 것에 의해 분기 타겟이 정의된다. 예를 들어, 일 실시예에서,
Figure 112008007153682-PAT00005
는 라벨 label에 의해 분기 타겟으로서 add 명령어를 식별한다. 코드 내의 다른 곳의 다음의 명령어는 라벨된 명령어로 실행을 바꾼다.
Figure 112008007153682-PAT00006
call 및 리턴(ret) 명령어들은 함수 및 서브루틴 호출을 지원하며, fname는 함수 또는 서브루틴을 식별한다. (일 실시예에서, "서브루틴"은 간단히 리턴 값이 무시되는 함수이다.) 함수 fname는 .func 지시어를 이용하여 선언될 수 있으며, 함수를 정의하는 가상 ISA 코드가 또한 제공될 수 있다. 중괄호 { } 또는 다른 그룹화 기호(grouping symbol)들을 이용하여 다른 가상 ISA 코드로부터 함수 또는 서브루틴을 정의하는 코드를 분리할 수 있다.
함수들에 대하여, 리턴 값(들)이 저장되어야 하는 곳을 식별하기 위해 파라미터 목록 <rv>가 특정될 수 있다. 함수들과 서브루틴들 둘다에 대하여, 입력 인수들이 인수 목록 <args>에 특정된다. call이 실행될 때, 다음 명령어의 어드레스 가 저장되고, ret가 실행될 때, 저장된 어드레스로의 분기가 취해진다.
exit 명령어는 그것을 만나는 CTA 스레드를 종료한다. 트랩 명령어는 프로세서 정의 또는 사용자 정의 트랩 루틴을 호출한다. 브레이크포인트(brkpt) 명령어는 실행을 일시정지하며, 예를 들어 디버깅 목적으로 유용하다. 무-연산(nop)은 실행될 때 어떠한 효과도 갖지 않는 명령어이다. 무-연산은 예를 들어, 언제쯤 다음 연산이 실행될 수 있는지를 제어하기 위해 사용될 수 있다.
5.3.7. 가상 명령어들 - 병렬 스레드들
도 8h는 본 발명의 실시예에 따른 예시적인 가상 ISA에 제공되는 명시적인 병렬 가상 명령어들을 나열한 표(870)이다. 이 명령어들은 CTA 스레드들 사이에 데이터를 교환하는 것과 같은, CTA 실행에 바람직한 협력 스레드 거동을 지원한다.
배리어(bar) 명령어는, 그것에 도달하는 CTA 스레드가 (동일 CTA 내의) 모든 다른 CTA 스레드들이 또한 동일한 배리어 명령어에 도달할 때까지 임의의 추가 명령어들을 실행하기 전에 대기해야 한다는 것을 나타낸다. 임의의 수의 배리어 명령어들이 CTA 프로그램에서 사용될 수 있다. 일 실시예에서, 임의의 스레드가 (n+1)번째 배리어에 선행할 수 있기 전에 모든 CTA 스레드가 n번째 배리어에 도달해야 하기 때문에, 배리어 명령어는 (배리어들이 얼마나 이용되는지에 관계없이) 어떠한 파라미터도 요구하지 않는다.
다른 실시예들에서, 배리어 명령어는 예를 들어, 특정 배리어에서 대기해야 하는 CTA 스레드들(또는 특정 CTA 스레드들의 식별자들)의 수를 특정하는 것에 의해 파라미터화(parameterize)될 수 있다.
또 다른 실시예들은 "대기" 및 "비-대기(non-waiting)" 배리어 명령어들을 둘다 제공한다. 대기 배리어 명령어에서, CTA 스레드는 다른 관련 CTA 스레드들이 또한 배리어에 도달할 때까지 대기하며, 비-대기 명령어에서, CTA 스레드는 CTA 스레드가 도착하였지만 다른 CTA 스레드가 도착하기 전에 계속할 수 있다는 것을 나타낸다. 주어진 배리어에서, 일부 CTA 스레드들은 다른 CTA 스레드들이 비-대기인 동안에 대기일 수 있다.
일부 실시예들에서, bar 가상 명령어는 공유 메모리 상태 공간들을 이용하여 데이터를 협력 또는 공유하고 있는 CTA 스레드들을 동기화하는 데 이용될 수 있다. 예를 들어, (CTA의 일부 또는 전부의 스레드를 포함할 수 있는) CTA 스레드들의 세트 각각은 스레드-당 변수(예를 들어, .fp32 가상 레지스터 변수 myData)에 어떤 데이터를 생성하고, 그 다음에 그 세트 내의 다른 CTA 스레드에 의해 생성된 데이터를 판독한다는 것을 가정한다. 명령어들의 시퀀스,
Figure 112008007153682-PAT00007
는, myWriteAddress myReadAddress가 .shared 상태 공간 내의 어드레스들에 대응하는 스레드-당 변수들인 경우, 원하는 거동을 제공한다. 각각의 CTA 스레드가 그 생성된 데이터를 공유 메모리에 기입한 후에, 각각의 CTA 스레드는 모든 CTA 스레드들이 그 데이터를 저장할 때까지 대기하고, 그 다음에 공유 메모리로부터 (상이한 CTA 스레드에 의해 기입될 수 있는) 데이터의 판독을 진행한다.
메모리 배리어(membar) 명령어는, 각각의 CTA 스레드가 완료하기 위해 그의 이전에 요구된 메모리 연산들(또는 적어도 모든 기입 연산들)을 대기해야 한다는 것을 나타낸다. 이 명령어는 membar 명령어 후에 일어나는 메모리 액세스가 그 이전에 임의의 기입 연산의 결과를 알아볼 것임을 보증한다. 일 실시예에서의 membar 명령어는, 메모리 상태 공간(예를 들어, .reg 또는 .sreg 상태 공간들이 아님)이어야 하는, 특정된 상태 공간을 타겟으로 하는 메모리 연산들로 그 범위를 제한하기 위해 선택적인 상태 공간 이름 <space>을 이용한다. 어떠한 상태 공간 이름도 특정되지 않았다면, CTA 스레드는 완료하기 위해 모든 메모리 상태 공간들을 타겟으로 하는 모든 계류중인 연산들을 대기한다.
원자적-갱신(atomic-update)(atom) 명령어는, 참조 <ref>에 의해 식별되는 공유 변수 a에 대한 원자적 갱신(판독-수정-기입)을 일으킨다. 공유 변수 a는 임의의 공유 상태 공간에 있을 수 있고, 다른 메모리 참조들과 같이, 다양한 어드레싱(addressing) 모드가 사용될 수 있다. 예를 들어, <ref>는 명명된 어드레스 가능 변수 a, 변수 a의 어드레스를 유지하는 레지스터에 대한 참조, 변수 a를 배치하기 위해 오프셋 값(즉시 오퍼랜드(immediate operand)로서 공급됨)에 추가될 어드레스를 유지하는 레지스터에 대한 참조, 또는 변수 a의 즉시 절대 어드레스(immediate absolute address) 중 임의의 것일 수 있다. CTA 스레드는 공유 상태 공간 위치로부터 목적지 레지스터 d로 변수 a를 로드하고, 그 다음에 오퍼랜드 a 및 (그 연산에 따라) 제2 및 제3 오퍼랜드들 b,c에 대해 수행되는 특정 연산 <op>을 이용하여 변수 a를 갱신하며, 그 결과는 <ref>에 의해 식별된 위치에 저장 된다. 목적지 레지스터 d는 원래 로드된 값 a를 유지한다. 로드, 갱신 및 저장 연산들은 원자적으로 수행됨으로써, 제1 CTA 스레드가 원자적 갱신을 실행하고 있는 동안에 어떤 다른 CTA 스레드도 변수 a를 액세스하지 않는다는 것을 보증한다. 일 실시예에서, 변수 a는 .global 또는 .shared 상태 공간으로 한정되며, 전술한 로드 및 저장 연산들에 대하여 동일한 방식으로 특정될 수 있다.
일부 실시예들에서, 특정 연산들만이 원자적 갱신들로서 수행될 수 있다. 예를 들어, 일 실시예에서, a가 부동 소수점 타입인 경우에 다음의 연산들 <op>, 즉, a를 b에 추가; a를 a와 b의 최소 또는 최대로 치환; 및 a가 b와 같으면 a를 c로 치환하고, 그렇지 않으면 a를 변경되지 않은 채로 두는, 3진 비교-및-스왑 연산(ternary compare-and-swap operation)만이 특정될 수 있다. 정수 a에 대하여, 예를 들어, 오퍼랜드 a 및 b 사이의 비트의 and, or 및 xor, 그리고 오퍼랜드 a를 증분하거나 감분하는 것과 같은 추가적인 연산들이 지원될 수 있다. 다른 원자적 연산들 또는 연산들의 조합들이 또한 지원될 수 있다.
vote 명령어는 CTA 스레드들의 미리 정의된 그룹에 대해 부울(boolean)(예를 들어, 타입 .bl) 오퍼랜드 a에 대한 환산(reduction) 연산 <op>을 수행한다. 일 실시예에서, 가상 아키텍처는, CTA 스레드들이 SIMD 그룹들에서 실행되고, 미리 정의된 그룹은 SIMD 그룹에 대응한다는 것을 특정하고, 다른 실시예들에서, CTA 스레드들의 다른 그룹들은 가상 아키텍처 또는 프로그래머에 의해 정의될 수 있다. 환산 연산 <op>은 그룹 내의 CTA 스레드들에 대해 오퍼랜드 a의 환산 및 .<op> 한정자에 의해 특정된 환산 연산에 기초하여 결과 값 d를 부울 참 또는 거짓 상태로 설 정하는 것을 수반한다. 일 실시예에서, 허용된 환산 연산들에는, (1) .all (그룹 내의 모든 CTA 스레드들에 대해 a가 참이면 d는 참이고, 그렇지 않으면 거짓임) (2) .any (그룹 내의 임의의 CTA 스레드에 대해 a가 참이면 d는 참임) 및 (3) .uni (그룹 내의 모든 액티브 CTA 스레드들에 대해 a가 동일 값(참 또는 거짓)을 가지면 d는 참임)이 있다.
5.3.8. 가상 명령어들 - 술어 실행
일부 실시예들에서, 가상 ISA는 임의의 명령어에 의한 술어 실행(predicated execution)을 지원한다. 술어 실행에서, 부울 "가드 술어(guard predicate)" 값이 그 명령어와 연관되고, 그 명령어는 실행시에 가드 술어가 참으로서 평가하는 경우에만 실행한다.
예시적인 가상 ISA에서, 가드 술어는 임의의 1-비트 부울 가상 레지스터 변수(본원에서는 P로 표시됨)일 수 있다. 술어 실행은 명령어의 조작부호 전에 술어 가드 @P 또는 비-술어 가드 @!P를 배치하는 것에 의해 표시된다. 예를 들어, 표(820)(도 8c)의 setp 명령어와 같은, 부울 결과를 생성하는 명령어에 대해 목적지 레지스터로서 P를 식별하는 것에 의해, 술어 레지스터에 값이 확립된다. @P 또는 @!P 가드 술어를 만나면, 가상 프로세서는 P 레지스터를 판독한다. @P 가드의 경우, P가 참이면 명령어는 실행되고, 그렇지 않으면 명령어는 스킵되며, @!P 가드의 경우, P가 거짓이면 명령어는 실행되고, 그렇지 않으면 명령어는 스킵된다. 술어 P는 술어 명령어를 만나는 각각의 CTA-스레드에 대해 실행 시간에 평가되며, 따라서, 일부 CTA 스레드들은 다른 CTA 스레드들이 실행하지 않는 동안 술어 명령어 를 실행한다.
일부 실시예들에서, 술어들은 명령어들이 실행될 때 설정될 수 있다. 예를 들어, 표들(800-870)(도 8a 내지 도 8h) 내의 가상 명령어들 중 어떤 것은 출력으로서 술어 레지스터를 특정하는 파라미터를 수락할 수 있고, 이러한 명령어들은 명령어 결과의 일부 속성에 기초하여 특정된 술어 레지스터를 갱신한다. 예를 들어, 술어 레지스터는, 산술 연산의 결과가 특수한 수(예를 들어, IEEE 754 부동 소수점 연산들에서의 0, 무한대 또는 NaN(not-a-number))인지 등을 나타내는 데 이용될 수 있다.
6. 가상 명령어 변환기
도 4를 참조하여 전술한 바와 같이, 가상 명령어 변환기(412)는 특정 플랫폼 아키텍처를 타겟으로 한다. 예를 들어, 도 1의 CPU(102)와 같은 프로세서 상에서 실행하는 소프트웨어 프로그램으로서 구현될 수 있는 가상 명령어 변환기(412)는, 가상 ISA 코드(410)를 수신하고, 그것을 (예를 들어, 도 1의 PPU(122)에 의해) 가상 명령어 변환기(412)가 타겟으로 하는 특정 플랫폼 아키텍처 상에서 실행될 수 있는 타겟 ISA 코드(414)로 변환한다. 가상 명령어 변환기(412)는 프로세서 레지스터들, 온-칩 메모리, 오프-칩 메모리 등을 포함하는 가용 저장 위치들로 가상 ISA 코드(410)에 선언된 가상 변수들을 맵핑한다. 일부 실시예들에서, 가상 명령어 변환기(412)는 가상 상태 공간들 각각을 특정 유형의 저장소에 맵핑한다. 예를 들어, .reg 상태 공간은 스레드-특정 데이터 레지스터들에 맵핑될 수 있고, .shared 상태 공간은 프로세서의 공유가능한 메모리에 맵핑될 수 있 고, .global 상태 공간은 애플리케이션 프로그램에 할당된 가상 메모리의 영역에 맵핑될 수 있다. 다른 맵핑들이 또한 가능하다.
가상 ISA 코드(410)의 가상 명령어들은 머신 명령어들로 변환된다. 일 실시예에서, 가상 명령어 변환기(412)는, 대응하는 머신 명령어가 CTA 스레드들을 실행할 프로세서의 명령어 세트에 존재하는지 여부에 따라, 각각의 가상 ISA 명령어를 대응하는 머신 명령어 또는 머신 명령어들의 시퀀스에 맵핑하도록 구성된다.
가상 명령어 변환기(412)는 또한 타겟 플랫폼 아키텍처에서 CTA 스레드들을 "물리" 스레드들 또는 프로세스들에 맵핑한다. 예를 들어, 타겟 플랫폼 아키텍처가 적어도 n0 동시 스레드들을 지원하는 경우, 각각의 CTA 스레드는 하나의 물리 스레드에 맵핑될 수 있고, 가상 명령어 변환기(412)는 타겟 플랫폼(440)이 n0 고유 식별자들을 갖는 n0 스레드들에 대해 코드를 실행할 것이라고 예측하여 단일 CTA 스레드에 대한 가상 명령어 코드를 생성할 수 있다. 타겟 플랫폼 아키텍처가 n0 스레드들보다 적은 스레드를 지원하는 경우, 가상 명령어 변환기(412)는 이 코드가 CTA마다 한번 실행될 것이라고 예측하여 다수의 CTA 스레드들에 대응하는 명령어들을 통합하는 가상 ISA 코드(410)를 생성함으로써, 다수의 CTA 스레드들을 단일 물리 스레드 또는 프로세스에 맵핑할 수 있다.
특히, 데이터 공유에 관한 가상 명령어들(예를 들어, .shared 또는 .global 상태 공간을 액세스하는 로드 저장 및 원자적-갱신 명령어들) 및/또는 협력 스레드 거동에 관한 가상 명령어들(예를 들어, 배리어, 원자적-갱신 및 도 8h의 다른 명령 어들)은 머신 명령어들 또는 머신 명령어들의 시퀀스들로 변환된다. CTA 실행에 대해 최적화되는 타겟 플랫폼 아키텍처들은, 예를 들어, 배리어에 도착한 스레드들의 수를 카운트하고, 스레드에 대한 추가 명령어들이 그 스레드가 배리어에서 대기하고 있는 동안에 발행되는 것을 방지하는 플래그들을 설정하는 명령어 유닛 내의 카운터들 및/또는 레지스터들을 갖는, 하드웨어-지원 배리어 명령어들을 포함하는 것이 유리하다. 다른 타겟 아키텍처들은 스레드 동기화를 위한 직접 하드웨어 지원을 제공하지 않을 수 있는데, 이 경우 다른 스레드간(inter-thread) 통신 기술들(예를 들어, 세마포어들(semaphores), 메모리 내의 상태 어레이들 등)이 원하는 거동을 생성하는 데 이용될 수 있다.
술어 명령어들은 또한 머신 명령어들로 변환된다. 일부 예들에서, 타겟 하드웨어는 술어 명령어를 직접 지원한다. 다른 예들에서, 술어들은 예를 들어, 프로세서 레지스터들에 저장될 수 있으며, 조건부 분기 명령어들 등이 그 레지스터들을 조회(query)하고 술어 명령어들에 대해 조건부 분기(conditionally branching)하는 것에 의해 원하는 런타임 거동을 생성하는 데 이용된다.
도 9는 본 발명의 실시예에 따른 가상 명령어 변환기를 이용하는 프로세스(900)의 흐름도이다. 단계(902)에서, 프로그래머가 고레벨 언어로 CTA 프로그램 코드를 기입한다. 일 실시예에서, CTA 프로그램 코드는 단일 CTA 스레드의 원하는 거동을 정의하며, 파라미터로서 스레드 ID(CTA ID 및/또는 그리드 ID를 포함함)를 사용하여 CTA 스레드의 거동의 양태들을 정의 또는 제어할 수 있다. 예를 들어, 판독 또는 기입될 공유 메모리 위치가 스레드 ID의 함수로서 결정되어, 동일 CTA 내의 상이한 CTA 스레드들이 공유 메모리 내의 상이한 메모리 위치들로부터 판독 및/또는 메모리 위치들로 기입할 것이다. 일 실시예에서, CTA 프로그램 코드는 애플리케이션 프로그램 코드(예를 들어, 도 4의 프로그램 코드(402))의 일부로서 포함된다. CTA 스레드 거동을 정의하는 것 이외에, 애플리케이션 프로그램 코드는 또한 CTA들 및/또는 그리드들을 정의하고, 입력 및 출력 데이터 세트들을 설정할 수도 있다.
단계(904)에서, 컴파일러(예를 들어 도 4의 컴파일러(408))가 고레벨 언어 코드로부터 단일 (가상) CTA 스레드의 거동을 정의하는 가상 ISA 코드를 생성한다. 코드가 CTA 프로그램 코드와 다른 코드 양쪽 모두를 포함하는 경우, 컴파일러(408)는, CTA 프로그램 코드만이 가상 ISA 코드를 생성하는 데 이용되도록, CTA 프로그램 코드를 나머지 코드로부터 분리할 수 있다. 한 언어로 쓰여진 프로그램 코드를 다른 (가상) 언어로 컴파일하기 위한 종래의 기술들이 이용될 수 있다. 생성된 코드가 가상 언어로 되어 있기 때문에, 컴파일러는 특정 하드웨어에 대해 맞춰져 있거나 특정 하드웨어에 대해 최적화될 필요가 없다는 것에 주목해야 한다. 컴파일러는 입력 코드의 특정 시퀀스로부터 생성된 가상 ISA 코드를 최적화할 수 있다(예를 들어, 가상 ISA 명령어들의 더 짧은 시퀀스들을 선호함). 가상 ISA 내의 프로그램 코드는 디스크 상의 메모리에 저장될 수 있고 및/또는 도 3의 가상 아키텍처(300)와 물리적으로 상이한 아키텍처들을 포함한 다종다양한 플랫폼 아키텍처에 분배될 수 있다. 가상 ISA 내의 코드는 머신 독립적이며, 가상 명령어 변환기가 이용가능한 임의의 타겟 플랫폼 상에서 실행될 수 있다. 대안적인 실시예들에서, 프로그래머는 가상 ISA에 직접 CTA 프로그램 코드를 기입할 수 있거나, 또는 가상 ISA 코드는 프로그램에 의해 자동으로 생성될 수 있으며, 프로그램 코드가 처음에 가상 ISA 코드로서 생성되면, 컴파일 단계(904)가 생략될 수 있다.
단계(906)에서, 가상 명령어 변환기(예를 들어, 도 4의 변환기(412))가 가상 ISA 코드를 판독하고, 타겟 플랫폼 상에서 실행될 수 있는 타겟 ISA의 코드를 생성한다. 컴파일러와 달리, 가상 명령어 변환기는 특정 (실제) 플랫폼 아키텍처를 타겟으로 하며, 그 아키텍처에 대해 최상의 성능으로 타겟 ISA 코드를 적응 및 최적화하도록 구성되는 것이 유리하다. 타겟 아키텍처가 적어도 n0 스레드를 지원하는 일 실시예에서, 가상 명령어 변환기는 CTA를 실현하기 위해 n0 스레드들의 각각에 의해 동시에 실행될 수 있는 타겟 스레드 프로그램을 생성한다. 다른 실시예에서, 가상 명령어 변환기는 n0 동시 스레드들을 에뮬레이트(emulate)하기 위해 소프트웨어 기술들(예를 들어, 명령어 시퀀스들)을 사용하는 타겟 프로그램을 생성하며, 각각은 가상 ISA 코드에 대응하는 명령어들을 실행한다. 변환기는 프로그램 설치시에, 프로그램 초기화 동안에, 또는 프로그램 실행 동안 저스트 인 타임(just-in-time) 기초로 동작할 수 있다.
단계(908)에서, 타겟 플랫폼의 프로세서(예를 들어, 도 1의 PPU(122))가 타겟 ISA 코드를 실행하여 데이터를 처리한다. 일부 실시예들에서, 단계(908)는 이하 더 설명되는 바와 같이, 그 거동을 제어하기 위해 프로세서에 커맨드들 및 상태 파라미터들을 공급하는 단계를 포함할 수 있다.
프로세스(900)는 예시적이라는 것과 변형들 및 수정들이 가능하다는 것을 이해할 것이다. 순차적으로 설명된 단계들은 병렬로 실행될 수 있고, 단계들의 순서는 달라질 수 있으며, 단계들은 수정 또는 조합될 수 있다. 예를 들어, 일부 실시예들에서, 프로그래머가 직접적으로 가상 ISA를 이용하여 CTA 프로그램 코드를 기입함으로써, 가상 ISA 코드를 생성하는 컴파일러에 대한 필요를 없앤다. 다른 실시예들에서, CTA 프로그램 코드는, 예를 들어, 특정 문제를 해결하기 위해 실행될 CTA 및/또는 CTA들의 그리드의 차원들을 정의하는 코드를 또한 포함하는 더 큰 애플리케이션 프로그램의 일부분으로서 기입된다. 일 실시예에서, CTA 프로그램을 설명하는 코드의 부분들만이 가상 ISA 코드로 컴파일되며, 다른 부분들은 다른 (실제 또는 가상) 명령어 세트들로 컴파일될 수 있다.
다른 실시예들에서, 하나의 가상 명령어 변환기가 상이한 타겟 플랫폼들에 대해 적응된 타겟 코드의 다수의 버전을 생성하도록 구성될 수 있다. 예를 들어, 변환기는 고레벨 언어(예를 들어, C)의 프로그램 코드, PPU를 위한 머신 코드, 및/또는 소프트웨어 기술들을 이용하여 PPU 거동을 에뮬레이트하는 단일-코어 또는 다중-코어 CPU를 위한 머신 코드를 생성할 수 있다.
7. 가상 실행 드라이버
일부 실시예들에서, 가상 ISA 코드(410) 및 가상 명령어 변환기(412)는 CTA의 각 스레드에 대해 실행될 CTA 프로그램 코드를 생성하는 데 이용된다. 도 2a 및 도 2b의 프로그래밍 모델에 대하여, CTA 프로그램을 특정하는 것은 각 CTA 스레드(204)를 위한 프로세싱 태스크를 정의한다. 모델을 완성하기 위해서는, CTA(202)의 차원들, 그리드 내의 CTA들의 수, 처리될 입력 데이터 세트 등을 정의하는 것이 또한 필요하다. 이러한 정보는 본원에서 "CTA 제어 정보"라고 지칭된다.
도 4에 도시된 바와 같이, 일부 실시예들에서, 애플리케이션 프로그램(402)은 가상 라이브러리(404)에서 함수들에 대한 호출들을 이용하는 것에 의해 CTA 제어 정보를 특정한다. 일 실시예에서, 가상 라이브러리(404)는 프로그래머가 CTA 또는 CTA들의 그리드를 정의하고 실행이 시작되어야 할 때를 나타낼 수 있는 다양한 함수 호출을 포함한다.
도 10은 예시적인 가상 라이브러리(404)에서 이용가능한 함수들을 나열한 표(1000)이다. 함수들의 제1 그룹은 CTA를 정의하는 것과 관련된다. 구체적으로, initCTA 함수는 새로운 CTA를 생성하기 위해 호출되는 제1 함수이다. 이 함수는, 프로그래머가 CTA의 차원들(ntid.x, ntid.y, ntid.z)을 정의하고 새로운 CTA에 식별자 cname를 할당할 수 있게 한다. setCTAProgram 함수는 CTA cname의 각 스레드에 의해 실행될 CTA 프로그램을 특정하며, 파라미터 pname는 원하는 CTA 프로그램(예를 들어, 가상 ISA 코드의 프로그램)에 대응하는 논리 프로그램 식별자이다. setCTAInputArray 함수는 프로그래머가 CTA cname이 입력 데이터를 판독할 전역 메모리 내의 소스 위치(시작 어드레스 및 크기)를 특정할 수 있게 하며, setCTAOutputArray 함수는 프로그래머가 CTA cname이 출력 데이터를 기입할 전역 메모리 내의 타겟 위치(시작 어드레스 및 크기)를 특정할 수 있게 한다. setCTAParams 함수는 CTA cname에 대한 런타임 상수 파라미터들을 설정하는 데 이 용된다. 프로그래머는 함수에 파라미터들의 목록을 - 예를 들어, (이름, 값) 쌍들로서 - 제공한다.
일 실시예에서, setCTAParams 함수는 또한 가상 ISA 코드(410)를 생성할 때 컴파일러(408)에 의해 이용될 수 있다. setCTAParams 함수는 CTA에 대한 런타임 파라미터들을 정의하기 때문에, 컴파일러(408)는 .param 상태 공간의 가상 변수로서 각 파라미터를 정의하는 것으로 이 함수를 해석할 수 있다.
표(1000)는 또한 CTA들의 그리드들을 정의하는 것과 관련된 함수들을 나열한다. initGrid 함수는 새로운 그리드를 생성하기 위해 호출되는 제1 함수이다. 이 함수는, 프로그래머가, 그리드의 차원들(nctaid.x, nctaid.y, nctaid.z)을 정의하고, 그리드에서 실행될 CTA cname을 식별하고, 새롭게 정의된 그리드에 식별자 gname를 할당할 수 있게 한다. setGridInputArray 및 setGridOutputArray 함수들은 CTA-레벨 함수들과 유사하므로, 단일 입력 및/또는 출력 어레이가 그리드의 모든 CTA의 모든 스레드에 대해 정의될 수 있게 한다. setGridParams 함수는 그리드 gname의 모든 CTA에 대해 런타임 상수 파라미터들을 설정하는 데 이용된다. 컴파일러(408)는 .const 상태 공간의 가상 변수로서 각 파라미터를 정의하는 것으로 이 함수를 해석할 수 있다.
launchCTAlaunchGrid 함수들은 특정된 CTA cname 또는 그리드 gname의 실행이 시작해야 한다는 신호를 보낸다.
가상 API는 또한 다른 함수들을 포함할 수 있다. 예를 들어, 일부 실시예들은 다수의 CTA의 실행을 조화시키는 데 이용가능한 동기화 함수들을 제공한다. 예 를 들어, 제1 CTA(또는 그리드)의 출력이 제2 CTA(또는 그리드)의 입력으로서 이용된다면, API는 제1 CTA(또는 그리드)의 실행이 완료될 때까지 제2 CTA(또는 그리드)가 론칭(launch)되어서는 안 된다고 가상 실행 드라이버가 지시될 수 있는 함수(또는 론치(launch) 함수를 위한 파라미터)를 포함할 수 있다.
본 발명의 실시예에 따르면, 표(1000) 내의 함수 호출들의 어느 하나 또는 전부는 실행될 CTA 프로그램(또는 애플리케이션 내에 다수의 CTA가 존재한다면 프로그램들)을 또한 정의하는 애플리케이션 프로그램에 포함될 수 있다. 컴파일시에, 함수 호출들은 API(application program interface) 라이브러리(404)에의 호출들로서 처리됨으로써, 가상 API 코드(406)를 생성한다.
가상 API 코드는 가상 라이브러리에 각 함수를 구현하는 가상 실행 드라이버(418)를 이용하여 실현된다. 일 실시예에서, 가상 실행 드라이버(418)는 CTA 스레드들을 실현하는, PPU(122)를 제어하는 도 1의 CPU(102) 상에서 실행하는 드라이버 프로그램이다. 도 10의 표(1000)의 다양한 함수 호출들은 드라이버가 푸시버퍼(pushbuffer)를 통해 PPU(122)에 커맨드들을 제공하도록 구현된다. 다른 실시예에서, CPU는 CTA를 실현하기 위해 하나 이상의 프로그램을 실행하며, 가상 실행 드라이버(418)는 파라미터들을 셋업하고 CPU에 의해 이러한 프로그램들의 실행을 제어한다.
본원에 설명된 가상 API는 예시적인 것이며 변형들 및 수정들이 가능하다는 것을 이해할 것이다. 다른 함수들 또는 함수들의 조합들이 지원될 수 있다. 이 기술분야에 알려진 가상 API 기술들은 본 발명의 목적을 위해 적응될 수 있다.
다른 실시예들
본 발명은 특정 실시예들과 관련하여 설명되었지만, 이 기술분야의 당업자이면 다수의 수정들이 가능하다는 것을 인식할 것이다. 예를 들어, 본원에 설명된 특정 가상 아키텍처, 가상 명령어들 및 가상 API 함수들이 요구되지 않으며, 동시 협력 스레드들을 지원하는 다른 가상 아키텍처들, 명령어들 및/또는 함수들이 대체될 수 있다. 또한, 전술한 실시예들은, 모든 블록이 동일한 수의 요소를 갖는 경우, 모든 CTA가 동일한 수의 스레드를 갖고 동일한 CTA 프로그램을 실행하는 경우 등을 참조할 수 있다. 일부 애플리케이션들에서, 예를 들어, 다수의 종속 그리드들이 이용되는 경우에서, 상이한 그리드들 내의 CTA들이 상이한 CTA 프로그램들을 실행하거나 또는 상이한 수 및/또는 크기의 그리드들을 갖는 것이 바람직할 수 있다.
본원에서 "협력 스레드 어레이들"에 대한 언급이 이루어지지만, 일부 실시예들은 동시 스레드들 간의 데이터 공유가 지원되지 않는 스레드 어레이들을 사용할 수 있고, 이러한 데이터 공유가 지원되는 다른 실시예들에서, 주어진 애플리케이션에 대해 정의된 스레드들은 실제로 데이터를 공유할 수 있거나 그렇지 않을 수도 있다는 것을 이해해야 한다.
또한, 전술한 실시예들은 다수의 스레드들을 갖는 것으로 스레드 어레이들을 언급할 수 있지만, "축퇴(degenerate)" 경우에, 스레드 어레이는 하나의 스레드만을 가질 수 있다는 것을 이해해야 한다. 그러므로, 본 발명은 하나 이상의 단일-스레드 또는 멀티-스레드 코어들을 갖는 CPU 상에서 실행될 프로그램들에서 확장 성(scalability)을 제공하는 데에 적용될 수 있다. 본원에 설명된 기술들을 이용하여, 프로그램은 가상 ISA 코드의 수정 또는 재컴파일을 요구하지 않고 (예를 들어, 오퍼레이션 시스템 기능을 이용하여) 임의 수의 가용 CPU 코어들에 걸쳐서 스레드들이 분배될 수 있는 방식으로 기입될 수 있다.
"가상" 및 "실제"라는 용어는, 본원에서 프로그램이 궁극적으로 실행될 수 있는 실제 컴퓨터 시스템으로부터 문제 해결책을 설명하기 위해 프로그래머에 의해 이용된 개념적 프로그래밍 모델의 분리를 반영하는 데 이용된다. "가상" 프로그래밍 모델 및 그의 연관된 아키텍처는 프로그래머가 고레벨의 병렬 프로세싱 태스크를 취할 수 있게 하며, 컴포넌트들이 본원에 설명된 가상 아키텍처 컴포넌트들에 일대일 맵핑하는 실제 컴퓨팅 시스템 또는 디바이스가 존재할 수 있거나 그렇지 않을 수도 있다는 것을 이해해야 한다. 가상 ISA 코드 및 가상 API 코드를 포함한 가상 코드는 임의의 실제 프로세싱 디바이스의 명령어 세트에 일대일 대응할 수 있거나 그렇지 않을 수도 있는 언어의 코드로서 실현되는 것이 유리하다. 모든 프로그램 코드와 마찬가지로, 본원에 언급된 가상 코드는 실체적 매체(예를 들어, 메모리 또는 디스크)에 저장될 수 있고, 네트워크를 통해 전송될 수 있다.
가상 ISA 및/또는 가상 API 코드, 가상 명령어 변환기들, 가상 드라이버들, 컴파일러들, 가상 함수 라이브러리들 등을 포함하지만 이것으로 한정되지 않는, 본 발명의 다양한 특징들을 통합한 컴퓨터 프로그램들은 저장 및/또는 전송을 위한 다양한 컴퓨터 판독 가능한 매체에 인코딩될 수 있고, 적절한 매체는 자기 디스크 또는 테이프, 콤팩트 디스크(CD) 또는 DVD(digital versatile disk)와 같은 광 저장 매체, 플래시 메모리 등을 포함한다. 이러한 프로그램들은 또한 인터넷을 포함한, 다양한 프로토콜에 따르는 유선, 광, 및/또는 무선 네트워크들을 통한 전송을 위해 적응된 캐리어 신호들을 이용하여 전송되고 인코딩될 수 있다. 프로그램 코드로 인코딩된 컴퓨터 판독가능한 저장 매체는 호환가능한 디바이스와 패키지화될 수 있거나, 또는 프로그램 코드는 (예를 들어, 인터넷 다운로드를 통해) 다른 디바이스들로부터 개별적으로 제공될 수 있다.
또한, "프로그래머"에 의해 취해지는 것으로서 본원에서 특정 액션들이 설명될 수 있다. 프로그래머는 인간, 인간의 개입이 약간 있거나 전혀 없이 프로그램 코드를 생성하는 자동화 프로세스, 또는 프로그램 코드를 생성하기 위해 자동화되거나 부분적으로 자동화된 프로세스와 인간이 상호작용하는 임의의 조합일 수 있다는 것이 고려된다.
또한, 본원에 설명된 실시예들은 특정 타겟 플랫폼들의 특징들에 대해 언급하고 있지만, 본 발명은 이들 플랫폼으로 한정되지 않는다. 사실상, 가상 아키텍처는 하드웨어 및/또는 소프트웨어 컴포넌트들의 임의의 조합으로 실현될 수 있다. 이 기술분야의 당업자이면, 동일한 가상 아키텍처의 상이한 실현이 효율성 및/또는 처리량을 상이하게 할 것으로 예측될 수 있지만, 이러한 차이들은 본 발명과 무관하다는 것을 알 것이다.
그러므로, 본 발명은 특정 실시예들과 관련하여 설명되었지만, 본 발명은 다음의 특허청구의 범위 내의 모든 수정들 및 등가물들을 포함하는 것으로 의도된다는 것을 이해할 것이다.
도 1은 본 발명의 실시예에 따른 컴퓨터 시스템의 블록도.
도 2a 및 도 2b는 본 발명의 실시예들에 이용되는 프로그래밍 모델에서의 그리드들, 스레드 어레이들, 및 스레드들 사이의 관계를 예시한 도면.
도 3은 본 발명의 실시예에 따른 가상 아키텍처의 블록도.
도 4는 본 발명의 실시예에 따른 타겟 프로세서를 동작시키기 위해 가상 아키텍처를 이용하는 개념적인 모델을 도시한 도면.
도 5는 본 발명의 실시예에 따른 가상 명령어 세트 아키텍처(Instruction Set Architecture: ISA)에 의해 정의되는 특수 변수들을 열거한 표.
도 6은 본 발명의 실시예에 따른 가상 ISA에서 지원되는 변수 타입들을 열거한 표.
도 7은 본 발명의 실시예에 따른 가상 ISA에서 지원되는 가상 상태 공간들을 열거한 표.
도 8a 내지 도 8h는 본 발명의 실시예에 따른 가상 ISA에 정의되는 가상 명령어들을 열거한 표들.
도 9는 본 발명의 실시예에 따른 가상 명령어 변환기를 이용하기 위한 프로세스의 흐름도.
도 10은 본 발명의 실시예에 따른 가상 실행 드라이버를 위한 가상 라이브러리 내의 가용 함수들을 열거한 표.
<도면의 주요 부분에 대한 부호의 설명>
104: 시스템 메모리
105: 메모리 브리지
107: I/O 브리지
112: 병렬 처리 서브시스템
114: 시스템 디스크
116: 스위치
118: 네트워크 어댑터
120, 121: 애드인 카드
124: PP 메모리
302: 가상 프로세서
304: 전역 메모리
306: 프론트 엔드
308: 가상 코어
310: 처리 엔진들
311: 특수 레지스터들
312: 명령어 유닛
314: 로컬 레지스터들
316: 공유 메모리
318: 파라미터 메모리
320: 가상 드라이버
322: 메모리 인터페이스
402: 애플리케이션 프로그램
404: 라이브러리
406: 가상 API 코드
408: 컴파일러
410: 가상 ISA 코드
412: 가상 명령어 변환기
414: 타겟 ISA 코드
416: 가상 실행 드라이버
418: 타겟 API 커맨드들
432: PPU 드라이버
434: 프론트 엔드
430: 명령어 유닛
440: 타겟 플랫폼

Claims (21)

  1. 병렬 처리 연산을 정의하는 방법으로서,
    협력 가상 스레드들의 어레이 내의 다수의 가상 스레드 각각에 대해 수행될 연산들의 시퀀스를 정의하는 제1 프로그램 코드를 제공하는 단계;
    상기 제1 프로그램 코드를, 상기 다수의 가상 스레드의 대표 가상 스레드에 대해 실행될 스레드-당(per-thread) 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램으로 컴파일하는 단계;
    상기 가상 스레드 프로그램을 저장하는 단계
    를 포함하고,
    상기 스레드-당 명령어들의 시퀀스는, 상기 다수의 가상 스레드의 상기 대표 가상 스레드와 하나 이상의 다른 가상 스레드 사이의 협력 거동(cooperative behavior)을 정의하는 적어도 하나의 명령어를 포함하는 방법.
  2. 제1항에 있어서,
    상기 저장된 가상 스레드 프로그램을, 타겟 플랫폼 아키텍처에 따르는 명령어들의 시퀀스로 변환하는 단계를 더 포함하는 방법.
  3. 제1항에 있어서,
    입력 데이터 세트를 처리하여 출력 데이터 세트를 생성하도록 구성된 협력 가상 스레드들의 어레이를 정의하는 제2 프로그램 코드를 제공하는 단계 - 상기 어레이 내의 각 가상 스레드는 상기 가상 스레드 프로그램을 동시에 실행함 - ;
    상기 제2 프로그램 코드를, 가상 함수들의 라이브러리 내의 함수 호출들의 시퀀스로 전환하는 단계 - 상기 라이브러리는 상기 협력 가상 스레드들의 어레이의 실행을 초기화 및 유발시키는 가상 함수들을 포함함 - ; 및
    상기 함수 호출들의 시퀀스를 저장하는 단계를 더 포함하는 방법.
  4. 제3항에 있어서,
    상기 저장된 가상 스레드 프로그램 및 상기 함수 호출들의 시퀀스를, 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환하는 단계를 더 포함하고, 상기 실행가능한 프로그램 코드는 상기 협력 가상 스레드들의 어레이를 실행하는 하나 이상의 플랫폼 스레드를 정의하는 방법.
  5. 제4항에 있어서,
    상기 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 상기 실행가능한 프로그램 코드를 실행하여, 상기 출력 데이터 세트를 생성하는 단계; 및
    상기 출력 데이터 세트를 저장 매체에 저장하는 단계를 더 포함하는 방법.
  6. 제1항에 있어서,
    상기 스레드-당 명령어들의 시퀀스는, 상기 시퀀스 내의 특정 포인트에서 상 기 대표 가상 스레드에 대한 연산들의 실행을, 하나 이상의 상기 다른 가상 스레드가 그 특정 포인트에 도달할 때까지, 일시정지시키는 명령어를 포함하는 방법.
  7. 제1항에 있어서,
    상기 스레드-당 명령어들의 시퀀스는, 상기 대표 가상 스레드가 하나 이상의 상기 다른 가상 스레드가 액세스하는 공유 메모리에 데이터를 저장하도록 하는 명령어를 포함하는 방법.
  8. 제1항에 있어서,
    상기 스레드-당 명령어들의 시퀀스는, 상기 대표 가상 스레드가 하나 이상의 상기 다른 가상 스레드가 액세스하는 공유 메모리에 저장된 데이터를 원자적으로(atomically) 판독 및 갱신하도록 하는 명령어를 포함하는 방법.
  9. 제1항에 있어서,
    상기 가상 스레드 프로그램은 다수의 가상 상태 공간 중 하나에 변수를 정의하는 변수 정의문(variable definition statement)을 포함하며, 상기 다수의 가상 상태 공간 중 다른 것들은 상기 가상 스레드들 사이의 상이한 데이터 공유 모드들에 대응하는 방법.
  10. 제9항에 있어서,
    상기 데이터 공유 모드들은, 스레드-당 공유되지 않는 모드(per-thread unshared mode) 및 전체적으로 공유되는 모드(globally shared mode)를 포함하는 방법.
  11. 제9항에 있어서,
    상기 데이터 공유 모드들은, 스레드-당 공유되지 않는 모드, 가상 스레드들의 하나의 어레이 내에서 공유되는 모드(shared mode within one array of virtual threads) 및 전체적으로 공유되는 모드를 포함하는 방법.
  12. 제9항에 있어서,
    상기 데이터 공유 모드들은, 스레드-당 공유되지 않는 모드, 가상 스레드들의 하나의 어레이 내에서 공유되는 모드, 가상 스레드들의 다수의 어레이 사이에서 공유되는 모드(shared mode between a plurality of arrays of virtual threads) 및 전체적으로 공유되는 모드를 포함하는 방법.
  13. 타겟 프로세서를 동작시키는 방법으로서,
    입력 데이터 세트를 처리하여 출력 데이터 세트를 생성하도록 구성된 가상 스레드들의 어레이 내의 다수의 가상 스레드들 각각에 대해 수행될 연산들의 시퀀스를 정의하는 제1 부분을 포함하는 입력 프로그램 코드를 제공하는 단계 - 상기 입력 프로그램 코드는 상기 가상 스레드들의 어레이의 차원(dimension)을 정의하는 제2 부분을 더 포함함 - ;
    상기 입력 프로그램 코드의 상기 제1 부분을, 상기 다수의 가상 스레드의 대표 가상 스레드에 대해 실행될 스레드-당 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램으로 컴파일하는 단계 - 상기 스레드-당 명령어들의 시퀀스는, 상기 다수의 가상 스레드의 상기 대표 가상 스레드와 하나 이상의 다른 가상 스레드 사이의 협력 거동을 정의하는 적어도 하나의 명령어를 포함함 - ;
    상기 입력 프로그램 코드의 상기 제2 부분을, 가상 함수 라이브러리에 대한 함수 호출들의 시퀀스로 전환하는 단계 - 상기 라이브러리는 상기 협력 가상 스레드들의 어레이의 실행을 초기화 및 발생시키는 가상 함수들을 포함함 - ;
    상기 가상 스레드 프로그램 및 상기 함수 호출들의 시퀀스를, 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환하는 단계 - 상기 실행가능한 프로그램 코드는 상기 협력 가상 스레드들의 어레이를 실행하는 하나 이상의 실제 스레드들을 정의함 - ;
    상기 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 상기 실행가능한 프로그램 코드를 실행하여, 상기 출력 데이터 세트를 생성하는 단계; 및
    상기 출력 데이터 세트를 저장 매체에 저장하는 단계
    를 포함하는 방법.
  14. 제13항에 있어서,
    상기 입력 프로그램 코드의 상기 제2 부분은 상기 가상 스레드들의 어레이에 대한 2 이상의 차원을 정의하는 프로그램 코드를 포함하는 방법.
  15. 제14항에 있어서,
    상기 입력 프로그램 코드의 상기 제2 부분은, 가상 스레드들의 어레이들의 그리드(grid)의 1 이상의 차원을 정의하는 함수 호출을 더 포함하고, 상기 그리드 내의 각각의 어레이가 실행되는 방법.
  16. 제13항에 있어서,
    상기 타겟 플랫폼 아키텍처는 마스터 프로세서 및 코프로세서를 포함하며,
    상기 변환하는 단계는,
    상기 가상 스레드 프로그램을, 상기 코프로세서 상에 정의된 다수의 스레드에 의해 병렬로 실행가능한 프로그램 코드로 변환하는 단계; 및
    상기 함수 호출들의 시퀀스를, 상기 코프로세서를 위한 드라이버 프로그램에 대한 호출들의 시퀀스로 변환하는 단계를 포함하며,
    상기 드라이버 프로그램은 상기 마스터 프로세서 상에서 실행하는 방법.
  17. 제13항에 있어서,
    상기 타겟 플랫폼 아키텍처는 중앙 처리 장치(CPU)를 포함하며,
    상기 변환하는 단계는,
    상기 가상 스레드의 수보다 적은 CPU 스레드들의 수를 이용하여, 상기 가상 스레드 프로그램 및 상기 함수 호출들의 시퀀스의 적어도 일부분을, 상기 가상 스레드 어레이를 실행하는 타겟 프로그램 코드로 변환하는 단계를 포함하는 방법.
  18. 타겟 프로세서를 동작시키는 방법으로서,
    입력 데이터 세트를 처리하여 출력 데이터 세트를 생성하도록 구성된 가상 스레드 어레이 내의 다수의 가상 스레드의 대표 가상 스레드에 대해 실행될 스레드-당 명령어들의 시퀀스를 정의하는 가상 스레드 프로그램을 획득하는 단계 - 상기 스레드-당 명령어들의 시퀀스는, 상기 다수의 가상 스레드의 상기 대표 가상 스레드와 하나 이상의 다른 가상 스레드 사이의 협력 거동을 정의하는 적어도 하나의 명령어를 포함함 - ;
    상기 가상 스레드 어레이의 차원들을 정의하는 추가 프로그램 코드를 획득하는 단계;
    상기 가상 스레드 프로그램 및 상기 추가 프로그램 코드를, 상기 타겟 플랫폼 아키텍처 상에서 실행가능한 프로그램 코드로 변환하는 단계 - 상기 실행가능한 프로그램 코드는 상기 가상 스레드 어레이를 실행하는 하나 이상의 플랫폼 스레드를 정의함 - ; 및
    상기 타겟 플랫폼 아키텍처에 따르는 컴퓨터 시스템 상에서 상기 실행가능한 프로그램 코드를 실행하여, 상기 출력 데이터 세트를 생성하고 상기 출력 데이터 세트를 메모리에 저장하는 단계
    를 포함하는 방법.
  19. 제18항에 있어서,
    상기 가상 스레드 프로그램을 획득하는 단계는,
    고레벨의 프로그래밍 언어로 쓰여진 소스 프로그램 코드를 수신하는 단계; 및
    상기 소스 프로그램 코드를 컴파일하여 상기 가상 스레드 프로그램을 생성하는 단계를 포함하는 방법.
  20. 제18항에 있어서,
    상기 가상 스레드 프로그램을 획득하는 단계는, 상기 가상 스레드 프로그램을 저장 매체로부터 판독하는 단계를 포함하는 방법.
  21. 제18항에 있어서,
    상기 가상 스레드 프로그램을 획득하는 단계는, 상기 가상 스레드 프로그램을 원격 컴퓨터 시스템으로부터 네트워크를 통해 수신하는 단계를 포함하는 방법.
KR1020080008740A 2007-01-26 2008-01-28 병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트 KR101026689B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/627,892 US8321849B2 (en) 2007-01-26 2007-01-26 Virtual architecture and instruction set for parallel thread computing
US11/627,892 2007-01-26

Publications (2)

Publication Number Publication Date
KR20080070599A true KR20080070599A (ko) 2008-07-30
KR101026689B1 KR101026689B1 (ko) 2011-04-07

Family

ID=39587517

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020080008740A KR101026689B1 (ko) 2007-01-26 2008-01-28 병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트

Country Status (7)

Country Link
US (1) US8321849B2 (ko)
JP (1) JP4999183B2 (ko)
KR (1) KR101026689B1 (ko)
CN (1) CN101231585B (ko)
DE (2) DE102008005515A1 (ko)
SG (1) SG144869A1 (ko)
TW (1) TWI363294B (ko)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101157596B1 (ko) * 2010-12-24 2012-06-19 서울대학교산학협력단 개방형 범용 병렬 컴퓨팅 프레임워크(OpenCL)에서의 메모리 접근영역 분석장치 및 그 방법
KR101442382B1 (ko) * 2010-06-24 2014-09-17 인터내셔널 비지네스 머신즈 코포레이션 가상 프로세서의 멀티-펑션 명령의 명령 펑션을 차단하기 위한 펑션 가상 퍼실리티
US9015683B2 (en) 2009-12-30 2015-04-21 Samsung Electronics Co., Ltd. Method and apparatus for transforming program code
KR20200018234A (ko) * 2018-08-10 2020-02-19 베이징 바이두 넷컴 사이언스 앤 테크놀로지 코., 엘티디. 인공지능 칩 및 인공지능 칩에 사용되는 명령 실행 방법

Families Citing this family (138)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7657882B2 (en) * 2004-01-22 2010-02-02 University Of Washington Wavescalar architecture having a wave order memory
US7490218B2 (en) * 2004-01-22 2009-02-10 University Of Washington Building a wavecache
RU2312388C2 (ru) * 2005-09-22 2007-12-10 Андрей Игоревич Ефимов Способ организации многопроцессорной эвм
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
CN103646009B (zh) 2006-04-12 2016-08-17 索夫特机械公司 对载明并行和依赖运算的指令矩阵进行处理的装置和方法
US8082289B2 (en) 2006-06-13 2011-12-20 Advanced Cluster Systems, Inc. Cluster computing support for application programs
US7836116B1 (en) * 2006-06-15 2010-11-16 Nvidia Corporation Fast fourier transforms and related transforms using cooperative thread arrays
US7640284B1 (en) 2006-06-15 2009-12-29 Nvidia Corporation Bit reversal methods for a parallel processor
CN101627365B (zh) 2006-11-14 2017-03-29 索夫特机械公司 多线程架构
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
US8533697B2 (en) 2007-02-14 2013-09-10 The Mathworks, Inc. Graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment
US8276164B2 (en) 2007-05-03 2012-09-25 Apple Inc. Data parallel computing on multiple processors
EP3413198A1 (en) 2007-04-11 2018-12-12 Apple Inc. Data parallel computing on multiple processors
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
US11836506B2 (en) 2007-04-11 2023-12-05 Apple Inc. Parallel runtime execution on multiple processors
US7877573B1 (en) * 2007-08-08 2011-01-25 Nvidia Corporation Work-efficient parallel prefix sum algorithm for graphics processing units
US7725518B1 (en) 2007-08-08 2010-05-25 Nvidia Corporation Work-efficient parallel prefix sum algorithm for graphics processing units
US8225295B2 (en) * 2007-09-21 2012-07-17 Jens Palsberg Register allocation by puzzle solving
US20090204173A1 (en) 2007-11-05 2009-08-13 Zi-Ping Fang Multi-Frequency Neural Treatments and Associated Systems and Methods
US8200947B1 (en) * 2008-03-24 2012-06-12 Nvidia Corporation Systems and methods for voting among parallel threads
US8225325B2 (en) * 2008-06-06 2012-07-17 Apple Inc. Multi-dimensional thread grouping for multiple processors
US8286198B2 (en) 2008-06-06 2012-10-09 Apple Inc. Application programming interfaces for data parallel computing on multiple processors
US8776038B2 (en) 2008-08-07 2014-07-08 Code Systems Corporation Method and system for configuration of virtualized software applications
US8434093B2 (en) 2008-08-07 2013-04-30 Code Systems Corporation Method and system for virtualization of software applications
US8436862B2 (en) * 2008-12-11 2013-05-07 Nvidia Corporation Method and system for enabling managed code-based application program to access graphics processing unit
US8570333B2 (en) * 2008-12-11 2013-10-29 Nvidia Corporation Method and system for enabling managed code-based application program to access graphics processing unit
US8307350B2 (en) * 2009-01-14 2012-11-06 Microsoft Corporation Multi level virtual function tables
JP5149840B2 (ja) * 2009-03-03 2013-02-20 株式会社日立製作所 ストリームデータ処理方法、ストリームデータ処理プログラム、および、ストリームデータ処理装置
KR101572879B1 (ko) 2009-04-29 2015-12-01 삼성전자주식회사 병렬 응용 프로그램을 동적으로 병렬처리 하는 시스템 및 방법
US8564616B1 (en) 2009-07-17 2013-10-22 Nvidia Corporation Cull before vertex attribute fetch and vertex lighting
US8542247B1 (en) 2009-07-17 2013-09-24 Nvidia Corporation Cull before vertex attribute fetch and vertex lighting
CN102023844B (zh) * 2009-09-18 2014-04-09 深圳中微电科技有限公司 并行处理器及其线程处理方法
US10360039B2 (en) * 2009-09-28 2019-07-23 Nvidia Corporation Predicted instruction execution in parallel processors with reduced per-thread state information including choosing a minimum or maximum of two operands based on a predicate value
US8266383B1 (en) 2009-09-28 2012-09-11 Nvidia Corporation Cache miss processing using a defer/replay mechanism
US9665920B1 (en) * 2009-10-05 2017-05-30 Nvidia Corporation Simultaneous execution of compute and graphics applications
US8976195B1 (en) 2009-10-14 2015-03-10 Nvidia Corporation Generating clip state for a batch of vertices
US8384736B1 (en) 2009-10-14 2013-02-26 Nvidia Corporation Generating clip state for a batch of vertices
EP2519876A1 (en) * 2009-12-28 2012-11-07 Hyperion Core, Inc. Optimisation of loops and data flow sections
US8954958B2 (en) 2010-01-11 2015-02-10 Code Systems Corporation Method of configuring a virtual application
US8959183B2 (en) 2010-01-27 2015-02-17 Code Systems Corporation System for downloading and executing a virtual application
US9104517B2 (en) 2010-01-27 2015-08-11 Code Systems Corporation System for downloading and executing a virtual application
US9229748B2 (en) 2010-01-29 2016-01-05 Code Systems Corporation Method and system for improving startup performance and interoperability of a virtual application
US8763009B2 (en) 2010-04-17 2014-06-24 Code Systems Corporation Method of hosting a first application in a second application
US8375373B2 (en) * 2010-04-19 2013-02-12 Microsoft Corporation Intermediate language support for change resilience
US8527866B2 (en) 2010-04-30 2013-09-03 Microsoft Corporation Multi-threaded sort of data items in spreadsheet tables
US20110276868A1 (en) * 2010-05-05 2011-11-10 Microsoft Corporation Multi-Threaded Adjustment of Column Widths or Row Heights
US9851969B2 (en) 2010-06-24 2017-12-26 International Business Machines Corporation Function virtualization facility for function query of a processor
US9218359B2 (en) 2010-07-02 2015-12-22 Code Systems Corporation Method and system for profiling virtual application resource utilization patterns by executing virtualized application
EP3156896B1 (en) 2010-09-17 2020-04-08 Soft Machines, Inc. Single cycle multi-branch prediction including shadow cache for early far branch prediction
US9529574B2 (en) * 2010-09-23 2016-12-27 Apple Inc. Auto multi-threading in macroscalar compilers
KR20120031756A (ko) * 2010-09-27 2012-04-04 삼성전자주식회사 Cpu와 gpu를 사용하는 이종 시스템에서 가상화를 이용한 어플리케이션 컴파일 및 실행 방법 및 장치
KR101649925B1 (ko) * 2010-10-13 2016-08-31 삼성전자주식회사 멀티 트레드 프로그램에서 변수의 단독 메모리 접근여부를 분석하는 방법
US20120096292A1 (en) * 2010-10-15 2012-04-19 Mosaid Technologies Incorporated Method, system and apparatus for multi-level processing
US9021015B2 (en) 2010-10-18 2015-04-28 Code Systems Corporation Method and system for publishing virtual applications to a web server
US9209976B2 (en) 2010-10-29 2015-12-08 Code Systems Corporation Method and system for restricting execution of virtual applications to a managed process environment
WO2012060152A1 (ja) * 2010-11-02 2012-05-10 インターナショナル・ビジネス・マシーンズ・コーポレーション 数値集約計算における文字列集約方法
US8819700B2 (en) * 2010-12-22 2014-08-26 Lsi Corporation System and method for synchronous inter-thread communication
CN103635875B (zh) 2011-03-25 2018-02-16 英特尔公司 用于通过使用由可分区引擎实例化的虚拟核来支持代码块执行的存储器片段
EP2689327B1 (en) 2011-03-25 2021-07-28 Intel Corporation Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines
WO2012135041A2 (en) 2011-03-25 2012-10-04 Soft Machines, Inc. Register file segments for supporting code block execution by using virtual cores instantiated by partitionable engines
JP6040937B2 (ja) 2011-05-19 2016-12-07 日本電気株式会社 並列処理装置、並列処理方法、最適化装置、最適化方法、および、コンピュータ・プログラム
KR101639854B1 (ko) 2011-05-20 2016-07-14 소프트 머신즈, 인크. 복수의 엔진에 의해 명령어 시퀀스들의 실행을 지원하기 위한 상호접속 구조
TWI603198B (zh) * 2011-05-20 2017-10-21 英特爾股份有限公司 以複數個引擎作資源與互連結構的分散式分配以支援指令序列的執行
US8990830B2 (en) * 2011-07-19 2015-03-24 International Business Machines Corporation Thread management in parallel processes
KR101894752B1 (ko) 2011-10-27 2018-09-05 삼성전자주식회사 가상 아키텍쳐 생성 장치, 런타임 시스템, 멀티 코어 시스템 및 그 동작 방법
US20130113809A1 (en) * 2011-11-07 2013-05-09 Nvidia Corporation Technique for inter-procedural memory address space optimization in gpu computing compiler
US9507638B2 (en) * 2011-11-08 2016-11-29 Nvidia Corporation Compute work distribution reference counters
KR101703401B1 (ko) 2011-11-22 2017-02-06 소프트 머신즈, 인크. 다중 엔진 마이크로프로세서용 가속 코드 최적화기
US20150039859A1 (en) 2011-11-22 2015-02-05 Soft Machines, Inc. Microprocessor accelerated code optimizer
US10255228B2 (en) * 2011-12-06 2019-04-09 Nvidia Corporation System and method for performing shaped memory access operations
US9507593B2 (en) * 2011-12-23 2016-11-29 Intel Corporation Instruction for element offset calculation in a multi-dimensional array
US20140195783A1 (en) * 2011-12-29 2014-07-10 Krishnan Karthikeyan Dot product processors, methods, systems, and instructions
KR101885211B1 (ko) * 2012-01-27 2018-08-29 삼성전자 주식회사 Gpu의 자원 할당을 위한 방법 및 장치
US9104421B2 (en) * 2012-07-30 2015-08-11 Nvidia Corporation Training, power-gating, and dynamic frequency changing of a memory controller
KR101394780B1 (ko) * 2012-08-08 2014-05-15 인텔 코포레이션 오버라이딩 가상 함수 호출에 대한 지원을 포함하는 isa 브릿징
US9274772B2 (en) 2012-08-13 2016-03-01 Microsoft Technology Licensing, Llc. Compact type layouts
CN102902576B (zh) * 2012-09-26 2014-12-24 北京奇虎科技有限公司 一种渲染网页的方法、服务器和系统
US8982124B2 (en) 2012-09-29 2015-03-17 Intel Corporation Load balancing and merging of tessellation thread workloads
US9123167B2 (en) 2012-09-29 2015-09-01 Intel Corporation Shader serialization and instance unrolling
KR101708591B1 (ko) 2013-03-15 2017-02-20 소프트 머신즈, 인크. 블록들로 그룹화된 멀티스레드 명령어들을 실행하기 위한 방법
WO2014150971A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for dependency broadcasting through a block organized source view data structure
US10275255B2 (en) 2013-03-15 2019-04-30 Intel Corporation Method for dependency broadcasting through a source organized source view data structure
US9904625B2 (en) 2013-03-15 2018-02-27 Intel Corporation Methods, systems and apparatus for predicting the way of a set associative cache
KR102083390B1 (ko) 2013-03-15 2020-03-02 인텔 코포레이션 네이티브 분산된 플래그 아키텍처를 이용하여 게스트 중앙 플래그 아키텍처를 에뮬레이션하는 방법
US9886279B2 (en) 2013-03-15 2018-02-06 Intel Corporation Method for populating and instruction view data structure by using register template snapshots
US10140138B2 (en) 2013-03-15 2018-11-27 Intel Corporation Methods, systems and apparatus for supporting wide and efficient front-end operation with guest-architecture emulation
US9569216B2 (en) 2013-03-15 2017-02-14 Soft Machines, Inc. Method for populating a source view data structure by using register template snapshots
WO2014150991A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for implementing a reduced size register view data structure in a microprocessor
US9891924B2 (en) 2013-03-15 2018-02-13 Intel Corporation Method for implementing a reduced size register view data structure in a microprocessor
WO2014150806A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for populating register view data structure by using register template snapshots
US9811342B2 (en) 2013-03-15 2017-11-07 Intel Corporation Method for performing dual dispatch of blocks and half blocks
US9535686B2 (en) 2013-03-15 2017-01-03 International Business Machines Corporation Dynamic library replacement
US9772864B2 (en) * 2013-04-16 2017-09-26 Arm Limited Methods of and apparatus for multidimensional indexing in microprocessor systems
US9600852B2 (en) * 2013-05-10 2017-03-21 Nvidia Corporation Hierarchical hash tables for SIMT processing and a method of establishing hierarchical hash tables
US9507594B2 (en) * 2013-07-02 2016-11-29 Intel Corporation Method and system of compiling program code into predicated instructions for execution on a processor without a program counter
US10628156B2 (en) 2013-07-09 2020-04-21 Texas Instruments Incorporated Vector SIMD VLIW data path architecture
GB2524063B (en) 2014-03-13 2020-07-01 Advanced Risc Mach Ltd Data processing apparatus for executing an access instruction for N threads
US9471283B2 (en) * 2014-06-11 2016-10-18 Ca, Inc. Generating virtualized application programming interface (API) implementation from narrative API documentation
CN104077233B (zh) * 2014-06-18 2017-04-05 百度在线网络技术(北京)有限公司 多通道卷积层处理方法和装置
CN105849690B (zh) * 2014-07-02 2019-03-15 上海兆芯集成电路有限公司 融合乘积-累加运算的处理器与方法
US10067768B2 (en) * 2014-07-18 2018-09-04 Nvidia Corporation Execution of divergent threads using a convergence barrier
US20160026486A1 (en) * 2014-07-25 2016-01-28 Soft Machines, Inc. An allocation and issue stage for reordering a microinstruction sequence into an optimized microinstruction sequence to implement an instruction set agnostic runtime architecture
US9398019B2 (en) 2014-08-07 2016-07-19 Vmware, Inc. Verifying caller authorization using secret data embedded in code
US9411979B2 (en) * 2014-08-07 2016-08-09 Vmware, Inc. Embedding secret data in code
US10922402B2 (en) 2014-09-29 2021-02-16 Vmware, Inc. Securing secret data embedded in code against compromised interrupt and exception handlers
US9749548B2 (en) 2015-01-22 2017-08-29 Google Inc. Virtual linebuffers for image signal processors
US20180285119A1 (en) * 2015-03-27 2018-10-04 Intel Corporation Apparatus and method for inter-strand communication
US9772852B2 (en) 2015-04-23 2017-09-26 Google Inc. Energy efficient processor core architecture for image processor
US10291813B2 (en) 2015-04-23 2019-05-14 Google Llc Sheet generator for image processor
US9756268B2 (en) 2015-04-23 2017-09-05 Google Inc. Line buffer unit for image processor
US9965824B2 (en) 2015-04-23 2018-05-08 Google Llc Architecture for high performance, power efficient, programmable image processing
US9785423B2 (en) 2015-04-23 2017-10-10 Google Inc. Compiler for translating between a virtual image processor instruction set architecture (ISA) and target hardware having a two-dimensional shift array structure
US10095479B2 (en) * 2015-04-23 2018-10-09 Google Llc Virtual image processor instruction set architecture (ISA) and memory model and exemplary target hardware having a two-dimensional shift array structure
US9769356B2 (en) 2015-04-23 2017-09-19 Google Inc. Two dimensional shift array for image processor
US9830150B2 (en) 2015-12-04 2017-11-28 Google Llc Multi-functional execution lane for image processor
US10313641B2 (en) 2015-12-04 2019-06-04 Google Llc Shift register with reduced wiring complexity
US10115175B2 (en) * 2016-02-19 2018-10-30 Qualcomm Incorporated Uniform predicates in shaders for graphics processing units
US10204396B2 (en) 2016-02-26 2019-02-12 Google Llc Compiler managed memory for image processor
US10387988B2 (en) 2016-02-26 2019-08-20 Google Llc Compiler techniques for mapping program code to a high performance, power efficient, programmable image processing hardware platform
US10380969B2 (en) 2016-02-28 2019-08-13 Google Llc Macro I/O unit for image processor
US10546211B2 (en) 2016-07-01 2020-01-28 Google Llc Convolutional neural network on programmable two dimensional image processor
US20180005346A1 (en) 2016-07-01 2018-01-04 Google Inc. Core Processes For Block Operations On An Image Processor Having A Two-Dimensional Execution Lane Array and A Two-Dimensional Shift Register
US20180005059A1 (en) 2016-07-01 2018-01-04 Google Inc. Statistics Operations On Two Dimensional Image Processor
US20180007302A1 (en) 2016-07-01 2018-01-04 Google Inc. Block Operations For An Image Processor Having A Two-Dimensional Execution Lane Array and A Two-Dimensional Shift Register
WO2018094087A1 (en) * 2016-11-17 2018-05-24 The Mathworks, Inc. Systems and methods for generating code for parallel processing units
US10204394B2 (en) 2017-04-10 2019-02-12 Intel Corporation Multi-frame renderer
US10437593B2 (en) * 2017-04-27 2019-10-08 Nvidia Corporation Techniques for comprehensively synchronizing execution threads
US10656964B2 (en) * 2017-05-16 2020-05-19 Oracle International Corporation Dynamic parallelization of a calculation process
US10754746B2 (en) 2017-11-15 2020-08-25 General Electric Company Virtual processor enabling unobtrusive observation of legacy systems for analytics in SoC
GB2580327B (en) * 2018-12-31 2021-04-28 Graphcore Ltd Register files in a multi-threaded processor
US20200264921A1 (en) * 2019-02-20 2020-08-20 Nanjing Iluvatar CoreX Technology Co., Ltd. (DBA "Iluvatar CoreX Inc. Nanjing") Crypto engine and scheduling method for vector unit
CN110321193B (zh) * 2019-05-05 2022-03-18 四川盛趣时代网络科技有限公司 一种基于Direct3D共享纹理的交互方法及系统
US11216281B2 (en) 2019-05-14 2022-01-04 International Business Machines Corporation Facilitating data processing using SIMD reduction operations across SIMD lanes
CN110209509B (zh) * 2019-05-28 2021-08-17 北京星网锐捷网络技术有限公司 多核处理器间的数据同步方法及装置
CN110765082B (zh) * 2019-09-06 2023-11-24 深圳平安通信科技有限公司 Hadoop文件处理方法、装置、存储介质及服务器
CN114968358A (zh) * 2020-10-21 2022-08-30 上海壁仞智能科技有限公司 配置向量运算系统中的协作线程束的装置和方法
US20230090604A1 (en) * 2021-09-16 2023-03-23 T-Head (Shanghai) Semiconductor Co., Ltd. Parallel processing unit virtualization

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0722589B1 (en) 1993-10-06 1999-01-20 Honeywell Inc. Virtual graphics processor and method for embedded, real time display systems
US5692193A (en) * 1994-03-31 1997-11-25 Nec Research Institute, Inc. Software architecture for control of highly parallel computer systems
US5828880A (en) 1995-07-06 1998-10-27 Sun Microsystems, Inc. Pipeline system and method for multiprocessor applications in which each of a plurality of threads execute all steps of a process characterized by normal and parallel steps on a respective datum
JPH10228382A (ja) * 1997-02-14 1998-08-25 Nec Corp コンパイル方式
US5991794A (en) 1997-07-15 1999-11-23 Microsoft Corporation Component integration system for an application program
GB2336919A (en) 1998-04-30 1999-11-03 Ibm Pre-emptive threading in a virtual machine
KR20010072477A (ko) 1998-08-13 2001-07-31 썬 마이크로시스템즈, 인코포레이티드 가상 머신 환경에서 네이티브 코드를 변환하고 실행하는방법 및 장치
US7234139B1 (en) * 2000-11-24 2007-06-19 Catharon Productions, Inc. Computer multi-tasking via virtual threading using an interpreter
US6779049B2 (en) 2000-12-14 2004-08-17 International Business Machines Corporation Symmetric multi-processing system with attached processing units being able to access a shared memory without being structurally configured with an address translation mechanism
US6839828B2 (en) 2001-08-14 2005-01-04 International Business Machines Corporation SIMD datapath coupled to scalar/vector/address/conditional data register file with selective subpath scalar processing mode
US7275249B1 (en) * 2002-07-30 2007-09-25 Unisys Corporation Dynamically generating masks for thread scheduling in a multiprocessor system
JP4487479B2 (ja) * 2002-11-12 2010-06-23 日本電気株式会社 Simd命令シーケンス生成方法および装置ならびにsimd命令シーケンス生成用プログラム
US7000233B2 (en) * 2003-04-21 2006-02-14 International Business Machines Corporation Simultaneous multithread processor with result data delay path to adjust pipeline length for input to respective thread
US7610473B2 (en) 2003-08-28 2009-10-27 Mips Technologies, Inc. Apparatus, method, and instruction for initiation of concurrent instruction streams in a multithreading microprocessor
US6897871B1 (en) 2003-11-20 2005-05-24 Ati Technologies Inc. Graphics processing architecture employing a unified shader
US20060150165A1 (en) * 2004-12-30 2006-07-06 Intel Corporation Virtual microengine systems and methods
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
US8914618B2 (en) * 2005-12-29 2014-12-16 Intel Corporation Instruction set architecture-based inter-sequencer communications with a heterogeneous resource
US8010953B2 (en) * 2006-04-04 2011-08-30 International Business Machines Corporation Method for compiling scalar code for a single instruction multiple data (SIMD) execution engine

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9015683B2 (en) 2009-12-30 2015-04-21 Samsung Electronics Co., Ltd. Method and apparatus for transforming program code
KR101442382B1 (ko) * 2010-06-24 2014-09-17 인터내셔널 비지네스 머신즈 코포레이션 가상 프로세서의 멀티-펑션 명령의 명령 펑션을 차단하기 위한 펑션 가상 퍼실리티
KR101157596B1 (ko) * 2010-12-24 2012-06-19 서울대학교산학협력단 개방형 범용 병렬 컴퓨팅 프레임워크(OpenCL)에서의 메모리 접근영역 분석장치 및 그 방법
KR20200018234A (ko) * 2018-08-10 2020-02-19 베이징 바이두 넷컴 사이언스 앤 테크놀로지 코., 엘티디. 인공지능 칩 및 인공지능 칩에 사용되는 명령 실행 방법
US11372673B2 (en) 2018-08-10 2022-06-28 Beijing Baidu Netcom Science And Technology Co., Ltd. Artificial intelligence chip and instruction execution method for artificial intelligence chip

Also Published As

Publication number Publication date
JP4999183B2 (ja) 2012-08-15
TW200844853A (en) 2008-11-16
JP2008276740A (ja) 2008-11-13
KR101026689B1 (ko) 2011-04-07
SG144869A1 (en) 2008-08-28
DE102008005515A1 (de) 2008-08-07
CN101231585B (zh) 2010-12-01
CN101231585A (zh) 2008-07-30
TWI363294B (en) 2012-05-01
US20080184211A1 (en) 2008-07-31
DE202008017916U1 (de) 2010-11-04
US8321849B2 (en) 2012-11-27

Similar Documents

Publication Publication Date Title
KR101026689B1 (ko) 병렬 스레드 계산을 위한 가상 아키텍처 및 명령어 세트
JP2008276740A5 (ko)
US20080109795A1 (en) C/c++ language extensions for general-purpose graphics processing unit
Hormati et al. Macross: Macro-simdization of streaming applications
EP3417369B1 (en) Uniform predicates in shaders for graphics processing units
US9244683B2 (en) System, method, and computer program product for implementing large integer operations on a graphics processing unit
US20220365783A1 (en) Matrix multiplication and accumulation operations on compressed matrices
Compute PTX: Parallel thread execution ISA version 2.3
Collange Identifying scalar behavior in CUDA kernels
Boyd Data-Parallel Computing: Data parallelism is a key concept in leveraging the power of today’s manycore GPUs.
Mantas et al. An introduction to GPU computing for numerical simulation
Meredith et al. Analysis of a computational biology simulation technique on emerging processing architectures
Fisher General-purpose SIMD within a register: Parallel processing on consumer microprocessors
US20230305845A1 (en) Techniques to selectively store data
US20230086989A1 (en) Parallel processing of thread groups
Döbrich et al. Exploring online synthesis for CGRAs with specialized operator sets
Ciznicki et al. Scaling the gcr solver using a high-level stencil framework on multi-and many-core architectures
Brandes et al. The LAMA approach for writing portable applications on heterogenous architectures
Worpitz Investigating performance portability of a highly scalable particle-in-cell simulation code on various multi-core architectures
Yazdanpanah An approach for analyzing auto-vectorization potential of emerging workloads
Kawakami et al. A Binary Translator to Accelerate Development of Deep Learning Processing Library for AArch64 CPU
Yang et al. Fei teng 64 stream processing system: architecture, compiler, and programming
US20220365750A1 (en) Datatype conversion technique
Thorarensen A back-end for the skepu skeleton programming library targeting the low-power multicore vision processor myriad 2
US20230005097A1 (en) Memory deallocation using graphs

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
AMND Amendment
E601 Decision to refuse application
J201 Request for trial against refusal decision
AMND Amendment
B701 Decision to grant
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20140228

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20150302

Year of fee payment: 5