KR20130126616A - 데이터 병렬 코드에서의 맵 변환 - Google Patents

데이터 병렬 코드에서의 맵 변환 Download PDF

Info

Publication number
KR20130126616A
KR20130126616A KR1020137012441A KR20137012441A KR20130126616A KR 20130126616 A KR20130126616 A KR 20130126616A KR 1020137012441 A KR1020137012441 A KR 1020137012441A KR 20137012441 A KR20137012441 A KR 20137012441A KR 20130126616 A KR20130126616 A KR 20130126616A
Authority
KR
South Korea
Prior art keywords
data parallel
type
indexable
map
input
Prior art date
Application number
KR1020137012441A
Other languages
English (en)
Other versions
KR101842307B1 (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 KR20130126616A publication Critical patent/KR20130126616A/ko
Application granted granted Critical
Publication of KR101842307B1 publication Critical patent/KR101842307B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Image Processing (AREA)

Abstract

고급 프로그래밍 언어는 데이터 병렬 알고리즘과 하나 이상의 입력 인덱스가능 유형의 세트를 인수로 취하는 맵 변환을 제공한다. 맵 변환은 출력 인덱스가능 유형을 생성하기 위해 입력 인덱스가능 유형의 세트에 데이터 병렬 알고리즘을 적용하고 출력 인덱스가능 유형을 반환한다. 맵 변환은 하나 이상의 데이터 병렬 알고리즘을 다른 데이터 병렬 알고리즘과 융합하는데 사용될 수 있다.

Description

데이터 병렬 코드에서의 맵 변환{MAP TRANSFORMATION IN DATA PARALLEL CODE}
컴퓨터 시스템은 종종 하나 이상의 범용 프로세서(예를 들어, CPU(certral processing unit)) 및 하나 이상의 특화된 데이터 병렬 연산 노드(예를 들어, CPU 내의 SIMD(single instruction, multiple data) 실행 유닛 또는 GPU(graphics processing unit))을 포함한다. 범용 프로세서는 일반적으로 컴퓨터 시스템 상에서 범용의 처리를 수행하고, 데이터 병렬 연산 노드는 일반적으로 컴퓨터 시스템 상에서 데이터 병렬 처리(예를 들어, 그래픽 처리)를 수행한다. 범용 프로세서는 종종 데이터 병렬 연산 노드에서 볼 수 있는 최적화 하드웨어 리소스없이 데이터 병렬 알고리즘을 구현하는 기능을 갖는다. 그 결과, 범용 프로세서는 데이터 병렬 알고리즘을 실행하는데 있어 데이터 병렬 컴퓨터 노드보다 훨씬 비효율적이다.
데이터 병렬 연산 노드는 전통적으로 컴퓨터 시스템에서 프로그램을 실행하는데 있어 범용 프로세서를 지원하는 역할을 해왔다. 데이터 병렬 연산 노드 처리 용량의 강화에 의해 데이터 병렬 알고리즘을 위해 최적화된 하드웨어의 역할이 증가하면서, 데이터 병렬 연산 노드를 프로그래밍하고 데이터 병렬 연산 노드의 프로그래밍을 쉽게 만드는 프로그래머의 능력을 강화하는 것이 바람직할 것이다.
데이터 병렬 연산 노드는 일반적으로, 예를 들어, 커널 또는 셰이더(shader)라고 알려진 지정된 데이터 병렬 알고리즘을 실행한다. 다수의 데이터 병렬 알고리즘을 실행하기 위해, 보통 각각의 데이터 병렬 알고리즘을 론칭하는데 현저한 연산 오버헤드가 소요된다. 또한, 데이터 병렬 연산 노드가 대응하는 호스트 컴퓨터 노드와 다른 메모리 계층을 갖는 경우, 상이한 데이터 병렬 알고리즘의 중간 결과를 호스트 컴퓨터 노드로, 그리고 그로부터 복사하는데 추가의 오버헤드가 소요될 수 있다.
이 개요는 아래의 상세한 설명에서 더 설명되는 개념 중 선택된 것을 단순화된 형태로 소개하기 위해 제공된다. 본 개요는 청구된 주제의 핵심 특징 또는 중요한 특징을 식별하려는 것이 아니고, 청구된 주제의 범위를 제한하는데 이용되려는 것도 아니다.
고급 프로그래밍 언어는 데이터 병렬 알고리즘과 하나 이상의 입력 인덱스가능 유형을 인수(argument)로 취하는 맵 변환을 제공한다. 맵 변환은 데이터 병렬 알고리즘을 입력 인덱스가능 유형의 세트에 적용하여 인덱스가능 유형을 생성하고, 출력 인덱스가능 유형을 반환한다. 맵 변환은 하나 이상의 데이터 병렬 알고리즘을 다른 데이터 병렬 알고리즘과 접속(fuse)하는데 사용될 수 있다.
첨부 도면은 실시형태의 더 나은 이해를 제공하기 위해 포함되며 본 명세서의 일부를 이루며 본 명세서에 포함된다. 도면은 실시형태를 도시하고 설명과 함께 실시형태의 원리를 설명하는 기능을 한다. 다른 실시형태와 실시형태의 의도된 장점 중 여러 가지는 다음의 상세한 설명을 참조하여 이들이 더 잘 이해되므로, 용이하게 인식될 것이다. 도면의 요소는 반드시 서로에 대해 스케일된 것은 아니다. 유사한 참조 부호는 대응하는 유사한 부분을 지시한다.
도 1은 맵 변환을 갖는 데이터 병렬 코드의 실시형태를 도시하는 컴퓨터 코드 다이어그램이다.
도 2는 입력 인덱스가능 유형의 세트에 맵 변환을 적용하는 실시형태를 도시하는 블록도이다.
도 3a-3c는 맵 변환을 이용하는 실시형태를 도시하는 블록도이다.
도 4는 맵 변환을 포함하는 데이터 병렬 코드를 컴파일하고 실행하도록 구성된 컴퓨터 시스템의 실시형태를 도시하는 블록도이다.
다음의 상세한 설명에서, 본 명세서의 일부를 형성하고 본 발명이 실시될 수 있는 구체적인 실시형태를 예시의 형태로 보여주는 첨부된 도면을 참조한다. 이와 관련하여, "상부(top)." "하부(bottom)," "전면(front)," "후면(back)," "선단(leading)," "후단(traliing)" 등과 같이 방향을 나타내는 용어는 설명되고 있는 도면(들)의 방향을 참조하여 사용된다. 실시형태의 컴포넌트가 많은 다른 방향으로 위치될 수 있기 때문에, 방향을 나타내는 용어는 설명의 목적으로 사용되고 어떠한 방식으로 제한적인 것은 아니다. 다른 실시형태가 사용될 수 있고 구조적 또는 논리적 변경이 본 발명의 범위를 벗어나지 않고 이루어질 수 있음을 이해할 것이다. 다음의 상세한 설명은, 그러므로, 제한적인 방식으로 이해되어서는 아니 되고, 본 발명의 범위는 첨부된 청구범위에 의해 정의된다. 여기에 설명된 다양한 예시적인 실시형태의 특성은 달리 특정되지 않으면 서로 결합될 수 있음을 이해할 것이다.
도 1은 일반화된 맵 변환(12)을 갖는 데이터 병렬(DP) 코드(10)의 실시형태를 도시하는 컴퓨터 코드 다이어그램이다. 맵 변환(12)은 DP 알고리즘(14)과 하나 이상의 입력 인덱스가능 유형을 인수로 취하고, DP 알고리즘(14)을, 출력 인덱스가능 유형을 생성하기 위해 화살표(16)로 나타내는 바와 같은 입력 인덱스가능 유형(indexable type)의 세트에 적용하며, 화살표(18)로 나타내는 바와 같은 출력 인덱스가능 유형을 반환한다. 후술하는 바와 같이, 맵 변환(12)은 하나 이상의 DP 알고리즘(14)을 다른 DP 알고리즘(24)과 융합하기 위해 사용될 수 있다.
본 명세서에서 사용되는 바와 같이, 인덱스가능 유형은 음이 아닌 정수인 순위(rank)와 함께 하나 이상의 첨자 연산자(subscrupt operator)를 구현하는 임의의 데이터 유형이고 element_type로 표시된 유형이다. 인덱스 <N>이 N 튜플의 정수를 나타내는 유형(즉, 임의의 유형의 정수 데이터 유형)이면, 인덱스 <N>의 인스턴스는 N개 정수의 세트 {i0, il, ... , im}이고, 여기서 m은 N-1이다(즉, N-튜플). 순위 N의 인덱스 연산자는 인덱스 <N>의 N-튜플 인스턴스를 취하고 그 인스턴스를 엘리먼트 유형이라고 불리는 유형의 다른 인스턴스와 연관시키는데, 엘리먼트 유형은 인덱스가능 유형에서의 각각의 엘리먼트를 정의한다. 일 실시형태에서, 인덱스가능 유형은 다음의 연산자 중 하나 이상을 정의한다:
Figure pct00001
여기서, index _ declarator는 다음 중 적어도 하나의 형태를 취한다:
Figure pct00002
다른 실시형태에서 연산자는 함수, 함수들 또는 더 일반적인 표현일 수 있다. 인덱스가능 유형의 모양은, 위의 첨자 연산자 중 하나가 정의되는 인덱스<순위>의 세트이다. 인덱스가능 유형은 통상 폴리토프(polytope)인 모양을 갖는다-즉, 인덱스가능 유형은 좌표축의 선형 함수에 의해 형성되는 반-공간(half-space)의 유한 개수의 삽입으로 대수적으로(algebraically) 표현될 수 있다.
코드(10)는 하나 이상의 DP 최적 연산 노드(예를 들어, 도 4에 도시되고 아래에서 더 설명되는 DP 최적 연산 노드(121))에 의한 실행을 위한 하나 이상의 실행파일(executable)(예를 들어, DP 실행파일(138))로 컴파일 될 수 있는 고급 범용 또는 데이터 병렬 프로그래밍 언어로부터의 명령의 시퀀스를 포함한다. 코드(10)는 도 4에 도시되고 아래에 더 설명되는 DP 최적 연산 모듈(121)과 같은 하나 이상의 데이터 병렬(DP) 최적 연산 노드에 상에서의 최적 실행을 위해 구성된다.
일 실시형태에서, 코드(10)는 하나 이상의 모듈의 세트에 저장되는 프로그램을 형성하는 데이터 병렬 확장을 갖는 고급 범용 프로그래밍 언어(이하 GP 언어)로부터의 명령의 시퀀스를 포함한다. GP 언어는, 각각의 모듈이 컴퓨터 시스템에 의해 액세스가능한 별개 파일 또는 위치에 저장될 수 있도록 프로그램이 상이한 부분(즉, 모듈)에 기록될 수 있도록 할 수 있다. GP 언어는 하나 이상의 특별 목적, DP 최적 연산 노드와 하나 이상의 범용 프로세서를 포함하는 연산 환경을 프로그래밍하기 위한 단일 언어를 제공한다. DP 최적 연산 노드는 통상 범용 프로세서의 SIMD 유닛 또는 GPU일 수 있지만 범용 프로세서의 스칼라 또는 벡터 실행 유닛, FPGA(field programmable gate array), 또는 기타 일부 연산 환경의 적당한 장치를 포함할 수도 있다. GP 언어를 이용하여, 프로그래머는, 각각 범용 프로세서와 DP 연산 노드에 의한 실행을 위해 코드(10)에 범용 프로세서와 DP 소스 코드 모두를 포함시킬 수 있고, 범용 프로세서와 DP 소스 코드의 실행을 조정(coordinate)할 수 있다. 코드(10)는 이 실시형태에서 애플리케이션, 라이브러리 함수 또는 운영체제 서비스와 같은 임의의 적당한 코드 유형을 나타낼 수 있다.
GP 언어는 C 또는 C++과 같이 널리 채용되는 고급 및 범용 프로그래밍 언어를 데이터 병렬 특성을 포함하도록 확장함으로써 형성될 수 있다. DP 특성이 나타날 수 있는 범용 언어의 다른 예는 자바(Java™), PHP, 비주얼 베이직(Visual Basic), 펄(Perl), 파이톤(Python™), C#, 루비(Ruby), 델파이(Delphi), 포트란(Fortran), VB, F#, 오컴(OCaml), 하스켈(Haskell), 얼랭(Erlang), NESL, 채플(Chapel), 및 자바스크립트(JavaScript™)를 포함한다. GP 언어 구현은 프로그램의 상이한 부분이 상이한 모듈에 포함될 수 있도록 하는 리치 링킹(rich linking) 기능을 포함할 수 있다. 데이터 병렬 특성은, 데이터 병렬 연산이 범용 프로세서(즉, 비-DP 최적 연산 노드)에 의하는 경우에 비해 더 빠르거나 더 효율적으로 실행될 수 있도록 하는 DP 최적 연산 노드의 특별 목적 아키텍처를 이용하는 프로그래밍 도구를 제공한다. GP 언어는 프로그래머가 범용 프로세서와 DP 최적 연산 노드 모두를 위한 프로그램을 할 수 있도록 하는 다른 적당한 고급 범용 프로그래밍 언어일 수도 있다.
다른 실시형태에서, 코드(10)는 프로그램을 형성하는 고급 데이터 병렬 프로그래밍 언어(이하 DP 언어)로부터의 명령의 시퀀스를 포함한다. DP 언어는 하나 이상의 DP 최적 연산 노드를 갖는 연산 환경에서 DP 최적 연산 노드를 프로그래밍하기 위한 특화된 언어를 제공한다. DP 언어를 이용하여, 프로그래머는 코드(10)에서 DP 최적 연산 노드 상에서의 실행을 위해 의도된 DP 소스 코드를 생성한다. DP 언어는, 데이터 병렬 연산이 범용 프로세서에 의한 것보다 더 빠르게 또는 더 효율적으로 실행될 수 있도록 하기 위해 DP 최적 연산 노드의 특별 목적 아키텍처를 이용하는 프로그래밍 도구를 제공한다. DP 언어는, HLSL, GLSL, Cg, C, C++, NESL, 채플(Chapel), CUDA, OpenCL, 앨셀러레이터(Accelerator), Ct, PGI GPGPU 앨셀러레이터(Accelerator), CAPS GPGPU 앨셀러레이터(Accelerator), 브룩+(Brook+), CAL, APL, 포트란(Fortran) 90 (및 그 이상), 데이터 패러렐 C(Data Parallel C), DAPPLE, 또는 APL와 같은 기존 DP 프로그래밍 언어일 수 있다. 코드(10)는 이 실시형태에서 애플리케이션, 라이브러리 함수 또는 운영체제 서비스와 같은 DP 소스코드의 임의의 적당한 유형을 나타낼 수 있다.
코드(10)는 DP 최적 연산 노드 상에서의 실행을 위해 지정된 코드 부분을 포함한다. 코드(10)가 GP 언어로 기록되는 도 1의 실시형태에서, GP 언어는 벡터 함수를 정의하는 때에 프로그래머가 주석(예를 들어, _declspec(vector_func)...)을 이용하여 DP 소스 코드를 지정할 수 있도록 한다. 주석은 DP 최적 연산 노드 상에서 실행되도록 의도된 벡터 함수의 함수 이름(예를 들어, vector_func)과 연관된다. 코드(10)는 DP 알고리즘(24)의 호출(22)을 갖는 호출 사이트(call site)(20)(예를 들어, 전부(forall), 감소(reduce), 스캔(scan) 또는 정렬(sort))를 포함한다. 호출 사이트에 대응하는 벡터 함수는 커널 또는 커널 수라고 지칭된다. 커널 또는 커널 함수는 코드(10) 내에서 다른 벡터 함수(즉, 다른 DP 소스 코드)를 호출할 수 있고 벡터 함수 호출 그래프의 루트로 보일 수 있다. 커널 함수는 코드(10)에 의해 정의되는 유형(예를 들어, 클래스(class) 또는 구조체(struct))를 이용할 수도 있다. 유형은 DP 소스 코드로서 주석이 되거나 되지 않을 수 있다. 다른 실시형태에서, 다른 적당한 프로그래밍 언어 컨스트럭트(construct)가 DP 소스 코드 및/또는 범용 프로세서 코드로서 코드(10)의 부분을 지정하기 위해 사용될 수 있다. 또한, 코드(10)가 DP 언어로 쓰여지는 실시형태에서 주석은 생략될 수 있다.
호출 사이트(20)는 하나 이상의 맵 변환(12)을 포함하는 입력과 출력 인수(26)의 세트를 또한 포함한다. 도 2에 도시된 바와 같이, 컴파일되고 실행되는 때에 맵 변환(12)은 DP 알고리즘(14)과 하나 이상의 입력 인덱스가능 유형(32)의 세트를 인수로 취하고, 출력 인덱스가능 유형(34)을 생성하기 위해 화살표(16)에 의해 나타내는 바와 같이 입력 인덱스가능 유형(32)의 세트에 DP 알고리즘을 적용하며, 화살표(18)에 의해 나타내는 바와 같이 출력 인덱스가능 유형(34)을 반환한다. 일부 실시형태에서, 출력 인덱스가능 유형(34)은 입력 인덱스가능 유형(32) 중 하나와 동일할 수 있다. 호출 사이트(20)의 인수(26)의 세트에 맵 변환(12)을 포함시킴으로써, 맵 변환(12)은 DP 알고리즘(14) 뿐만 아니라 다른 DP 알고리즘(미도시)이 DP 알고리즘(24)과 융합될 수 있도록 한다. DP 알고리즘(14와 24)을 융합함으로써, 호출 사이트(20)로부터의 단일 함수 또는 커널 호출로서 DP 최적 연산 장치 상에서 실행될 수 있는 단일 알고리즘을 형성하기 위해 DP 알고리즘(14와 24)이 결합된다. 결합 알고리즘은 성능을 강화하기 위해 강화된 공간 및 시간 데이터 국지성(locality)을 이용할 수 있다.
맵 변환(12)은 임의의 적당한 방식으로 표현될 수 있다. 예를 들어, 맵 변환(12)의 일반화된 형식은 다음과 같이 표현될 수 있다:
Figure pct00003
여기서 elementary_function은 입력 인덱스가능 유형 IT 1 내지 IT N 의 세트 상에서 동작하는 커널 함수(예를 들어, DP 알고리즘(14))의 이름이고, N은 1과 같거나 큰 정수(예를 들어, 도 2에 도시된 입력 인덱스가능 유형(32))이다. 입력 인덱스가능 유형의 세트로부터, 맵 변환(12)은 출력 인덱스가능 유형(예를 들어, 도 2에 도시된 출력 인덱스가능 유형(34))을 반환한다.
맵 변환(12)의 일반화된 형태의 추가적인 상세를 이제 설명한다. element_type1,...element_typen은 n개의 데이터 병렬(DP) 스칼라 유형이라고 하자. 여기서 DP 스칼라 유형은 일 실시형태에서 C++ POD 구조체 연산(C++0x 작업 드래프트(working draft) 표준 - 문서 N3126: http://www.open-std.org/JTC 1/SC22/WG21/docs/papers/2010/n3126.pdf의 섹션 9.0.9 참조) 하에서의 근원(fundamental) C++ 유형의 트랜지티브 클로저(transitive closure)(문서 N3126의 섹션 3.9.1. 참조)이다. 그러나, 더 일반적인 데이터 유형이 배제되지 않고 다른 실시형태에서 사용될 수 있다. 이들 n개 유형은 또한 n개 인덱스가능 유형 indexable_type1,..., indexable_typen의 엘리먼트 유형이다. 달리 말하면, indexable_type1::element_type,..., indexable_typen::element_type 은 element_type1,..., element_typen과 동일하다. 이들 인덱스가능 유형은 모두 동일한 순위 N을 갖는다고 가정하자. (indexable_typek 표시방식은 유형을 지칭할 수 있거나, 대응 유형의 인스턴스를 지칭할 수 있으나, 그 사용은 문맥상 명확하지 않다.)
다음 함수를 고려하자:
Figure pct00004
. 맵 함수(12)의 일반적 형태는 순위 N의 인덱스가능 유형을 형성하기 위해 indexable_type1,..., indexable_typen의 인스턴스에 대해 동작하도록 elementary_function을 리프트한다. 새로운 인덱스가능 유형은 아래와 같을 수 있다.
Figure pct00005
여기서, 인덱스 연산자는 다음의 형태를 취한다.
Figure pct00006
Figure pct00007
주어진 순위 N에 대해, DP 스칼라 유형을 반환하는 DP 스칼라 유형의 함수, elementary_function는 순위 N의 인덱스가능 유형에 대하여 동작하도록 리프트될 수 있는데, 그의 엘리먼트 유형은 elementary_function의 인수를 형성하는 DP 스칼라 유형이다. elementary_function의 리프트는 순위 N의 인덱스가능 유형을 형성하는데, 그의 엘리먼트 유형은 elementary_function의 반환 유형과 동일하다. 리프트의 동작은 상기 인덱스 연산자를 통한다.
리프트의 구현을 이제 일 실시형태를 참조하여 설명한다. 본 실시형태에서, 맵(elementary_function)은 class_map_abstrat_type의 인스턴스를 생성한다. class_map_abstrat_type은 elementary_function과 동일한 수의 인수를 갖는 함수 호출 연산자를 갖는다. 인덱스가능 유형이 대응하는 elementary_function의 인수와 동일한 엘리먼트 유형을 갖고 인덱스가능 유형이 모두 동일한 순위를 갖는다고 할 때, 함수 호출 연산자의 인수는 임의의 인덱스가능 유형이 전달될 수 있도록 하는 추상 템플릿 파라미터 유형이다. 함수 호출 연산자의 반환 유형은 인덱스가능 유형 map_type이다. C++0x 배리어딕(variadic) 템플릿을 이용하여, map_abstract_type의 구현은 다음의 형태를 취한다.
Figure pct00008
Figure pct00009
다음 팩토리 메소드 맵은 map_abstract_type의 인스턴스를 생성하기 위해 사용된다.
Figure pct00010
달리 말하면, map (elementary_function)(indexable_type1,..., indexable_typen)은 map_type의 인스턴스이다. 제1 인수(elementary_function)는 map_abstract_type의 인스턴스를 제시하고, 인수(indexable_type1,..., indexable_typen)의 제2 세트는 map_abstract_type의 함수 호출 연산자를 호출한다. 함수 호출 연산자는 제1 및 제2 인수 세트 모두에 대응하는 map_type의 인스턴스를 반환한다.
map_type의 구현에서, 다음과 같이, 인덱스가능 유형의 공통 순위 'rank'가 결정되고 그 후 elementary_function의 반환 type_Return_type은 배리어딕 템플릿 메타 프로그래밍을 통해 결정된다.
Figure pct00011
템플릿 파라미터 팩 _Kernel_argument_types에 의해 형성되는 element_type의 인덱스가능 유형의 부분적 인스턴스를 생성함으로써 형성된 인수 목록에 대한 유형 _Kernel_type의 부분적 인스턴스의 부분적 호출을 구현하기 위해 decltype을 이용하여 typedef_Ret_type이 결정된다. 또한 get_rank는 파라미터 팩 _K ernel_argument_type으로부터의 제1 템플릿 인수를 언패킹(unpack)하고 결과적인 인덱스가능 유형의 순위를 반환한다. 또한, declval<T>()는 decltype 유형 추론에서 부분적 이벨류에이션(partial evaluation)에 적합한 T의 부분적 인스턴스를 생성한다.
map(elementary_function)을 인덱스가능 유형 인스턴스에 적용함에 있어, map(elementary_function)(indexable_type1,..., indexable_typen)은 map_type 컨스트럭터 호출이다. 인수 목록 (indexable type1,..., indexable_typen)은 map_type의 멤버로 저장되기 위해 C++ 튜플 'std::tuple m_args'로 번역되는 함수 파라미터 팩이다. map_type의 인덱스 연산자는 표준 C++0x 기술을 이용하여 m_args를 파라미터 팩(설명의 편의를 위해 여전히 m_args라고 명명된다)으로 변환함으로써 구현된다. 그러면, 파라미터 팩의 모든 엘리먼트는 입력 인수 'const index<rank>& Index'에서 인덱스 연산자로 계산되고, 이는 element_type1,..., element_typen의 파라미터 팩을 도출한다. 그 후 파라미터 팩은 elementary_function에 의해 이벨류에이션되고 반환된다. map_type의 구현의 표시방법에서, 인덱스 연산자는 다음을 반환한다:
Figure pct00012
일 실시형태에서, 전체 구현은 다음의 형태를 취한다.
Figure pct00013
Figure pct00014
맵 변환의 반환된 인덱스가능 유형은 도 3a에 도시된 바와 같이 호출 사이트 커널(예를 들어, DP 알고리즘(24))에 대한 인수(26), 도 3b에 도시된 바와 같은 호출 사이트 커널의 출력 인덱스가능 유형 또는 도 3c에 도시된 바와 같은 호출 사이트(20) 내 다른 맵 함수(12')에 대한 인수로 기능할 수 있다.
도 3a에 도시된 바와 같이, 맵 변환(12)의 출력 인덱스가능 유형(34)은 호출 사이트(20)에서 인수(26)로서 특정되는 0 또는 그 이상의 다른 입력 인덱스가능 유형(40)의 세트와 함께 DP 알고리즘(24)의 입력 인덱스가능 유형으로서 사용될 수 있다. 이렇게 하기 위해, 호출 사이트(20)는 입력 인덱스가능 유형(32)의 세트 상의 맵 변환(12)을 인수(26)로서 특정한다. DP 알고리즘(24)은 출력 인덱스가능 유형(34)과 입력 인덱스가능 유형(40)으로부터 출력 인덱스가능 유형(42)을 생성하고 출력 인덱스가능 유형(42)을 반환한다. 각각의 입력 인덱스가능 유형(32)은 맵 변환(12)으로 제공되기 전에 하나 이상의 다른 맵 변환(미도시)을 겪을 수 있고, 각각의 입력 인덱스가능 유형(40)은 DP 알고리즘(24)에 제공되기 전에 하나 이상의 대른 맵 변환(미도시)을 또한 겪을 수 있으며, 출력 인덱스가능 유형(42)은 DP 알고리즘(24)에 의해 반환되기 전에 하나 이상의 다른 맵 변환(미도시)을 겪을 수 있다.
도 3b에 도시된 바와 같이, 입력 인덱스가능 유형(50)의 세트로부터 DP 알고리즘(24)에 의해 생성되는 출력 인덱스가능 유형(52)은 맵 변환(12)의 입력 인덱스가능 유형(32)의 세트 중 하나로 사용될 수 있다. 그렇게 하기 위해, 호출 사이트(20)는 DP 알고리즘(24)의 출력 인덱스가능 유형(52)을 포함하는 입력 인덱스가능 유형(32)의 세트 상의 맵 변환(12)을 특정한다. DP 알고리즘(14)은 출력 인덱스가능 유형(52)을 포함하는 입력 인덱스가능 유형(32)의 세트로부터 출력 인덱스가능 유형(34)을 생성하고 출력 인덱스가능 유형(34)을 반환한다. 각각 입력 인덱스가능 유형(50)은 DP 알고리즘(24)에 제공되기 전에 하나 이상의 다른 맵 변환(미도시)을 겪을 수 있고, 각각의 입력 인덱스가능 유형(32)(인덱스가능 유형(52)을 포함)은 또한 맵 변환(12)으로 제공되기 전에 하나 이상의 다른 맵 변환(미도시)을 겪을 수 있으며, 출력 인덱스가능 유형(34)은 맵 변환(12)에 의해 반환되기 전에 하나 이상의 다른 맵 변환(미도시)을 겪을 수 있다.
도 3c는 맵 변환(12)의 출력 인덱스가능 유형(34) 상의 맵 변환(12')의 사용을 도시한다. 특히, 맵 변환(12)의 출력 인덱스가능 유형(34)은 출력 인덱스가능 유형(34')을 생성하기 위해 맵 변환(12')의 하나 이상의 입력 인덱스가능 유형(32')의 세트 중 하나로서 사용될 수 있다. 더 일반적으로, 도 3c는 다수의 맵 변환(12)이 호출 사이트(20)에서 각각의 인수(26)에 대해 입력 인덱스가능 유형(32)의 하나 이상의 세트에 적용될 수 있음을 도시한다.
이제 맵 변환(12)은 몇몇의 예로써 설명될 것이다. 첫 번째 예에서, 다음의 코드 부분이 A*(sin(B)+exp(-C))을 이벨류에이션하기 위해 정의되는데, 여기서 A, B 와 C는 인덱스가능 유형이다.
Figure pct00015
상기한 일반화된 형태로 맵 변환(12)을 이용하면:
-C는 map(_uminus)(C)로 표현될 수 있고;
exp(-C)는 map(_exp)(map(_uminus)(C))로서 표현될 수 있고;
sin(B)는 map(_sin)(B)로 표현될 수 있으며; 따라서,
sin(B)+exp(-C)는 다음과 같이 표현될 수 있다.
map(_add)(map(_sin)(B),map(_exp)(map(_uminus)(C))
따라서, 아래의 호출 사이트는, A*(sin(B)+exp(-C)를 계산하기 위해 uminus, exp, sin 및 add에 의해 정의되는 커널들을 융합하기 위해 맵 변환을 이용할 수 있다.
forall(A.get_extent(), _mxm, D, A, map(_add)(map(_sin)(B),
map(_exp)(map(_uminus)(C))));
다른 예로서, 아래의 행렬 곱셈 커널이 정의될 수 있다.
Figure pct00016
D=(A+B)*C를 계산하기 위해, 제1 행렬 덧셈 커널을 형성하도록 아래의 맵 변환(12)이 정의될 수 있다.
Figure pct00017
이 맵 변환(12) 및 위의 행렬 곱셈 커널을 이용하여, 행렬 곱셈 커널을 맵 변환(12)에 의해 정의되는 제1 행렬 덧셈 커널과 융합함으로써 D=(A+B)*C를 계산하기 위해 다음의 호출 사이트가 사용될 수 있다.
forall(D.get_grid(), mxm, D, morph_input(A, B), C);
D=A*B+C를 계산하기 위해, 제2 행렬 덧셈 커널을 형성하도록 다음의 맵 변환(12)이 정의될 수 있다.
Figure pct00018
이 맵 변환(12) 및 상기 행렬 곱셈 커널을 이용하여, 행렬 곱셈 커널을 맵 변환(12)에 의해 정의되는 제2 행렬 덧셈 커널과 융합함으로써 D=A*B+C를 계산하기 위해 다음 호출 사이트가 사용될 수 있다.
forall(D.get_grid(), mxm, morph_output(D, C), A, B);
위의 예에서, morph_input의 인덱스 연산자:
const float operator[] (const index<2>& Index) const;
는 값에 의해(by-value) 반환한다.
반면, morpht_output의 인덱스 연산자:
float& operator[] (const index<2>& Index);
는 참조에 의해(by-referene)(즉, lvalue와 참조에 의해(by-lvalue-reference)) 반환한다.
맵 변환에 의해 리프트되고 있는 커널의 출력 유형(즉, morph_input 또는 morpht_output)이 l-value 참조에 의해 반환하는 때에, 커널의 인덱스 연산자는 l-value 참조에 의해 반환할 수 있다. 유사하게, 맵 변환에 의해 리프트되고 있는 커널의 출력 유형이 r-value 참조에 의해 반환하는 때에, 커널의 인덱스 연산자는 r-value 참조에 의해 반환할 수 있다. 유사하게, 맵 변환에 의해 리프트되고 있는 커널의 출력 유형이 값에 의해 반환하는 때에, 커널의 인덱스 연산자는 값에 의해 반환할 수 있다. 템플릿 메타-프로그래밍 기술, 구체적으로 SFINAE 및 CRTP를 이용하여, 리프트된 커널의 반환 특성이 분석되고 인덱스 연산자의 구현을 제공하는 기본 클래스가 적절하게 변경된다.
더 일반적으로, 캡슐화되고 있는 연산이 다음 함수라고 하자:
Figure pct00019
그러면, 입력 맵 변환(12)에 대한 캡슐화 인덱스가능 유형(morph_input)은 다음과 같다:
Figure pct00020
Figure pct00021
출력 맵 변환(12)(morph output)에 대해, 캡슐화 인덱스가능 유형은 다음과 같다:
Figure pct00022
Figure pct00023
상기 캡슐화 인덱스가능 유형으로, D=(A+B)*C에 대한 구현은 다음의 형태를 취한다.
Figure pct00024
이 구현 형태에서, 매핑되는 커널은 auto lambda_in = [=](const index<2>& idx, float fin)->float{ return (B[idx] + fin);} 인데, 이는 다음의 요소 커널의 변환이고, 여기서 변환의 목적은 람다 표현에서 'B'를 포착하는 것이다.
Figure pct00025
유사하게, D=A*B+C에 대한 구현은 다음의 형태를 취한다.
Figure pct00026
이 구현 형태에서, 매핑되는 커널은 auto lambda out = [=](const index<2>& idx, float fm)->float{ return (C[idx] + fin);}이고, 이는 다음의 요소 커널의 변환이고, 여기서 변환의 목적은 람다 표현에서 'C'를 포착하는 것이다.
Figure pct00027
상기 예의 람다 표현은 참조되는 데이터 전부를 포착함으로써 작동한다. 그러므로, lambda_in은 B를 포착하고, lambda_out은 C를 포착한다. 다른 실시형태에서, B 또는 C의 포착이 명시적인 이상 함수-호출 연산자를 갖는 클래스도 사용될 수 있다. 주 목적이 함수-호출 연산자를 노출시키는 것인 클래스는 펑터(funtor)라고 알려져 있다. C++ 0x 람다 표현의 구현은 컴파일러 생성 펑터 클래스에 의한다.
성능상의 이유로, morph_input 인덱스가능 유형 클래스의 인덱스 연산자는 최적으로는 lvalue-참조에 의해 반환할 것이다. 그러나 이는 lvalue-참조에 의해 반환하는 입력 펑터에 의존한다. 다음으로 최적인 경우는 rvalue-참조에 의해 반환하는 것인데, 이는 다시 rvalue-참조에 의해 반환하는 입력 펑터에 의존한다. 최종적으로, 입력 펑터가 값에 의해 반환하면, 모프 입력(morph input) 수도-필드(pseudo-field) 클래스는 값에 의해 반환한다. 이 기능은 다음 클래스를 형성함으로서 자동으로 인에이블된다.
Figure pct00028
여기서 Conditional_Base는 morph_input이 특화된 람다 표현의 반환 유형에 따라 다음 중 하나이다:
lvalue_morph_input
rvalue_morph_input
byvalue_morph_input
도 4는 맵 변환(12)을 포함하는 데이터 병렬 코드(10)를 컴파일하고 실행하도록 구성된 컴퓨터 시스템(100)의 실시형태를 도시하는 블록도이다.
컴퓨터 시스템(100)은 하나 이상의 프로세서 패키지(미도시) 내에 하우징된 하나 이상의 처리 요소(processing element)(PE)(102)와 메모리 시스템(104)을 갖는 호스트(101)를 포함한다. 컴퓨터 시스템(100)은 0개 이상의 입력/출력 장치(106), 0개 이상의 디스플레이 장치(108), 0개 이상의 주변 장치(110) 및 0개 이상의 네트워크 장치(112)도 포함한다. 컴퓨터 시스템(100)은 하나 이상의 DP 최적 연산 노드(121)를 갖는 연산 엔진(120)을 더 포함하는데, 여기서 각각의 DP 최적 연산 노드(121)는 하나 이상의 처리 요소(PE)(122)의 세트와 DP 실행파일(138)을 저장하는 메모리(124)를 포함한다.
호스트(101), 입력/출력 장치(106), 디스플레이 장치(108), 주변 장치(110), 네트워크 장치(112) 및 연산 엔진(120)은 임의의 적당한 유형, 개수 및 구성의 제어기, 버스, 인터페이스, 및/또는 다른 유선 또는 무선 접속을 포함하는 상호접속(114)의 세트를 이용하여 통신한다.
컴퓨터 시스템(100)은 범용 또는 특정 목적을 위해 구성된 임의의 적당한 처리 장치를 나타낸다. 컴퓨터 시스템(100)의 예는 서버, 퍼스널 컴퓨터, 랩톱 컴퓨터, 태블릿 컴퓨터, 스마트폰, PDA(personal digital assistant), 이동 전화 및 오디오/비디오 장치를 포함한다. 컴퓨터 시스템(100)의 컴포넌트(즉, 호스트(101), 입력/출력 장치(106), 디스플레이 장치(108), 주변 장치(110), 네트워크 장치(112), 상호접속(114) 및 연산 엔진(120))은 공통 하우징(미도시)에 포함되거나 임의의 적당한 수의 개별 하우징(미도시)에 포함될 수 있다.
처리 요소(102) 각각은 메모리 시스템(104)에 저장된 명령(즉, 소프트웨어)을 실행하도록 구성된 실행 하드웨어를 형성한다. 각각의 프로세서 패키지 내의 처리 요소(102)는 동일 또는 상이한 아키텍처 및/또는 명령 세트를 가질 수 있다. 예를 들어, 처리 요소(102)는 인오더(in-order) 실행 요소, 수퍼스칼라 실행 요소 및 데이터 병렬 실행 요소(예를 들어, GPU 실행 요소)의 임의의 조합을 포함할 수 있다. 각각의 처리 요소(102)는 메모리 시스템(104)에 저장된 명령을 액세스 및 실행하도록 구성된다. 명령은 BIOS(basic input output system) 또는 펌웨어(미도시, OS(operating system)(132), 코드(10), 컴파일러(134), GP 실행파일(136) 및 DP 실행파일(138)을 포함할 수 있다. 각각의 처리 요소(102)는 입력/출력 장치(106), 디스플레이 장치(108), 주변 장치(110), 네트워크 장치(112) 및/또는 연산 엔진(120)으로부터 수신된 정보와 결합하여 또는 그에 응답하여 명령을 실행할 수 있다.
호스트(101)는 OS(132)를 부팅하고 실행한다. OS(132)는 컴퓨터 시스템(100)의 컴포넌트를 관리하기 위해 처리 요소에 의해 실행가능한 명령을 포함하고 프로그램이 컴포넌트를 액세스 및 사용할 수 있도록 하는 명령의 세트를 제공한다. 일 실시형태에서, OS(132)는 윈도우즈(Windows) 운영체제이다. 다른 실시형태에서, OS(132)는 컴퓨터 시스템(100)과 사용하기에 적합한 다른 운영체제이다.
컴퓨터 시스템이 코드(10)를 컴파일하기 위해 컴파일러(134)를 실행하는 때에, 컴파일러(134)는 하나 이상의 실행파일-예를 들어, 하나 이상의 GP 실행파일(136)과 하나 이상의 DP 실행파일(138)을 생성한다. 다른 실시형태에서, 컴파일러(134)는 각각 하나 이상의 DP 실행파일(138)을 포함하도록 하나 이상의 GP 실행파일(136)을 생성할 수 있거나, 임의의 GP 실행파일(136)을 생성하지 않고 하나 이상의 DP 실행파일(138)을 생성할 수 있다. 코드(10)의 전부 또는 선택된 부분을 컴파일하기 위해, 데이터 병렬 확장을 이용하여 컴파일러(134)의 호출에 응답하여 GP 실행파일(136) 및/또는 DP 실행파일(138)이 생성된다. 호출은, 예를 들어, 컴퓨터 시스템(100)의 프로그래머 또는 다른 사용자, 컴퓨터 시스템(100) 내의 다른 코드, 또는 다른 컴퓨터 시스템(미도시) 내의 다른 코드에 의해 생성될 수 있다.
GP 실행파일(136)은 하나 이상의 범용 처리 요소(102)(예를 들어, CPU(cetral processing unit)) 상에서의 실행을 위해 의도된 프로그램을 나타낸다. GP 실행파일(136)은 하나 이상의 범용 처리 요소(102)의 명령 세트로부터의 저급(low level) 명령을 포함한다.
DP 실행파일(138)은 하나 이상의 데이터 병렬(DP) 최적 연산 노드(121) 상에서의 실행을 위해 의도되고 최적화되는 데이터 병렬 프로그램 또는 알고리즘(예를 들어, 셰이더)을 나타낸다. 일 실시형태에서, DP 실행파일(138)은 DP 바이트 코드 또는, DP 최적 연산 노드(121) 상에서 실행되기 전에 장치 드라이버(미도시)를 이용하여 DP 최적 연산 노드(121)의 명령 세트로부터의 저급 명령으로 변환되는 소정의 다른 중간 표현(intermediate representation)(IL)을 포함한다. 다른 실시형태에서, DP 실행파일(138)은 하나 이상의 DP 최적 연산 노드(121)의 명령 세트로부터의 저급 명령을 포함하는데, 여기서 저급 명령이 컴파일러(134)에 의해 삽입되었다. 따라서, GP 실행파일(136)은 하나 이상의 범용 프로세서(예를 들어, CPU)에 의해 직접 실행가능하고, DP 실행파일(138)은 하나 이상의 DP 최적 연산 노드(121)에 의해 직접 실행가능하거나 DP 최적 연산 노드(121)의 저급 명령으로 변환된 후에 하나 이상의 DP 최적 연산 노드(121)에 의해 실행가능하다.
컴퓨터 시스템(100)은 하나 이상의 처리 요소(102)를 이용하여 GP 실행파일을 실행할 수 있고, 컴퓨터 시스템(100)은 아래에서 더 설명되는 바와 같이 하나 이상의 PE(122)를 이용하여 DP 실행파일(138)을 실행할 수 있다.
메모리 시스템(104)은 명령과 데이터를 저장하도록 구성된 임의의 적당한 유형, 개수 및 구성의 휘발성 또는 비휘발성 저장 장치를 포함한다. 메모리 시스템(104)의 저장 장치는 OS(132), 코드(10), 컴파일러(134), GP 실행파일(136) 및 DP 실행파일(138)을 포함하는 컴퓨터 실행가능 명령(즉, 소프트웨어)을 저장하는 컴퓨터 판독가능 저장 매체를 나타낸다. 명령은 여기에 설명된 바와 같은, OS(132), 코드(10), 컴파일러(134), GP 실행파일(136) 및 DP 실행파일(138)의 함수와 메소드를 수행하기 위해 컴퓨터 시스템(100)에 의해 실행가능하다. 메모리 시스템(104)은 처리 요소(102), 입력/출력 장치(106), 디스플레이 장치(108), 주변 장치(110), 네트워크 장치(112) 및 연산 엔진(120)으로부터 수신된 명령과 데이터를 저장한다. 메모리 시스템(104)은 처리 요소(102), 입력/출력 장치(106), 디스플레이 장치(108), 주변 장치(110), 네트워크 장치(112) 및 연산 엔진(120)으로 저장된 명령과 데이터를 제공한다. 메모리 시스템(104) 내의 저장 장치의 예는 하드 디스크 드라이브, RAM(random access memory), ROM(read only memory), 플래시 메모리 드라이브와 카드, 및 CD와 DVD 같은 자기 및 광 디스크를 포함한다.
입력/출력 장치(106)는 사용자로부터 컴퓨터 시스템(100)으로 명령이나 데이터를 입력하고 컴퓨터 시스템(100)으로부터 사용자에게 명령이나 데이터를 출력하도록 구성된, 임의의 적당한 유형, 개수 및 구성의 입력/출력 장치를 포함한다. 입력/출력 장치(106)의 예는 키보드, 마우스, 터치패드, 터치스크린, 버튼, 다이얼, 손잡이(knob) 및 스위치를 포함한다.
디스플레이 장치(108)는 컴퓨터 시스템(100)의 사용자에게 텍스트 및/또는 그래픽 정보를 출력하도록 구성된 임의의 적당한 유형, 개수 및 구성의 디스플레이 장치를 포함한다. 디스플레이 장치(108)의 예는 모니터, 디스플레이 스크린 및 프로젝터를 포함한다.
주변 장치(110)는 일반적인 또는 특별한 처리 기능을 수행하기 위해 컴퓨터 시스템(100)에서 하나 이상의 다른 컴포넌트와 동작하도록 구성된 임의의 적당한 유형, 개수 및 구성의 주변 장치를 포함한다.
네트워크 장치(112)는 컴퓨터 시스템(100)이 하나 이상의 네트워크(미도시)를 통해 통신할 수 있게 하도록 구성된, 임의의 적당한 유형, 개수 및 구성의 네트워크 장치를 포함한다. 네트워크 장치(112)는, 정보가 네트워크로부터 컴퓨터 시스템(100)에 의해 수신되거나 네트워크로 컴퓨터 시스템(100)에 의해 송신될 수 있게 하도록 임의의 적당한 네트워킹 프로토콜 및/또는 구성에 따라 동작할 수 있다.
연산 엔진(120)은 DP 실행파일(138)을 실행하도록 구성된다. 연산 엔진(120)은 하나 이상의 연산 노드(121)를 포함한다. 각각의 연산 노드(121)는 메모리 계층을 공유하는 연산 자원의 집합이다. 각각의 연산 노드(121)는 하나 이상의 PE(122)의 세트와 DP 실행파일(138)을 저장하는 메모리(124)를 포함한다. PE(122)는 DP 실행파일(138)을 실행하고 메모리(124)에 DP 실행파일에 의해 생성된 결과를 저장한다. 구체적으로, PE(122)는 도 4에 도시되고 위에서 설명된 바와 같이 출력 인덱스가능 유형(34)의 세트를 생성하기 위해 입력 인덱스가능 유형(32)의 세트에 맵 변환(12)을 적용하도록 DP 실행파일(138)을 실행한다.
데이터 병렬 연산(즉, DP 프로그램 또는 알고리즘의 실행)에 최적화되는 하드웨어 아키텍처를 갖는 하나 이상의 연산 자원을 갖는 연산 노드(121)는 DP 최적 연산 노드(121)라고 지칭된다. DP 최적 연산 노드(121)의 예는, PE(122)의 세트가 하나 이상의 GPU를 포함하는 노드(121)와, PE(122)의 세트가 범용 프로세서 패키지 내에 SIMD 유닛의 세트를 포함하는 노드(121)를 포함한다. 데이터 병렬 연산에 대해 최적화된 하드웨어 아키텍처를 갖는 임의의 연산 자원도 갖지 않는 연산 노드(121)(예를 들어, 범용 처리 요소(102)만 갖는 프로세서 패키지)는 비-DP 최적 연산 노드(121)라고 지칭된다. 각각의 연산 노드(121)에서, 메모리(124)는 메모리 시스템(104)(예를 들어, GPU에 의해 사용되는 GPU 메모리)로부터 분리되거나 메모리 시스템(104)의 부분(예를 들어, 범용 프로세서 패키지에서 SIMD 유닛에 의해 사용되는 메모리)일 수 있다.
호스트(101)는 상호접속(114)을 이용하여 실행을 위해 연산 노드(121)에 DP 실행파일(138)을 제공하고 DP 실행파일(138)에 의해 생성되는 결과를 수신하도록 구성되는 호스트 연산 노드를 형성한다. 호스트 연산 노드는 메모리 계층(즉, 메모리 시스템(104))을 공유하는 범용 연산 자원(즉, 범용 처리 요소(102))의 집합을 포함한다. 호스트 연산 노드는 SMP(symmetric multiprocessing architecture)로써 구성될 수 있고, 예를 들어 NUMA(non-uniform memory access) 아키텍처를 이용하여 메모리 시스템(104)의 메모리 국지성을 최대화하도록 구성될 수도 있다.
호스트 연산 노드의 OS(132)는 DP 최적 또는 비-DP 최적 연산 노드(121)에 의해 DP 실행파일(138)이 실행되게 하기 위해 DP 호출 사이트를 실행하도록 구성된다. 메모리(124)가 메모리 시스템(104)과 별개인 실시형태에서, 호스트 연산 노드는 DP 실행파일(138)과 하나 이상의 인덱스가능 유형(14)이 메모리 시스템(104)으로부터 메모리(124)로 복사되도록 한다. 메모리 시스템(104)이 메모리(124)를 포함하는 실시형태에서, 호스트 연산 노드는 메모리 시스템(104) 내의 DP 실행파일(138) 및/또는 하나 이상의 인덱스가능 유형(14)의 사본을 메모리(124)로서 지정할 수 있고 및/또는 메모리 시스템(104)의 한 부분으로부터 메모리(124)를 형성하는 메모리 시스템(104)의 다른 부분으로 DP 실행파일(138) 및/또는 하나 이상의 인덱스가능 유형(14)을 복사할 수 있다. 연산 노드(121)와 호스트 연산 노드 사이의 복사 프로세서는, 비동기적이라고 지정되지 않으면, 동기화 지점이다.
호스트 연산 노드와 각각의 연산 노드(121)는 서로에 대해 독립적으로 코드를 동시에 실행할 수 있다. 호스트 연산 노드와 각각의 연산 노드(121)는 노드 연산을 조정하기 위해 동기화 지점에서 상호작용할 수 있다.
일 실시형태에서, 연산 엔진(120)은, 하나 이상의 GPU(graphics processing unit)가 PE(122), 및 메모리 시스템(104)과 별개인 메모리(124)를 포함하는 그래픽 카드를 나타낸다. 이 실시형태에서, 그래픽 카드의 드라이버(미도시)는 DP 실행파일(138)의 바이트 코드 또는 소정의 다른 중간 표현(IL)을 GPU의 PE(122)에 의한 실행을 위한 GPU의 명령 세트로 변환할 수 있다.
다른 실시형태에서, 하나 이상의 범용 처리 요소(102)를 갖는 프로세서 패키지에 포함되는 하나 이상의 GPU(즉, PE(122))와 메모리(124)를 포함하는 메모리 시스템(104)의 부분의 조합으로부터 연산 엔진(120)이 형성된다. 이 실시형태에서, DP 실행파일(138)의 바이트 코드 또는 소정의 기타 중간 표현(IL)을 프로세서 패키지 내의 GPU의 명령 세트로 변환하기 위해 추가의 소프트웨어가 컴퓨터 시스템(100) 상에서 제공될 수 있다.
추가의 실시형태에서, 처리 요소(102)를 포함하는 하나 이상의 프로세서 패키지 내의 하나 이상의 SIMD 유닛과 메모리(124)를 포함하는 메모리 시스템(104)의 일부의 조합으로부터 연산 엔진(120)이 형성된다. 이 실시형태에서, DP 실행파일(138)의 바이트 코드 또는 소정의 기타 중간 표현(IL)을 프로세서 패키지 내의 SIMD 유닛의 명령 세트로 변환하기 위해 추가의 소프트웨어가 컴퓨터 시스템(100) 상에서 제공될 수 있다.
또 다른 실시형태에서, 처리 요소(102)를 포함하는 하나 이상의 프로세서 패키지 내의 하나 이상의 스칼라 또는 벡터 처리 파이프라인과 메모리(124)를 포함하는 메모리 시스템(104)의 일부의 조합으로부터 연산 엔진(120)이 형성된다. 이 실시형태에서, DP 실행파일(138)의 바이트 코드 또는 소정의 기타 중간 표현(IL)을 프로세서 패키지 내의 스칼라 처리 파이프라인의 명령 세트로 변환하기 위해 추가의 소프트웨어가 컴퓨터 시스템(100) 상에서 제공될 수 있다.
구체적인 실시형태가 여기서 도시되고 설명되었지만, 다양한 대안적인 및/또는 균등한 구현이 본 발명의 범위를 벗어남이 없이 도시되고 설명된 구체적인 실시형태를 대체할 수 있음을 당업자는 인식할 것이다. 본 출원은 여기서 논의된 구체적인 실시형태의 임의의 적응(adaptation) 또는 변형을 포괄하려는 것이다. 그러므로, 본 발명은 청구범위 및 그 균등물에 의해서만 제한되는 것으로 의도된다.

Claims (20)

  1. 컴퓨터 시스템에 의해 컴파일되고 실행될 경우, 방법을 수행하는 컴퓨터 실행가능 명령어를 저장하는 컴퓨터 판독가능 저장 매체로서,
    상기 방법은,
    하나 이상의 데이터 병렬 연산 노드 상에서의 실행을 위해 구성된 데이터 병렬 소스 코드 내의 호출 사이트에 인수(argument)로 포함되는 제1 맵 변환에 응답하여 제1 출력 인덱스가능(indexable) 유형을 생성하도록 입력 인덱스가능 유형의 제1 세트에 제1 데이터 병렬 알고리즘을 적용하는 단계와,
    제2 출력 인덱스가능 유형을 생성하도록 상기 제1 출력 인덱스가능 유형에 상기 호출 사이트에 의해 특정되는 제2 데이터 병렬 알고리즘을 적용하는 단계
    를 포함하는, 컴퓨터 판독가능 저장 매체.
  2. 제 1 항에 있어서,
    상기 방법은
    상기 제2 출력 인덱스가능 유형을 생성하기 위해 상기 제1 출력 인덱스가능 유형과 입력 인덱스가능 유형의 제2 세트에 상기 제2 데이터 병렬 알고리즘을 적용하는 단계를 더 포함하는
    컴퓨터 판독가능 저장 매체.
  3. 제 1 항에 있어서,
    상기 방법은
    상기 호출 사이트에 상기 인수로 포함되는 제2 맵 변환에 응답하여 입력 인덱스가능 유형의 상기 제1 세트 중 하나를 생성하도록 입력 인덱스가능 유형의 제2 세트에 제3 데이터 병렬 알고리즘을 적용하는 단계를 더 포함하는
    컴퓨터 판독가능 저장 매체.
  4. 제 1 항에 있어서,
    입력 인덱스가능 유형의 상기 제1 세트의 각각은 해당 순위와 해당 엘리먼트(element) 유형을 포함하는
    컴퓨터 판독가능 저장 매체.
  5. 제 1 항에 있어서,
    상기 제1 맵 변환은 l-값 참조에 의하거나(by l-value reference), r-값 참조에 의하거나(by r-value reference) 또는 값에 의하는 것(by-value) 중 하나를 이용하여 상기 출력 인덱스가능 유형을 반환하는
    컴퓨터 판독가능 저장 매체.
  6. 제 1 항에 있어서,
    상기 데이터 병렬 소스 코드는 데이터 병렬 확장(extension)을 갖는 고급 범용 프로그래밍 언어로 기록되는
    컴퓨터 판독가능 저장 매체.
  7. 제 1 항에 있어서,
    상기 데이터 병렬 소스 코드는 고급 데이터 병렬 프로그래밍 언어로 기록되는
    컴퓨터 판독가능 저장 매체.
  8. 제 1 항에 있어서,
    상기 하나 이상의 데이터 병렬 연산 노드는 적어도 하나의 그래픽 처리 유닛(graphics processing unit)을 포함하는
    컴퓨터 판독가능 저장 매체.
  9. 제 1 항에 있어서,
    상기 하나 이상의 데이터 병렬 연산 노드는 적어도 하나의 범용 프로세서를 포함하는
    컴퓨터 판독가능 저장 매체.
  10. 컴퓨터 시스템 내의 컴파일러에 의해 수행되는 방법으로서,
    하나 이상의 데이터 병렬 연산 노드 상에서의 수행을 위해 구성된 데이터 병렬 소스 코드에서 제1 맵 변환을 식별하는 단계와,
    제1 출력 인덱스가능 유형을 생성하기 위해 하나 이상의 입력 인덱스가능 유형의 제1 세트에 제1 데이터 병렬 알고리즘을 적용함으로써 데이터 병렬 실행가능 코드가 상기 제1 맵 변환을 구현하도록 상기 데이터 병렬 소스 코드로부터 상기 데이터 병렬 실행가능 코드를 생성하는 단계
    를 포함하는
    방법.
  11. 제 10 항에 있어서,
    상기 데이터 병렬 소스 코드에서 제2 맵 변환을 식별하는 단계와,
    제2 출력 인덱스가능 유형을 생성하기 위해 상기 제1 출력 인덱스가능 유형을 포함하는 하나 이상의 입력 인덱스가능 유형의 제2 세트에 제2 데이터 병렬 알고리즘을 적용함으로써 상기 데이터 병렬 실행가능 코드가 상기 제2 맵 변환을 구현하도록 상기 데이터 병렬 소스 코드로부터 상기 데이터 병렬 실행가능 코드를 생성하는 단계를 더 포함하는
    방법.
  12. 제 10 항에 있어서,
    상기 데이터 병렬 소스 코드 내 호출 사이트에서 상기 제1 맵 변환을 식별하는 단계를 더 포함하는
    방법.
  13. 제 12 항에 있어서,
    상기 제1 맵 변환은 상기 호출 사이트 내의 인수인
    방법.
  14. 제 12 항에 있어서,
    상기 호출 사이트는 제2 데이터 병렬 알고리즘을 호출하는
    방법.
  15. 제 10 항에 있어서,
    상기 데이터 병렬 소스 코드는 데이터 병렬 확장을 갖는 고급 범용 프로그래밍 언어로 기록되는
    방법.
  16. 제 10 항에 있어서,
    상기 데이터 병렬 소스 코드는 고급 데이터 병렬 프로그래밍 언어로 기록되는
    방법.
  17. 제 10 항에 있어서,
    상기 하나 이상의 데이터 병렬 연산 노드는 적어도 하나의 그래픽 처리 유닛을 포함하는
    방법.
  18. 제 10 항에 있어서,
    상기 하나 이상의 데이터 병렬 연산 노드는 적어도 하나의 범용 프로세서를 포함하는
    방법.
  19. 컴퓨터 시스템에 의해 실행될 경우, 방법을 수행하는 컴퓨터 실행가능 명령을 저장하는 컴퓨터 판독가능 저장 매체로서,
    상기 방법은,
    제1 출력 인덱스가능 유형을 생성하기 위해 입력 인덱스가능 유형의 제1 세트에 호출 사이트에 의해 특정되는 제1 데이터 병렬 알고리즘을 적용하는 단계-상기 호출 사이트는 하나 이상의 데이터 병렬 연산 노드 상에서의 실행을 위해 구성된 데이터 병렬 소스 코드에 포함되고, 입력 인덱스가능 유형의 상기 제1 세트의 각각은 해당 순위와 해당 엘리먼트 유형을 포함함-와,
    상기 호출 사이트에 포함되는 제1 맵 변환에 응답하여 제2 출력 인덱스가능 유형을 생성하기 위해 상기 제1 출력 인덱스가능 유형을 포함하는 입력 인덱스가능 유형의 제2 세트에 제2 데이터 병렬 알고리즘을 적용하는 단계
    를 포함하는, 컴퓨터 판독가능 저장 매체.
  20. 제 19 항에 있어서,
    상기 방법은
    상기 호출 사이트에 포함된 제2 맵 변환에 응답하여 제3 출력 인덱스가능 유형을 생성하기 위해 상기 제2 출력 인덱스가능 유형을 포함하는 입력 인덱스가능 유형의 제2 세트에 제3 데이터 병렬 알고리즘을 적용하는 단계를 더 포함하는
    컴퓨터 판독가능 저장 매체.
KR1020137012441A 2010-11-17 2011-10-31 데이터 병렬 코드에서의 맵 변환 KR101842307B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/947,989 2010-11-17
US12/947,989 US8402450B2 (en) 2010-11-17 2010-11-17 Map transformation in data parallel code
PCT/US2011/058637 WO2012067803A2 (en) 2010-11-17 2011-10-31 Map transformation in data parallel code

Publications (2)

Publication Number Publication Date
KR20130126616A true KR20130126616A (ko) 2013-11-20
KR101842307B1 KR101842307B1 (ko) 2018-03-26

Family

ID=46049033

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020137012441A KR101842307B1 (ko) 2010-11-17 2011-10-31 데이터 병렬 코드에서의 맵 변환

Country Status (6)

Country Link
US (1) US8402450B2 (ko)
EP (1) EP2646906A4 (ko)
KR (1) KR101842307B1 (ko)
CN (1) CN102541612B (ko)
CA (1) CA2815519A1 (ko)
WO (1) WO2012067803A2 (ko)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9489183B2 (en) 2010-10-12 2016-11-08 Microsoft Technology Licensing, Llc Tile communication operator
US9430204B2 (en) 2010-11-19 2016-08-30 Microsoft Technology Licensing, Llc Read-only communication operator
US9507568B2 (en) 2010-12-09 2016-11-29 Microsoft Technology Licensing, Llc Nested communication operator
US9395957B2 (en) 2010-12-22 2016-07-19 Microsoft Technology Licensing, Llc Agile communication operator
US8713039B2 (en) * 2010-12-23 2014-04-29 Microsoft Corporation Co-map communication operator
US10558440B2 (en) * 2017-02-02 2020-02-11 Cisco Technology, Inc. Tightly integrated accelerator functions
US10936771B1 (en) * 2019-10-02 2021-03-02 Microsoft Technology Licensing, Llc Using a common fuse controller hardware design for different applications
CN113590193B (zh) * 2021-07-12 2024-03-22 苏州仰思坪半导体有限公司 一种运算装置、方法、介质及计算设备
CN113835688B (zh) * 2021-08-27 2024-04-12 河南理工大学 一种科学计算语言解释器的对象封装方法
US11762677B1 (en) * 2022-04-22 2023-09-19 International Business Machines Corporation High-level vectorization and scalarization of Java vector API library methods

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH02205976A (ja) * 1989-02-03 1990-08-15 Omron Tateisi Electron Co プログラム生成装置
US5179702A (en) * 1989-12-29 1993-01-12 Supercomputer Systems Limited Partnership System and method for controlling a highly parallel multiprocessor using an anarchy based scheduler for parallel execution thread scheduling
US6026234A (en) * 1997-03-19 2000-02-15 International Business Machines Corporation Method and apparatus for profiling indirect procedure calls in a computer program
US6260036B1 (en) 1998-05-07 2001-07-10 Ibm Scalable parallel algorithm for self-organizing maps with applications to sparse data mining problems
US6560774B1 (en) * 1999-09-01 2003-05-06 Microsoft Corporation Verifier to check intermediate language
US6708331B1 (en) * 2000-05-03 2004-03-16 Leon Schwartz Method for automatic parallelization of software
GB0215033D0 (en) * 2002-06-28 2002-08-07 Critical Blue Ltd Instruction set translation method
US7800620B2 (en) 2004-11-05 2010-09-21 Microsoft Corporation Optimizing automated shader program construction
US8261270B2 (en) 2006-06-20 2012-09-04 Google Inc. Systems and methods for generating reference results using a parallel-processing computer system
CN101657795B (zh) * 2007-04-11 2013-10-23 苹果公司 多处理器上的数据并行计算
US8245212B2 (en) * 2008-02-22 2012-08-14 Microsoft Corporation Building call tree branches and utilizing break points
US8453134B2 (en) 2008-06-04 2013-05-28 Intel Corporation Improving data locality and parallelism by code replication
BRPI0919457A2 (pt) 2008-09-30 2015-12-01 Exxonmobil Upstream Res Co método para simular escoamento de fluido em um reservatório de hidrocarboneto
US8195496B2 (en) 2008-11-26 2012-06-05 Sap Aktiengesellschaft Combining multiple objective functions in algorithmic problem solving
US8799629B2 (en) 2008-12-04 2014-08-05 Microsoft Corporation Parallel execution of a loop

Also Published As

Publication number Publication date
CN102541612A (zh) 2012-07-04
KR101842307B1 (ko) 2018-03-26
CN102541612B (zh) 2014-07-09
US8402450B2 (en) 2013-03-19
US20120124564A1 (en) 2012-05-17
WO2012067803A2 (en) 2012-05-24
EP2646906A4 (en) 2014-12-24
EP2646906A2 (en) 2013-10-09
CA2815519A1 (en) 2012-05-24
WO2012067803A3 (en) 2012-07-12

Similar Documents

Publication Publication Date Title
KR101842307B1 (ko) 데이터 병렬 코드에서의 맵 변환
KR101962484B1 (ko) 확장 가능한 데이터 병렬 시맨틱스
JP6027021B2 (ja) アジャイル通信演算子
US11354159B2 (en) Method, a device, and a computer program product for determining a resource required for executing a code segment
KR101740093B1 (ko) 타일 통신 연산자
EP3971706A2 (en) Method, apparatus and electronic device for deploying operator in deep learning frame work
US10282179B2 (en) Nested communication operator
US10620916B2 (en) Read-only communication operator
US8713039B2 (en) Co-map communication operator
Acosta et al. Towards a Unified Heterogeneous Development Model in Android TM
KR101632027B1 (ko) 주석기반의 의사코드를 이용한 프로그램 변환 방법 및 그 방법을 구현하기 위한 프로그램이 기록된 컴퓨터 판독 가능한 기록매체

Legal Events

Date Code Title Description
N231 Notification of change of applicant
A201 Request for examination
E701 Decision to grant or registration of patent right
GRNT Written decision to grant