OpenHMPP

OpenHMPP

OpenHMPP (HMPP[1] for Hybrid Multicore Parallel Programming) - 이종 컴퓨팅을 위한 프로그래밍 표준.일련의 컴파일러 디렉티브에 근거하는 standard는 GPU 프로그래밍과 관련된 복잡함 없이 하드웨어 액셀러레이터를 처리하도록 설계된 프로그래밍 모델입니다.이 디렉티브에 근거한 어프로치는 어플리케이션코드와 하드웨어 액셀러레이터(HWA)의 사용간의 느슨한 관계를 가능하게 하기 때문에 실장되어 있습니다.

서론

오픈HMPP 지시 기반 프로그래밍 모델은 하드웨어 액셀러레이터의 계산을 오프로드하고 하드웨어 메모리 간의 데이터 이동을 최적화하는 구문을 제공합니다.

이 모델은 INRIA, CNRS, 렌스 대학교 1 및 렌스 INSA의 공통 프로젝트인 CAPS(Compiler and Architecture for Embedded and Superscalar Processors)에 의해 초기화된 작업을 기반으로 합니다.

OpenHMPP 개념

OpenHMPP는 HWA에서 원격으로 실행할 수 있는 기능인 코덱의 개념을 기반으로 합니다.

오픈HMPP 코드렛 개념

코드렛에는 다음과 같은 속성이 있습니다.

  1. 그것은 순수한 기능이다.
    • 스태틱 변수 또는 휘발성 변수 선언은 포함되지 않으며 HMPP 디렉티브에 의해 선언된 경우를 제외하고 글로벌 변수도 참조되지 않습니다.
    • 보이지 않는 본문을 가진 함수 호출은 포함되지 않습니다(인라인 할 수 없습니다).여기에는 라이브러리 및 malloc, printf 등의 시스템 기능의 사용이 포함됩니다.
    • 모든 함수 호출은 정적 순수 함수(함수 포인터 없음)를 참조해야 합니다.
  2. 값을 반환하지 않습니다(C의 함수 또는 Fortran의 서브루틴).
  3. 인수 수는 고정해야 합니다(즉, C의 stdarg.h와 같은 가변 함수는 사용할 수 없습니다).
  4. 재귀적이지 않습니다.
  5. 이 파라미터는 에일리어스가 아닌 것으로 간주됩니다(에일리어싱(계산) 및 포인터 에일리어싱 참조).
  6. 여기에는 콜 사이트 지시(즉, 다른 코드렛에 대한 RPC) 또는 기타 HMPP 지시사항은 포함되어 있지 않습니다.

이러한 속성을 통해 코드렛 RPC를 HWA에 의해 원격으로 실행할 수 있습니다.이 RPC 및 관련된 데이터 전송은 비동기일 수 있습니다.

코드렛 RPC

HMPP는 동기식 및 비동기식 RPC를 제공합니다.비동기 조작의 실장은 하드웨어에 의존합니다.

동기식 RPC와 비동기식 RPC

HMPP 메모리 모델

HMPP는 호스트 프로세서1과 HWA 메모리라는2개의 주소 공간을 고려합니다.

HMPPP 메모리 모델

지시 개념

오픈HMPP 명령어는 애플리케이션 소스 코드에 추가된 "메타 정보"로 간주될 수 있습니다.이러한 정보는 안전한 메타 정보입니다. 즉, 원래 코드 동작을 변경하지 않습니다.이들은 함수의 Remote Execution(RPC; 리모트 실행)과 HWA 메모리 간의 데이터 전송에 대응합니다.

다음 표에 Open을 소개합니다.HMPP 명령어OpenHMPP 디렉티브는 다양한 요구에 대응합니다.그 중 일부는 선언 전용이고 다른 일부는 실행 관리 전용입니다.

흐름 제어 명령 데이터 관리 지침
선언 코드렛
그룹.
거주자.
지도
맵바이네임
운용 지침 콜 사이트
동기
지역
할당하다
풀어주다
어드밴스드 로드
위임 스토어

지시어 집합의 개념

HMPP 접근법의 기본 포인트 중 하나는 응용 프로그램에 배포된 전체 지침 집합에 일관된 구조를 노출할 수 있는 지침 및 관련 레이블의 개념이다.

라벨에는 다음 두 종류가 있습니다.

  • 코드렛과 관련된 것 중 하나.일반적으로 이러한 종류의 라벨을 부착하는 지시는 하나의 코드렛(문서의 나머지 부분에서는 이를 코드렛 그룹과 구별하기 위해 독립형 코드렛이라고 함)만 관리하는 것으로 제한됩니다.
  • 코드렛 그룹에 연관된 코드렛입니다.이러한 라벨은 다음과 같습니다."< Label Of Group > 。여기서 "Label Of Group"은 사용자가 지정한 이름입니다.일반적으로 이 유형의 라벨이 있는 지시문은 전체 그룹과 관련이 있습니다.그룹의 개념은 성능을 얻기 위해 애플리케이션 전체에 걸쳐 데이터를 특정 관리해야 하는 문제 클래스에 예약되어 있습니다.

OpenHMPP 지시 구문

알림을 단순화하기 위해 정규 표현을 사용하여 HMPP 지시어의 구문을 설명합니다.

다음 색 표기법은 구문 지시어의 설명에 사용됩니다.

  • 예약된 HMPP 키워드는 녹색입니다.
  • HMPP 키워드에서 거부할 수 있는 문법의 요소는 빨간색으로 표시됩니다.
  • 사용자 변수는 검은색으로 유지됩니다.

일반적인 구문

OpenHMPP 디렉티브의 일반적인 구문은 다음과 같습니다.

  • C 언어의 경우:
#codema hmpp <grp_label> [ codelet _ label ]?directive_type [, parameters]* [&]
  • FORTRAN 언어의 경우:
!$hmpp <grp_label> [ codelet _ label ]?directive_type [, parameters]* [&]

장소:

  • <grp_label>:는 코드렛 그룹을 명명하는 고유 식별자입니다.응용 프로그램에 그룹이 정의되지 않은 경우 이 레이블이 누락될 수 있습니다.정규 라벨명은 [a-z, A-Z,_][a-z, A-Z, 0-9,_]* 문법에 따라야 합니다.이러한 라벨에서는 "< >" 문자는 구문에 속하며 필수입니다.
  • codelet_label:는 코드렛을 명명하는 고유 식별자입니다.법적 라벨명은 [a-z, A-Z,_][a-z, A-Z, 0-9,_]* 문법을 따라야 합니다.
  • directive: 는 디렉티브 이름입니다.
  • directive_parameters: 디렉티브에 관련되어 있는 파라미터의 일부를 지정합니다.이들 파라미터는 종류가 다를 수 있으며 명령어에 지정된 몇 가지 인수 중 하나를 실행 모드(예를 들어 비동기 대 동기)로 지정합니다.
  • [&]: 는 다음 줄에서 지시어를 계속하기 위해 사용되는 문자입니다(C 및 FORTRAN의 경우 동일).

지시 파라미터

디렉티브에 관련된 파라미터의 유형은 다를 수 있습니다.Open에서 정의된 지시 파라미터는 다음과 같습니다.HMPP:

  • version = major.minor[.micro]: 프리프로세서가 고려하는 HMPP 디렉티브의 버전을 지정합니다.
  • args[arg_items].size={dimsize[,dimsize]*}: 스칼라 이외의 파라미터(배열)의 크기를 지정합니다.
  • args[arg_items].io=[in out inout]: 지정된 함수 인수가 입력, 출력 또는 둘 다임을 나타냅니다.기본적으로는 수식되지 않은 인수는 입력입니다.
  • cond = "expr": 그룹 또는 코덱의 실행을 시작하려면 true여야 하는 부울 C 또는 Fortran 식으로서 실행 조건을 지정합니다.
  • target=target_name[:target_name]*: 지정된 순서로 사용할 타깃을 지정합니다.
  • asynchronous: 코드렛 실행이 차단되지 않도록 지정합니다(기본값은 동기).
  • args[<arg_items>].advancedload=true: 지정된 파라미터가 프리로드되었음을 나타냅니다.in 또는 inout 파라미터만 프리로드할 수 있습니다.
  • args[arg_items].noupdate=true: 이 속성은 데이터가 이미 HWA에서 사용 가능하므로 전송이 필요하지 않음을 지정합니다.이 속성을 설정하면 고려된 인수에 대해 전송이 수행되지 않습니다.
  • args[<arg_items>].addr="<expr>":<expr>는 업로드할 데이터의 주소를 나타내는 표현입니다.
  • args[<arg_items>].const=true: 인수가 한 번만 업로드됨을 나타냅니다.

OpenHMPP 디렉티브

코드렛 선언 및 실행 지침

A codelet디렉티브는 하드웨어 액셀러레이터에서 원격으로 실행됨을 선언합니다.를 위해codelet지시:

  • 코드렛 라벨은 필수이며 응용 프로그램에서 고유해야 합니다.
  • 그룹이 정의되지 않은 경우 그룹 라벨은 필요하지 않습니다.
  • codelet 지시문은 함수 선언 바로 앞에 삽입됩니다.

디렉티브의 구문은 다음과 같습니다.

#codema hmpp <grp_label> codelet_label codelet [, version = major . major [ . micro ] ?[, args[filename_filename]io=paramin out inout]* [, args [ paramin_timeout ]size={dimsize[,dimsize]*]* [, args[dimsize_module]const=true]* [, cond = "expr"][, target=target_name[:target_name]*]

다른 용도 또는 다른 실행 컨텍스트를 지정하기 위해 여러 개의 코드렛 디렉티브를 함수에 추가할 수 있습니다.단, 특정 콜사이트 라벨에 대해 지정할 수 있는 코드렛 디렉티브는 1개뿐입니다.

callsitedirective는 가 프로그램 내의 특정 포인트에서 코덱을 사용하는 방법을 지정합니다.

디렉티브의 구문은 다음과 같습니다.

#codema hmpp <grp_label> codelet_label 콜사이트 [, 비동기]?[, args[filename_filename]size={dimsize[,dimsize]*]* [, args[dimsize_module]advancedload=syslogtrue false]* [, args[syslog_false]addr="expr"]* [, args[ args ]noupdate=true]*

예를 다음에 나타냅니다.

 /* 코드렛 선언 */  #subma hmpp simple 1 codelet, args [outv ]io=inout, targarget=쿠다  정적인 무효 매트(인트 코딱지, 인트 sm, 흘러가다 초대하다[sm], 흘러가다 [코딱지][sm], 흘러가다 *출력){      인트 i, j;      위해서 (i = 0 ; i < > sm ; i++) {        흘러가다 임시직 = 출력[i];        위해서 (j = 0 ; j < > 코딱지 ; j++) {          임시직 += 초대하다[j] * [i][ j];      }     출력[i] = 임시직;   }      인트 주된(인트 argc,  **argv) {     인트 n;     ........      /* 코드렛 사용 */   #subma hmpp simple1 콜사이트, args[outv]크기={n}   매트(n, m, 마인크, , myoutv);     ........   } 

경우에 따라서는 애플리케이션 전체에 걸쳐 특정 데이터를 관리해야 합니다(CPU/GPU 데이터 이동 최적화, 공유 변수 등).

groupdirective를 사용하면 코드렛 그룹을 선언할 수 있습니다.이 지시문에 정의된 파라미터는 그룹에 속하는 모든 코덱에 적용됩니다.디렉티브의 구문은 다음과 같습니다.

#subma hmpp <grp_label> group [, version = < major > <br> [ ]<마이크로>?[, target = target_name [:target_name]*]:].[, cond = "expr"] : 

통신 오버헤드를 최적화하기 위한 데이터 전송 지침

HWA를 사용할 때 가장 큰 병목현상은 HWA와 메인프로세서 간의 데이터 전송입니다.
통신 오버헤드를 제한하기 위해 데이터 전송은 HWA의 비동기 속성을 사용하여 동일한 코덱의 연속 실행과 중복될 수 있습니다.

  • 지시문을 할당하다

allocate디렉티브는 HWA를 잠그고 필요한 메모리 양을 할당합니다.

#syslogma hmpp <grp_label> 할당 [,sys[syslog_label]size={dimsize[,dimsize]*
  • 해방 지시

releasedirective는 그룹 또는 스탠드아론 코드렛의 HWA를 해방하는 타이밍을 지정합니다.

#subma hmpp <grp_label>릴리즈
  • 어드밴스드 로드 디렉티브

advancedload디렉티브는 코드렛의 리모트 실행 전에 데이터를 프리페치합니다.

#codema hmpp <grp_label> [ codelet _ label ]?advanced load,sys[syslogs][,sys[syslogs]size={dimsize[,dimsize]*[,sys[dimsize]*]addr="expr"]* [,sys[syslog_expr]섹션={[cript_cript,]+}]* [,연속]
  • 위임 스토어 지시어

delegatedstore디렉티브는 비동기 코드렛 실행이 완료될 때까지 기다렸다가 결과를 다운로드하기 위한 동기화 장벽입니다.

#codema hmpp <grp_label> [ codelet _ label ]?dismitted store , sys [ syslogs _ syslogs ][ , sys [ syslogs _ sys ]addr="expr"]* [,sys[syslog_expr]섹션={[cript_cript,]+}]*
  • 비동기 계산

synchronizedirective는 비동기 콜사이트 실행이 완료될 때까지 대기하도록 지정합니다.synchronize 디렉티브의 경우 codelet 라벨은 항상 필수이며 codelet이 그룹에 속해 있는 경우 그룹 라벨이 필요합니다.

#subma hmpp <grp_label> codelet_label 동기화

다음 예에서는 입력 데이터의 디바이스 초기화, 메모리 할당 및 업로드를 루프 외부에서1회만 실행하고 루프의 각 반복에서는 하지 않습니다.

synchronize디렉티브를 사용하면 다른 반복을 시작하기 전에 코드렛의 비동기 실행이 완료될 때까지 대기할 수 있습니다.마지막으로 그delegatedstore루프 외부의 디렉티브는 sgemm 결과를 업로드합니다.

 인트 주된(인트 argc,  **argv) {    #subma hmpp sgemm allocate, args[vin1;vin2;vout]size={size, size}  #subma hmpp sgemm advancedload, args[vin1;vin2;vout], args[m,n,k,alpha,valpha]      위해서 ( j = 0 ; j < > 2 ; j ++) {     #subma hmpp sgemm 콜사이트, 비동기, args [vin1;vin2;vout]advancedload=true, args[m,n,k,alpha,alpha]advancedload=true     sgemm (크기, 크기, 크기, 알파, VIN1, 빈2, 베타., 출력);     #syslogma hmpp sgemm 동기화  }    #subma hmpp sgemm 위임스토어, args[vout]  #subma hmpp sgemm 릴리즈 

코덱 간 데이터 공유

이러한 디렉티브는 모든 그룹에 대해 지정된 이름을 공유하는 모든 인수를 매핑합니다.

매핑된 모든 인수의 유형과 치수는 동일해야 합니다.

map디렉티브는 디바이스 상의 여러 인수를 매핑합니다.

#subma hmpp <grp_label> 맵, args[subma_label]

이 지시문은 다음 명령어와 매우 유사합니다.mapdirective는 매핑되는 인수가 이름으로 직접 지정되는 경우를 제외합니다.mapbynamedirective는 multiple에 해당합니다.map명령어를 참조해 주세요.

#pragma hmpp <grp_label> mapbyname [, variableName]+

전역 변수

residentdirective는 일부 변수를 그룹 내에서 글로벌하다고 선언합니다.그런 다음 그룹에 속한 모든 코드렛에서 이러한 변수에 직접 액세스할 수 있습니다.이 지시문은 소스 코드의 선언문 바로 뒤에 있는 선언문에 적용됩니다.

이 지시어의 구문은 다음과 같습니다.

#subma hmpp <grp_label> 상주 [, args [ : var _ name ]io=inout inout]* [, args[:var_name]size={dimsize[,dimsize]*]* [, args[:var_name]입니다.addr="expr"]* [, args [:var_name]const=true]*

표기법::var_name접두사를 붙여서::는 상주 상태로 선언된 응용 프로그램의 변수를 나타냅니다.

지역 가속

리전은 코드렛/콜사이트 디렉티브의 결합입니다.목표는 코드 재구성을 방지하고 코드렛을 구축하는 것입니다.따라서 에 사용할 수 있는 모든 Atribute는codelet또는callsite명령어를 사용할 수 있습니다.regions명령어를 참조해 주세요.

C 언어:

#pragma hmpp [< My Group > ][ label ]지역 [, args [ arg _ items ]io=inout inout]* [, cond = "expr" <, args[ spairs _ out 。const=true]* [, target=target_name [:target_name]*][, args [ target_name ]size={dimsize[,dimsize]*]* [, args[dimsize_module]advancedload=syslogtrue false]* [, args[syslog_false]addr="expr"]* [, args[ args ]noupdate=true]* [, 비동기?][, private=[clock_des]* {C BLOCK 문 }

실장

오픈HMPP Open Standard는 HMPP 버전 2.3(2009년 5월, CAPS 엔터프라이즈)에 근거하고 있습니다.

오픈HMPP 지시 기반 프로그래밍 모델은 다음과 같이 구현됩니다.

  • CAPS 컴파일러, 하이브리드 컴퓨팅용 CAPS Enterprise 컴파일러
  • PathScale ENZO 컴파일러 스위트 (NVIDIA GPU 지원)

OpenHMPP는 석유 및 가스,[citation needed] 에너지,[citation needed] 제조,[citation needed] 재무,[citation needed] 교육 및 [citation needed]리서치 분야의[who?] HPC 관계자에 의해 사용되고 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Dolbeau, Romain; Bihan, Stéphane; Bodin, François (4 October 2007). HMPP: A Hybrid Multi-core Parallel Programming Environment (PDF). Workshop on General Purpose Processing on Graphics Processing Units. Archived from the original (PDF) on 16 January 2014. Retrieved 14 January 2014.