【技术实现步骤摘要】
一种基于模板和函数重载的OpenMP隐式数据映射实现方法
[0001]本专利技术属于编译器
,尤其涉及一种基于模板和函数重载的
OpenMP
隐式数据映射实现方法
。
技术介绍
[0002]OpenMP(Open Multi
‑
Processing)
是一种多线程并行编程
API
,旨在简化多核处理器上的并行程序开发
。
它允许程序员通过在源代码中插入一些特殊的指示来指定并行执行的区域,从而使得程序可以利用多核处理器的性能优势
。
此外,
OpenMP
提供了一组编译器指令
(pragma)
和库函数,可以在
C、C++
和
Fortran
等编程语言中使用
。
通过使用这些指令,程序员可以将程序中的一部分标记为可以并行执行的区域,然后由编译器和运行时库来实现程序的并行化执行
。
[0003]因为
OpenMP 5.0
标准
(OpenMP Application Programming Interface Version 5.0
‑
November 2018.https://www.openmp.org/spec
‑
html/5.0/openmp.html)
引入了针对
GPU
的目标指令
(Target Directives) ...
【技术保护点】
【技术特征摘要】
1.
一种基于模板和函数重载的
OpenMP
隐式数据映射实现方法,其特征在于,包括以下步骤:
(1)
分别定义指针
、
标量和复合类型三种
OpenMP
规定的基础类型的代理结构体和一个任意类型的代理结构体;所述代理结构体指一种结构体,该结构体作为函数参数时可以代替指定范围内的类型;
(2)
定义默认映射器结构体
OpenMP mapper
,实现所有类型的默认映射器;
(3)
定义不同映射方式的结构体,作为传递到
GPU
的参数结构体;
(4)
对于每个参数结构体和默认映射器结构体,分别定义一个结构体
Wrapper
;其结构体的内部声明静态函数用于解析模板,能够接受任意类型的参数,并且返回值是该类型对应的参数结构体;
(5)
声明三个函数,它们分别接受步骤
(1)
所述的三种基础类型的参数
、
返回值是该基础类型对应的
Wrapper
;声明一个函数,它接收任意类型的参数,返回值是默认映射器结构体对应的
Wrapper
;
(6)
当用户使用
OpenMP
的
declare mapper
指令重写某种类型的默认映射器时,需在该指令位置重新定义一个默认映射器结构体,并且重载该类型的默认映射器代理函数;
(7)
在
OpenMP
的
target
指令中,当用户通过
defaultmap
子句
(
改变步骤
(1)
所述三种
OpenMP
规定的基础类型的隐式映射方式,则需重载对应类型的映射代理函数来改变其映射方式;所述
defaultmap
子句为
OpenMP
子句术语;
(8)
通过模板自动解析变量的类型
、
调用对应的参数结构体实现
target
指令作用区域内变量的隐式映射,并实现核函数内部对
GPU
关联变量的访问
。2.
根据权利要求1所述的基于模板和函数重载的
OpenMP
隐式数据映射实现方法,其特征在于,所述步骤
(1)
具体包括如下子步骤:
(1.1)
定义指针类型的代理结构体,记为
pointer_ama
;该结构体的构造函数是模板函数,通过模板元编程限制接收指针类型的参数;
(1.2)
定义标量类型的代理结构体,记为
scalar_ama
;该结构体的构造函数是模板函数,通过模板元编程限制接收除指针类型外的其他标量参数;
(1.3)
定义复合类型的代理结构体,记为
aggregate_ama
;该结构体有两个模板构造函数,一个通过模板元编程限制接收类或结构体参数,另一个通过模板限制接收静态数组类型的参数;
(1.4)
定义所有类型的代理结构体
any_ama
,其构造函数是模板函数,接收任意类型的参数
。3.
根据权利要求1所述的基于模板和函数重载的
OpenMP
隐式数据映射实现方法,其特征在于,所述步骤
(2)
具体包括如下子步骤:
(2.1)
定义所有类型的默认映射器结构体,记为
Default_Mapper
;该结构体是模板结构体,接收一个模板参数,记为
T
;
(2.2)
定义
Default_Mapper
的静态函数
Malloc_Memcpy
,该函数接收
T
类型的主机数据,调用
GPU
接口申请数据空间
、
拷贝数据并返回指向
GPU
数据的指针;
(2.3)
定义
Default_Mapper
的静态函数
Memcpy_Delete
,该函数接收
T
类型的主机数据和指向其关联的
GPU
数据的指针,拷贝数据并销毁
GPU
数据空间
。
4.
根据权利要求1所述的基于模板和函数重载的
OpenMP
隐式数据映射实现方法,其特征在于,所述步骤
(3)
具体包括如下子步骤:
(3.1)
定义
firstprivate
映射方式的参数结构体,记为
P_Firstprivate
,其为模板结构体,接收一个模板参数,记为
T
;
P_Firstprivate
中存储
T
类型的数据成员
val
,作为参数传递到
GPU
时即成为线程私有变量;
P_Firstprivate
的构造函数和成员函数作为数据拷贝和访问的接口;所述
firstprivate
是
OpenMP
规定的数据属性,数据在
GPU
线程中私有,不影响
CPU
的数据;
(3.2)
定义普通映射方式的参数结构体,记为
P_Maptype
;其为模板结构体,模板参数包括数据类型
T、
映射器
ClassMapper、
布尔类型
H2D
和布尔类型
D2H
,所述布尔类型
H2D
和布尔类型
D2H
分别代表是否将数据拷贝到
GPU
与是否将数据拷贝回
CPU
,不同的值组合而成
alloc、to、from
和
tofrom
四种映射方式,即
OpenMP
规定的映射方式;所述
P_Maptype
中存储指向
T
类型的指针
ptr
,即指向
GPU
上的关联数据,且
P_Maptype
的构造函数和成员函数作为数据拷贝和访问的接口;
(3.3)
定义隐式映射方式
none
的参数结构体,记为
P_None
,其为模板结构体,接收一个模板参数,记为
T
;所述
P_None
的构造函数中抛出静态错误,提示用户无法做数据的隐式映射;所述
none
是
OpenMP
映射方式,代表禁用某一类型的隐式映射
。5.
根据权利要求1所述的基于模板和函数重载的
OpenMP
隐式数据映射实现方法,其特征在于,所述步骤
(4)
具体包括如下子步骤:
(4.1)
定义结构体,记为
Wrapper_Firstprivate
,其内部声明模板函数
GetParameter
,并接收两个模板参数:映射器
ClassMapper
和接收类型
T
;该函数接收
T
类型的参数,将
P_Firstprivate<T>
结构体作为返回类型;
Wrapper_Firstprivate
内部重载模板函数
GetParameter
的声明,该函数接收三个模板参数:映射器
ClassMapper
,类型
T
和
size_t
类型
SIZE
;所述重载模板函数接收
T[SIZE]
类型的参数,将
P_Firstprivate<T[SIZE]>
结构体作为返回类型;
(4.2)
定义模板结构体,记为
Wrapper_Maptype
,其模板参数为布尔类型变量
H2D
和布尔类型
D2H。
其内部声明模板函数
GetParameter
,接收两个模板参数:映射器
ClassMapper
和类型
T
;该函数接收
T
类型的参数,将
P_Maptype<T,H2D,D2H,ClassMapper&a...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。