欢迎来到天天文库
浏览记录
ID:20453381
大小:52.50 KB
页数:5页
时间:2018-10-11
《矩阵乘法的gpu实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、矩阵乘法的GPU实现使用图形硬件来进行通用数值计算已经成为一个主流的讨论话题。以利用少量重用输入数据进行高度并行计算为代表的流算法的实现,已经广泛应用在GPU领域。其中密度矩阵乘法频繁的数据执行模式和高度并行计算的特点,使得矩阵乘法成为GPU高效计算的很好的一个选择。但令人惊讶的是,如此接近完美的GPU算法执行起来效率却不如目前采用的CPU缓存已知方式。我们发现导致这个现象的原因是在计算邻近的高速缓存时,GPU效率大大落后CPU,高速缓存带宽的限制降低了GPU执行计算重要重用数据的性能。 关键词矩阵;乘法;GPU TP39A16
2、74-6708(2011)54-0189-01 1算法介绍 可编程图形硬件的出现,使得人们对降低GPU数值计算的兴趣大为提升。结合高带宽的内存和比传统CPU更快进行浮点数计算的硬件,使得图形处理器更加适合进行高度并行化的数值计算工作流。算法如果采用流计算结构,通常能够获得显著的性能提高。 流计算可以被描述为利用少量重用数据进行高度并行化和数字集中计算。然而,许多计算虽然高度并行化和数字集中,但却重用了所有的数据。我们研究了目前图形计算架构,这种架构中每个输入都作用于多个输出。针对传统的CPU,对这些问题进行优化,可以有效的扩大
3、内存带宽,提供处理器单元的效率。我们认为这种“分块”内存的策略,可以提高运算效率,并且可以有效的在GPU上执行;甚至类似的“分块”策略可以使用在可编程模式和当前的图形架构。 为此,我们特别研究密度矩阵乘法。这种算法提供固定的内存访问,高度的并行化计算,却只需O(n)复杂度的数据重用,被认为是天然的快速GPU实现算法。 CPU架构中的缓存已知[1]已经被很好的实现,多种GPU算法[2]也已被开发。Larsen和McAllister最先支持在图形硬件上进行矩阵的计算。他们认识到这种算法同CPU的效率相当,但却受限于8比特的定点计算。
4、我们根据他们的推断,研究并认为GPU不能提供高带宽来访问那些频繁被读取的数据,从而导致了了算法上的带宽限制。为了得到更高的性能,就需要一个架构上的调整。 2矩阵乘法的实现 我们考虑计算两个大规模、高密度的N*N矩阵的乘法:C=A*B。我们先快速的在CPU上建立原型并进行优化,再为GPU进行深入的改善。 1)矩阵算法在CPU上的实现 图1矩阵相乘在CPU上实现的伪代码 不幸的是,虽然算法简单,但数据的位置却十分复杂。矩阵B中的元素是通过列的位置进行访问的,因此它们在内存中不是顺序存放(通常二维数组在内存中以行为主进行存储
5、)。当j的迭代计算中重用了矩阵A的i行,然而此行的数据却可能已经在最内部循环计算结束后抛出缓存。因此,算法的带宽受到限制,表现出极低的性能和低下的效率(进行数据读取的时间相比于进行计算的时间)。 在持续的缓存读取时,P4处理器在一个循环中可以读取128位的流式单指令数据[3]。原始的三层循环算法的最大缺点是每次循环工作集的大小阻止了通过最快的内存层次来放大带宽。标准的解决方法是将输入分块成适合处理器缓存大小的子矩阵,将原有的计算分解为针对子矩阵的子运算。此外,将矩阵B按照更适合内存读取的转置阵的格式进行存储。针对CPU矩阵相乘的高
6、效的缓存已知实现,获得了更高效的带宽,进而得到高效的计算。 2)矩阵算法在GPU上的实现 一个实现矩阵相乘的简单方法是:在一个着色通道中计算结果矩阵,只要着色器过大。我们把这种方法成为单通道NV算法。我们把2*2的矩阵单元存储在四个纹理结构中[4]。通过这个结构,在一个程序片段中,内存中的输入可以被使用两次。因此数据的第二次读取就可以认为是寄存器的读取。根据图2中的算法,着色器从矩阵A读取两行,从矩阵B读取两列,用于计算输出矩阵的4个数值。变量i和j通过插入纹理变化提供给着色器。 图2矩阵相乘在GPU上实现的伪代码 每个
7、着色器计算图1中的4个内部循环迭代。GPU的纹理缓存用于捕获2D位置信息,因此无论列和行的数据在缓存中都是连续的。此外,由于着色器并行的处理邻近的片段,因此将会同时从输入中读到相同的行或列的数据。实际中,处理太大的矩阵,指令计数器将会超过架构限制,并且需要多个着色通道来完成计算。 与单个着色通道相比,多通道的算法通过进行额外的帧缓冲器的读写,更加的符合缓存计算。我们的实现基于Larsen和McAllister的变种多通道算法[5]。这种算法将矩阵列中4个连续的数据打包到一个纹理内,再将其与着色器中一个4*1的矢量计算出一个4*4的
8、矩阵[6]。在这种算法中,矩阵B的数据被使用了四次,但矩阵A中的数据却使用了一次。这种算法需要的纹理数是单通道NV算法的1.5倍。但是因为在渲染过程中,只访问了输入中少量的行列数据,因此快取命中率将会大大提升。图3为一个着色器计算一个
此文档下载收益归作者所有