基于CUDA的加速MATLAB计算研究

时间:2011-11-18   来源:职称论文网   网友评论:0   人气: 1015 作者:

近几年来,计算机显卡核心单元GPU(graphics processing unit)在浮点运算性能方面取得了突飞猛进的发展(如NVIDIA公司推出的GeForce GTX200系列高端显卡,浮点运算速度逼近每秒万亿次左右,相当于过去小型机的处理能力),GPU以其远远超过CPU的浮点运算性能、高内存带宽、高性价比等优点,越来越受到广大科研人员的重视,并在分子生物模拟、地震数据处理、超级计算机、金融模型计算等[5~8]方面取得了不错的加速效果,一些计算的加速效果达到100多倍。虽然GPU计算有如此好的加速效果和高速浮点运算性能等优点,但是在岩土工程的相关计算中还没有引入该方法。基于这一目的,本文介绍了NVIDIA公司的GPU通用计算框架CUDA,以及利用CUDA加速计算MATLAB程序的原理,通过规模矩阵计算、快速傅里叶变换(FFT)、支持向量机(SVM)等岩土工程计算中的常见算法,分析了CUDA加速MATLAB程序的情况。

  1 CUDA框架特点

  1.1 CUDA简介

  为了充分发挥GPU的高速浮点运算等方面性能,NVIDIA公司研究人员针对该公司的GPU设计出了一种新的计算框架CUDA。该框架是一个软硬件协同的完整并行计算解决方案,提供了硬件的直接访问接口以及高性能计算指令,可以使GPU与CPU协同工作,合理管理GPU设备、存储器、流、事件等,充分利用GPU高速内存带宽,从而实现复杂的问题加速计算,尤其是大规模的并行计算问题。CUDA开发工具主要包括CUDA驱动程序、CUDA运行时库、CUDA库三个组件。CUDA软件的核心层次结构如图1所示[9]。

  1.2 MATLAB在CUDA框架下的的使用

  由于MATLAB的M语言编程时与外部环境的数据和程序的交互非常有限,MATLAB提供了功能更强大的MEX脚本文件。利用MEX文件,可以调用C、Fortran等语言、输入或输出数据、与其他软件建立客户/服务器通信、直接控制硬件等功能[10]。

  NVIDIA公司针对MATLAB开发了一个新的插件,该插件包含一个名为nvmex脚本和一个简化CUDA配置的可选配置文件。通过nvmex可以将CUDA源程序编译为MATLAB的MEX脚本文件,使MATLAB软件方便地调用CUDA函数库,方便数据计算[11,12]。

  一个基本的CUDA mex文件数据计算操作包含以下几个步骤:a)在GPU中分配合适的数据存储空间。b)将数据从主机内存移动到GPU内存中,GPU开始分配线程块等准备工作,并根据CUDA代码调用相关函数库,做相应的数据计算操作。GPU计算完成后,将数据返回主机内存中。c)释放GPU中的数据存储空间,完成整个计算流程[10]。其流程如图2所示。

  2 MATLAB加速计算在岩土工程中的应用

  在岩土工程中,常常使用矩阵计算、快速傅里叶变换(FFT)、支持向量机等算法来解决岩土工程中的计算问题。例如,矩阵计算可以解决岩土力学[13]、渗流有限元分析[14]等方面问题,快速傅里叶变换模型可以解决动荷载作用下土的动力响应[15,16]问题,支持向量机模型可以解决岩体工程分级[17]、地下工程可靠性分析[18]、边坡稳定性[19]等方面问题。

 

  下面将从测试平台、测试算法、测试结果方面,详细探讨MATLAB对上述算法的加速效果。

  2.1 测试平台环境选择

  本文软件测试平台选用的是Windows XP SP2操作系统,支持CUDA插件的MATLAB 7.3.0 (R2006b),CUDA 2.1版本库。硬件测试平台是双核的Intel Core2Duo E4400 2.0 GHz CPU,影驰9600GT显卡(其核心是NVIDIA GeForce 9600 GT),DDR2 800金士顿1 GB内存。

  2.2 测试算法

  CUDA加速MATLAB的主要原理是将流程控制的操作如串行代码放在CPU中操作,而一些需要大规模并行计算的操作代码放在GPU中处理,从而缩短了整个计算操作的时间。MATLAB中数据的计时方式采用tic、toc函数来标记起止时间。CUDA计算数据的流程如图2所示。下面详细介绍这些算法的实现。

  2.2.1 矩阵计算

  矩阵计算模型采用的是常见的矩阵乘法,通过不同维度的矩阵相乘,比较出在不同维度下的加速效果。为了研究的方便和矩阵数据一致性,这里的矩阵都采用方阵,矩阵数据是由生成的随机数填充,并保存在txt文件中。

  传统MATLAB的实现方式是先在主机上分配好矩阵的存储空间,将txt文件数据读入到数组中,然后调用矩阵乘法命令,将计算的结果保存到指定的结果数组中,完成整个计算。

  基于CUDA的实现方式主要是利用CUDA自带的CUBLAS库进行矩阵计算。其步骤是主机先将txt文件数据读入主机内存;然后GPU调用cublasInit函数初始化GPU,并调用cublasAlloc函数分配矩阵的GPU存储空间,将主机内存中的矩阵数据读入GPU中;最后GPU调用cublasSgemm函数进行矩阵乘法计算,并通过cublasGetVector函数将计算结果返回主机,调用cublasFree函数释放GPU上的矩阵存储空间,完成整个计算工作[11]。

  2.2.2 快速傅里叶变换(FFT)

  FFT计算方式与矩阵计算类似,也是先生成随机的FFT原始数据,并将数据保存在txt文件中,保证测试数据的统一性。

  传统MATLAB的实现方式是将txt文件的数据读入到指定的数组中,然后调用fft函数,并返回指定结果,完成整个计算。

  基于CUDA的实现方式是利用CUDA自带的CUFFT库。实现步骤是先将txt文件的数据读入主机内存;然后GPU调用cudaMalloc分配GPU上的存储空间,调用cudaMemcpy将数据从主机内存复制到GPU内存,再调用cufftPlan1d建立一维FFT plan;最后调用cufftExecC2C函数完成FFT变换,将计算结果返回主机内存,释放plan以及GPU上的数据存储空间,完成整个计算工作[11]。

  2.2.3 支持向量机(SVM)

  SVM算法分为训练、预测两部分。其计算方式与上述算法类似,先生成一定数量的训练样本和测试样本数据,然后保存在txt文件中,由两种算法分别对测试样本进行训练、预测。

  传统的MATLAB的实现方式是将txt文件的数据读入指定的数组中,然后设定好训练参数,调用svmtrain函数进行训练并得到训练模型,根据训练模型和测试数据调用svmclassify函数进行预测,并返回相应的预测结果。

  基于CUDA的实现方式主要是利用参考文献[20]的cuSVM库进行实验。实现步骤是先读取txt文件数据,然后设置好训练参数,调用cuSVMTrain函数对训练样本进行训练并生产训练模型,根据训练模型和测试数据调用cuSVMPredict函数进行预测,返回相应预测结果,完成整个计算。

  2.3 测试结果

  2.3.1 矩阵计算



 

文章评论