HMPP开放标准

简介

OpenHMPP基于指令的编程模型提供了一种语法，有效地减轻硬件加速器上的计算，优化数据向/从硬件存储器移动。

模型基于CAPS (编译器和超标量体系结构以及嵌入式处理器) 的初始化工作, 以及来自INRIA, CNRS, 雷恩第一大学和雷恩INSA的共同项目。

OpenHMPP标准概念

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

Codelet RPCs

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

HMPP 存储器模型

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

Codelets之间共享数据

这些指令共同映射所有参数共享所有组的给定名称。

所有映射参数的类型和尺寸必须是相同的。
map指令映射设备上的几个参数。
#pragma hmpp <grp_label>  map, args[arg_items]
此指令除了参数按其名称直接指定映射之外，与map指令很类似。 mapbyname 指令相当于多映射指令。
#pragma hmpp <grp_label> mapbyname [,variableName]+

全局变量

Resident指令声明某些变量在一个组内为全局变量。 然后可以从任何属于组的codelet中直接访问这些变量。此指令应用于源代码中在其之后的声明语句。
此指令的语法是:
#pragma hmpp <grp_label> resident 
               [, args[::var_name].io=[[in|out|inout]]*
               [, args[::var_name].size={dimsize[,dimsize]*}]*
               [, args[::var_name].addr="expr"]*
               [, args[::var_name].const=true]*
符号::var_name 以::为前缀, 表示一个应用程序的变量声明为resident。

加速区

codelet/callsite指令合并为一个区域。目的是避免代码重构中构建codelet。 因此，所有codelet或callsite指令可用属性都可以用于regions指令。
在C语言中:
#pragma hmpp [<MyGroup>] [label] region         
                           [, args[arg_items].io=[[in|out|inout]]*
                           [, cond = "expr"]<
                           [, args[arg_items].const=true]*
                           [, target=target_name[:target_name]*]
                           [, args[arg_items].size={dimsize[,dimsize]*}]*
                           [, args[arg_items].advancedload=[[true|false]]*
                           [, args[arg_items].addr="expr"]*
                           [, args[arg_items].noupdate=true]*
                           [, asynchronous]?
                           [, private=[arg_items]]*
   {
C BLOCK STATEMENTS
   }