Heterogeneous Parallel Programming(异构并行编程)学习笔记(三)

米国人都去过圣诞了,这次内容不多。


1. Bursting

由于种种原因,DRAM的核心速度低于接口速度,因此引入了所谓Bursting的技术。Bursting,是指当读取DRAM时,返回所读取的位以及其后连续的许多位,以增加访问速度。若其后的连续位没有被用到,则被丢弃。比如,DRAM的核心速度是接口速度的1/N倍,则在一次读取中,取出N × 接口位宽的数据,然后在N时间段中以接口速度传输。1/N × N × 接口位宽,这样就充分地利用了接口位宽。


2. 内存合并(Memory Coalescing)

从上面可以看出,如果程序读取的是在内存中的连续数据,则读取速度会快很多,最多可达N倍。更具体一些,我们要让各线程在同一步中访问的是在内存中连续的数据。以之前的简单矩阵相乘为例,它的访问模型如下:


我们知道二维矩阵是以行优先的一维数组形式存放的。那么,对d_N来说,各线程是水平并行排列的,在同一时间,它们所需要的数据是水平连续的。因此,读取d_N矩阵是内存合并的,每一个Bursting出来的数据都得到了利用。相反,d_M则是垂直并行的,每一次的内存读取只有读取的位得到利用,后续连续部分都被丢弃。因此,读取d_M矩阵不是内存合并的,效率很低。


3. 边界条件

在分块算法中,由于待计算的矩阵可能不是正方的,导致有些分块可能越过边界。一种简单的思路是将原矩阵进行填充,使其大小正好为分块大小的整数倍。这样做会带来很大的数据传输开销。

边界情况分为两种,以C = A × B为例,第一种是A和B中的部分分块可能越过边界,这样读取时会访问到错误的数据;第二种是C中的部分分块可能越过边界,这样计算时会产生错误,存储时会溢出。如下图所示:


M和N矩阵是第一种情况,而待计算的P矩阵是第二种情况。

这里采用另外一种很简单的办法。在读取数据时,判断位置是否越过边界,若没有,则读取该位置,若是,则赋值为0;在计算和存储数据时判断位置,只有当位置在边界内时才计算和存储。

你可能感兴趣的:(cuda,parallel,编程)