在过去的几年间GPU在大规模并行运算中起到重要的作用,单从单位面积和单位功耗来看,GPU的计算能力已经大大超过CPU。CUDA、OpenCL等编程工具的出现使得更多的开发人员更容易地更有效率地在GPU平台上编程。本文主要用的是目前一个重要的GPGPU解决方案——OpenCL。稀疏矩阵向量乘是数学和工程学中常用的数值类算法之一,很多数值类算法又能够转换为矩阵的运算,如图像处理和工程科学中的信息处理,求解线性方程组,快速傅里叶变换,优化。解决稀疏矩阵向量乘的优化问题可以对工程科学中的性能有很大的提升。
本文首先以GPU计算为背景,对GPU的发展过程和一些基本概念做些介绍。其次,阐述了AMD系列的GPU的架构,从硬件出发,通过了解硬件平台的架构来为优化做一些准备,并从OpenCL架构方面介绍了平台模型、执行模型、内存模型、编程模型四种模型详细了解OpenCL的运行过程。
在实现基于CSR格式的优化过程中,首先配置了OpenCL的开发环境,主要是针对OpenCL的SDK在头文件和程序库的设置。因为矩阵中的任意两行的操作是没有数据和逻辑依赖关系,所以传统串行算法可并行化,即在传统串行算法代码中表现也就是外层的循环是可以进行并行处理。并用了一个线程处理一行数据、一个wave处理一行数据、一个线程和一个wave处理一行数据的折中方法三种方法。在用一个线程处理一行数据的方法之后发现负载平衡和访问存储器的连续性的问题,之后用一个wave处理一行数据解决。在针对绝大多数行拥有的非零元素数量都远大于64的矩阵时,发现一个wave处理一行数据不能发挥很好的性能,之后用一个线程处理一行数据和一个wave处理一行数据的折中方法解决,之后利用图像对象和量化内核其他优化方法。
最后,对本文进行简单的总结并展望未来异构平台下的SpMV优化。