当前位置: 首页 > 专利查询>浙江大学专利>正文

一种基于模板和函数重载的制造技术

技术编号:39825324 阅读:11 留言:0更新日期:2023-12-29 16:00
本发明专利技术公开了一种基于模板和函数重载的

【技术实现步骤摘要】
一种基于模板和函数重载的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)
,这使得程序员可以使用
OpenMP
将代码标记为可以在
GPU
上执行的区域

这种方式允许程序员充分利用
GPU
的并行计算能力,而无需完全采用传统
GPU
编程模型

[0004]其中隐式数据映射
(implicit data

mapping)
便是一个重要的特性,它允许编译器自动推断数据传输方向并执行数据管理工作,从而减少了程序员在
GPU
编程中手动管理数据传输的工作


OpenMP 5.0
标准中,对该特性处理的数据类型

数据映射方式和影响其功能的相关指令有详细的规定,总结起来包括三个方面

一是对于三种类型
(
指针

标量与复合类型
)

OpenMP
都有一个默认的隐式映射方式;二是对于这三种类型,用户可以在
target
指令的
defaultmap
子句中指定不同的隐式映射方式,也可选择禁用对其进行隐式映射;三是对于结构体或类,其默认映射器
(default mapper)
可以影响其隐式映射,用户也可通过
declare mapper
指令重写某种类型的映射器

[0005]虽然现代主流编译器如
clang、gcc
等都一定程度上实现了对
OpenMP

target
指令等
GPU
相关功能的支持,但是由于目标
GPU
架构的不同,往往需要针对不同架构编写不同代码与支持库

这不仅对于用户来说带来了使用时的不便,对于编译器开发人员带来了的技术挑战


技术实现思路

[0006]针对现有技术的不足,本专利技术提供一种基于模板和函数重载的
OpenMP
隐式数据映射实现方法,该方法是针对
OpenMP 5.0
中的隐式数据映射特性,在高级语言层面
(

C++/CUDA)
提供一个实现框架,这一方法有更强的通用性,与多数
GPGPU
编程架构相兼容:我们利用了现有编译器对
C++
模板编程

函数重载的支持,使得无需解析变量类型即可实现
OpenMP 5.0
标准中对于隐式数据映射的各种规定,可以以轻量化

低耦合的方式实现编译器对
OpenMP
的扩展支持

[0007]本专利技术是通过以下技术方法来实现的:一种基于模板和函数重载的
OpenMP
隐式数据映射实现方法,包括以下步骤:
[0008](1)
分别定义指针

标量和复合类型三种
OpenMP
规定的基础类型的代理结构体和一个任意类型的代理结构体;所述代理结构体指一种结构体,该结构体作为函数参数时可以代替指定范围内的类型;
[0009](2)
定义默认映射器结构体
OpenMP mapper
,实现所有类型的默认映射器;
[0010](3)
定义不同映射方式的结构体,作为传递到
GPU
的参数结构体;
[0011](4)
对于每个参数结构体和默认映射器结构体,分别定义一个结构体
Wrapper
;其结构体的内部声明静态函数用于解析模板,能够接受任意类型的参数,并且返回值是该类型对应的参数结构体;
[0012](5)
声明三个函数,它们分别接受步骤
(1)
所述的三种基础类型的参数

返回值是该基础类型对应的
Wrapper
;声明一个函数,它接收任意类型的参数,返回值是默认映射器结构体对应的
Wrapper

[0013](6)
当用户使用
OpenMP

declare mapper
指令重写某种类型的默认映射器时,需在该指令位置重新定义一个默认映射器结构体,并且重载该类型的默认映射器代理函数;
[0014](7)

OpenMP

target
指令中,当用户通过
defaultmap
子句
(
改变步骤
(1)
所述三种
OpenMP
规定的基础类型的隐式映射方式,则需重载对应类型的映射代理函数来改变其映射方式;所述
defaultmap
子句为
OpenMP
子句术语;
[0015](8)
通过模板自动解析变量的类型

调用对应的参数结构体实现
target
指令作用区域内变量的隐式映射,并实现核函数内部对
GPU
关联变量的访问

[0016]进一步地,所述步骤
(1)
具体包括如下子步骤:
[0017](1.1)
定义指针本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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...

【专利技术属性】
技术研发人员:林哲周昆侯启明任重
申请(专利权)人:浙江大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1