HMPP开放标准

科技工作者之家 2020-11-17

HMPP1用于异构多核并行编程。OpenHMPP2标准基于一组指令,是用于处理硬件加速器的编程模型,但又没有GPU编程的相关复杂性。这种基于指令的方法已经实现,因为他们使应用程序代码和硬件加速器使用之间形成松散关系。本文涉及组成OpenHMPP标准的HMPP指令, 但并不处理指令的执行链接到指令执行。

简介OpenHMPP基于指令的编程模型提供了一种语法,有效地减轻硬件加速器上的计算,优化数据向/从硬件存储器移动。模型基于 CAPS (编译器和超标量体系结构以及嵌入式处理器) 3的初始化工作, 以及来自INRIA, CNRS, 雷恩第一大学和雷恩INSA的共同项目。

OpenHMPP标准概念OpenHMPP标准基于codelets的概念, 可以在硬件上远程执行。

OpenHMPP Codelet 概念codelet具有以下属性:

1. 它是一个纯函数。

它不包含静态或不稳定的变量声明,也不涉及任何全局变量,除非这些已经由HMPP “resident”指令所声明

它不包含任何具有无形体(不能内联)的函数调用。这包含库和系统函数的使用, 例如 malloc, printf, ...

每个函数必须引用静态纯函数(没有函数指针)。

2. 它不返回任何值(C中的void函数或FORTRAN子程序)。

3. 参数的数量应该是固定的(即没有像C中的vararg那样可变数量的参数)。

4. 它不是递归的。

5. 它的参数设定为non-aliased。

6. 它不包含callsite指令(即RPC至另一个codelet)或其他HMPP指令。

这些属性确保codelet RPC可以通过硬件远程执行。此RPC及其相关的数据传输可以是异步的。

Codelet RPCsHMPP提供同步和异步的RPC。异步操作的执行依赖于硬件。

HMPP 存储器模型HMPP考虑到两个地址空间: 一个主机处理器和硬件存储器。

指令概念OpenHMPP指令可能被视为“元信息” 添加到应用程序源代码。它们是安全的元信息,即不会改变原始代码的行为。它们处理函数的远程执行(RPC),以及数据向/从硬件存储器传输。下表介绍了OpenHMPP指令。OpenHMPP指令满足不同需求: 其中一些专门用于声明,其他用于执行的管理。

指令集的概念HMPP方法的基本点之一是指令的概念及其关联的标签,使它能够在分布于应用程序中的整个指令集上公开一个相干结构。有两种类型的标签:

一类关联到codelet。携带这种标签的指令一般仅限于管理一个(在文档 的其余部分称为stand-alone,以便从一组codelet中区分开)。

一类关联到一组codelets。这些标签说明如下: ““, 其中“LabelOfGroup” 是由用户指定一个名称。 具有这种标签的指令一般涉及到整个组。组的概念是保留给这样一类问题,即要求对整个应用程序的数据做具体管理以获取性能。

OpenHMPP指令语法为了简化符号, 正则表达式 将用于描述HMPP指令的语法。 下面的颜色通常用于描述指令的语法:

保留的HMPP关键字是蓝色;

在HMPP关键字中可以被减少的基本语法是红色;

用户变量仍然为黑色。

一般语法OpenHMPP指令的一般语法如下:

C语言:

#pragmahmpp[codelet_label]?directive_type[,directive_parameters]*[&]FORTRAN语言:

!$hmpp[codelet_label]?directive_type[,directive_parameters]*[&其中:

: 是命名一组 codelets 的独一标识符。在应用程序中没有组被定义的情况下, 这个标签可以简单地略过。Legal标签必须遵循此语法: [a-z,A-Z,_][a-z,A-Z,0-9,_]*。请注意 “” 字符属于语法,且对这类标签是强制性的。

codelet_label: 是命名一个codelet的独一标识符。Legal 标签必须遵循此语法: [a-z,A-Z,_][a-z,A-Z,0-9,_]*

directive: 是指令的名称;

directive_parameters: 指定一些指令相关联的参数。这些参数可能是不同类型并指定 给指令的某些参数或执行的一种模式(例如同步与异步);

[&]: 是用于在下一行继续该指令的字符 (C和FORTRAN都是相同的)。

指令参数关联到一个指令的参数可能是不同类型。以下是 在HMPP中定义的指令参数:

version = major.minor[.micro]: 由预处理器指定HMPP指令的版本。

args[arg_items].size={dimsize[,dimsize]*}: 指定一个非标量参数 (数组)的大小。

args[arg_items].io=[in|out|inout]: 表示指定函数参数是输入, 输出或两者兼而有之。默认情况下, 非限定参数为输入。

cond = "expr": 指定组或codelets开始执行的一个条件C或Fortran布尔表达式的值为是 C或Fortran布尔表达式的值为true。

target=target_name[:target_name]*: 指定是哪个target以尝试使用给定的顺序。

asynchronous: 指定不阻止codelet的 执行 (默认是同步的)。

args[].advancedload=true: 表明指定的参数是预加载的。只有in或inout参数可以被预加载。

args[arg_items].noupdate=true: 此属性指定 硬件上的数据已经可用,因此不需要转换。 当设置了此属性时, 所考虑的参数没有任何传递。

args[].addr="": 是一个表达式,给出了数据上载的地址。

args[].const=true: 表示参数只要上载一次。

OpenHMPP 指令声明和执行一个codelet的指令codelet指令声明在硬件加速器上远程执行计算。

codelet 指令:

codelet标签是强制性的并且在应用程序中是独一的

如果没有组被定义则不需要组标签。

Codelet指令在函数声明之前插入。

该指令的语法是:

#pragma hmpp codelet_label codelet[, version = major.minor[.micro]?]?[, args[arg_items].io=[[in|out|inout]]*[, args[arg_items].size={dimsize[,dimsize]*}]*[, args[arg_items].const=true]*[, cond = "expr"][, target=target_name[:target_name]*]可以在一个函数中加入多个codelet指令,以便指定不同用途或不同执行文本。但是, 一个给定调用站点标签只能有一个codelet指令。 Callsite指令指定程序内的给定点如何使用一个codelet。该指令的语法是:

#pragma hmpp codelet_label callsite[, asynchronous]?[, args[arg_items].size={dimsize[,dimsize]*}]*[, args[arg_items].advancedload=[[true|false]]*[, args[arg_items].addr="expr"]*[, args[arg_items].noupdate=true]*这里有一个例子:

/* declaration of the codelet */#pragma hmpp simple1 codelet, args[outv].io=inout, target=CUDAstatic void matvec(int sn, int sm, loat inv[sm], float inm[sn][sm], float *outv){int i, j;for (i = 0 ; i

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。