一种支持合并访存和循环队列的GPU模板计算方法技术

技术编号:37611122 阅读:8 留言:0更新日期:2023-05-18 12:02
本发明专利技术公开一种支持合并访存和循环队列的GPU模板计算方法,所述方法包括:合并访存读取二维平面上的一块数据;基于循环队列的模板计算。针对以往在GPU上使用的2.5D分块模板计算方法能够很好地复用某一条轴上的数据(通常为轴),但无法实现完全的合并访存,也难以适用于计算物理中复杂的复合微分算子。现代GPU的访存效率远小于计算效率,无法利用合并访存的计算应用很难充分利用GPU的性能。本发明专利技术建立一种结合了循环队列和合并访存的分块模板计算方法,能够充分利用GPU的访存性能,并且适用于复杂的微分算子。于复杂的微分算子。于复杂的微分算子。

【技术实现步骤摘要】
一种支持合并访存和循环队列的GPU模板计算方法


[0001]本专利技术属于高性能计算领域,尤其涉及一种支持合并访存和循环队列的GPU模板计算方法。

技术介绍

[0002]模板计算是有限差分方法在实现中的一个基本操作,它是一种最近邻计算,通常需要遍历一个二维或三维空间网格,使用相邻网格点的数据计算出一个值。直到整个网格都被计算一遍,就能得到当前时间步的输出结果。在有限差分求解器的具体设计中,存在很多不同类型的微分算子,这些算子对应不同的模板计算格式,例如计算偏导数使用同一方向的3点或5点模板,计算拉普拉斯算子使用三个方向的5点、7点甚至13点模板。典型的5点模板计算格式如下,
[0003][0004]其中,u代表计算涉及的数据,例如温度,下标m,n分别表示X,Y方向的输入数据索引,下标t代表当前时间步的输出数据;G是输入数据的函数,即计算公式。该格式由一个点(,n)周围的5个点计算得到中心位置的新数据。
[0005]通用GPU架构更新换代非常快,但基本采用同一种编程模型,称为SIMT。这种模型目前事实上的标准接口为CUDA和HIP。通过使用CUDA/HIP,整个三维区域的模板计算可以分解为多个线程块(thread block),每个线程负责实际的计算。然而,每个线程完成计算所需的数据不只是一个点,导致一个线程块内的各个线程都要重复访问同一个数据,例如5点模板计算中,每一个点要被5个相邻的线程使用,也就被重复读取5次。这极大增加了带宽的负担。现行的通用做法是采用合并访存(coalescing)和片上共享内存(shared memory),将一个线程块所需的所有数据一次性读取到离计算单元较近的共享内存上,这一做法从两个方面节省了访存时间:第一,计算单元从GPU全局内存读取数据是按块实现的,合并访存能够最大限度地减少内存访问次数;第二,多个线程访问同一数据时只需要从共享内存读取,比从全局内存读取更快。
[0006]GPU上的模板计算有一类很常用的方法称为2.5D分块方法,例如传统的Single Pass方法、Two Pass方法都可以归为此类。这类方法的特点是将三维网格上的计算当成多个二维网格的计算,从第一个二维网格依次推进,在推进的过程中复用先前的数据,节省读取数据的开销。
[0007]计算一个二维网格上的数据时,为了得到D
x
×
D
y
大小的输出数据,需要的输入数据要更大,例如(D
x
+2r
x
)(D
y
+2r
y
),其中的增量取决于模板的大小。采用2.5D类型的方法复用的数据通常是沿着第三条轴(z轴)的直线上的数据,使得当前计算的二维平面和它前后的二维平面有了明显区别:当前平面总是在GPU计算单元上保存(D
x
+2r
x
)(D
y
+2r
y
)大小的数据,其他平面只需要D
x
D
y
大小的数据。这种做法虽然减少了局部存储的数据量,但却无法利
用合并访存。在实际计算问题中,模板计算的半径比问题网格的宽度要小很多,由边界处的数据引入的数据量也并不多。
[0008]另一方面,计算物理经常用到各种微分算子以及它们的复合算子,而传统的2.5D分块方法只适用于十字架形状的模板(如),不适用于立方体形状的模板(在十字架之外的地方有值)。这也导致一些复合的算子必须拆分为多个简单算子来计算,增加了数据传输的开销。

技术实现思路

[0009]提供了本专利技术以解决现有技术中存在的上述问题。因此,需要一种支持合并访存和循环队列的GPU模板计算方法,用于充分利用合并访存的高效率实现复杂微分算子的GPU计算。
[0010]根据本专利技术的第一方案,提供了一种支持合并访存和循环队列的GPU模板计算方法,所述方法包括:
[0011]合并访存读取二维平面上的一块数据;
[0012]基于循环队列的模板计算:
[0013]给定三维模板计算问题:模板计算公式F,模板半径r
x
、r
y
和r
z
;三维网格D
x
×
D
y
×
D
z
,周围halo区域大小H
x
、H
y
和H
z
;输入数据指针data,输出数据指针out;初始化指向共享内存不同数据块的指针s
mm
,s
m
,s
c
,s
p
,s
pp
;线程块大小B
x
、B
y
,当前线程块的索引b
x
、b
y
,当前线程的索引t
x
、t
y

[0014]读取最初的数据块到共享内存,除了第一块数据,s
m
,s
m
,s
c
,s
p
,s
pp

[0015]调整输出数据指针,使其指向正确位置:计算二维平面相距的数据点数量,l=(D
x
+2H
x
)(D
y
+2H
y
);计算当前线程在二维平面上的索引,i
x
=t
x
+b
x
B
x
,i
y
=t
y
+b
y
B
y
;计算当前线程的第一个输出数据所在位置,out=out+(i
x
+H
x
)+(i
y
+H
y
)(D
x
+2H
x
)+r
z
l;
[0016]计算二维平面相距的数据点数量,l=(D
x
+2H
x
)(D
y
+2H
y
);
[0017]令k=2r
z
,表示当前应该读入的数据块沿z方向的索引;
[0018]如果k<D
z
+2H
z
,执行下列操作:
[0019]a)进行必要的线程同步;
[0020]b)读取新数据到s
mm

[0021]c)轮换指针,使s
mm
指向原s
m
的数据、s
m
指向原s
c
的数据、
……
、s
pp
指向原s
mm
的数据;
[0022]d)执行模板计算公式F;
[0023]e)输出数据到out指向的位置;
[0024]f)调整out指向下一本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种支持合并访存和循环队列的GPU模板计算方法,其特征在于,所述方法包括:合并访存读取二维平面上的一块数据;基于循环队列的模板计算:给定三维模板计算问题:模板计算公式F,模板半径r
x
、r
y
和r
z
;三维网格D
x
×
D
y
×
D
z
,周围halo区域大小H
x
、H
y
和H
z
;输入数据指针data,输出数据指针out;初始化指向共享内存不同数据块的指针s
mm
,s
m
,s
c
,s
p
,s
pp
;线程块大小B
x
、B
y
,当前线程块的索引b
x
、b
y
,当前线程的索引t
x
、t
y
;读取最初的数据块到共享内存,除了第一块数据,s
m
,s
m
,s
c
,s
p
,s
pp
;调整输出数据指针,使其指向正确位置:计算二维平面相距的数据点数量,l=(D
x
+2H
x
)(D
y
+2H
y
);计算当前线程在二维平面上的索引,i
x
=t
x
+b
x
B
x
,i
y
=t
y
+b
y
B
y
;计算当前线程的第一个输出数据所在位置,out=out+(i
x
+H
x
)+(i
y
+H
y
)(D
x
+2H
x
)+r
z
l;计算二维平面相距的数据点数量,l=(D
x
+2H
x
)(D
y
+2H
y
);令k=2r
z
,表示当前应该读入的数据块沿z方向的索引;如果k<D
z
+2H
z
,执行下列操作:a)进行必要的线程同步;b)读取新数据到s
mm
;c)轮换指针,使s
mm
指向原s
m
的数据、s
m
指向原s
c
的数据、......、s
pp
指向原S
mm
的数据;d)执行模板计算公式F;e)输出数据到out指向的位置;f)调整out指向下一个输出位置,out=out+l;g)重新比较k与D
z
+2H
z
的大小;如果k>D
z
+2H
z
,则表示所有输出数据计算完毕。2.根据权利要求1所述的方法,其特征在于,所述合并访存读取二维平面上的一块数据,具体包括:获取合并访存的线程块大小B
x
、B
y
和冗余数据宽度H
x
、H
y
;给定其他初始数据:输入数据的指针data,二维网格平面大小为(D
x
+2H
x
)
×
(D
y
+2H
y
),同时假定三维网格存储为一维数组;读取的数据在GPU共享内存上的存放位置指针s;当前活跃线程在线程块内的索引t
x
和t
y
;当前活跃线程块在整个GPU计算网格内的索引b
x
和b
y
;调用GPU线程块的同步方法,以避免读取的数据覆盖正在使用的数据;计算当前活跃线程在线程块内的一维编号,Ind=t
x
+t
y
B
x
;计算线程块变形后的形状,R
x
=(B
x
+2H
x
)和计算当前线程在变形后的索引,和其中%和/分别为取余和整数除法;计算当前线程要读取的数据在三维网格中的索引,和计算每个线程读取数据的次数,
令k=0;如果k<w,从输入数据中读取数据到共享内存:a)其中括号表示引用数组的对应元素;b)c)i
y
=i
y
+R
y
;d)k=k+1;一次读取完毕,重新比较的k和w大小。3.一种支持合并访存和循环队列的GPU模板计算装置,其特征在于,所述装置包括:...

【专利技术属性】
技术研发人员:胡长军汪岸李嘉莉李建江
申请(专利权)人:北京科技大学
类型:发明
国别省市:

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

1