文档

加快相关使用GPU进行

此示例示出了如何GPU可被用于加速互相关。许多相关问题涉及大型数据集和使用GPU可以更快地得到解决。要使用这个例子中,你必须有一个并行计算工具箱™用户许可和支持CUDA的NVIDIA GPU计算能力1.3或更高版本。

介绍

为了执行这个例子,你必须有1.3或更高的ComputeCapability一个GPU。您访问使用并行计算工具箱产品的GPU。首先,重要的是要知道在你的机器上GPU的基本信息。

fprintf中(“标杆GPU加速的互相关。\ n”);如果〜(parallel.gpu.GPUDevice.isAvailable)fprintf中([“\ n \吨** GPU不具有1.3或计算能力”...“更大。停止。** \ n”]);返回;其他dev的= gpuDevice;fprintf中(...'GPU检测(%S,%d多处理器,计算能力%S)'...dev.Name,dev.MultiprocessorCount,dev.ComputeCapability);结束
标杆GPU加速的互相关。GPU检测(特斯拉C2075,14个多处理器,计算能力2.0)

功能标杆

因为用于CPU写的代码可以移植到运行在GPU上,一个单独的函数可以被用于基准,CPU和GPU。然而,由于在GPU上的代码从CPU异步执行,特殊的预防措施,应衡量绩效时考虑。测量执行一个功能所花费的时间之前,确保所有GPU处理已经由该设备上执行的“等待”方法完成。这个额外的呼叫会对CPU性能没有影响。

本实施例中基准测试三种不同类型的互相关的。

基准简单的互相关

对于第一种情况,两个相同大小的矢量是互相关的使用语法xcorr(U,V)。的CPU执行时间到GPU执行时间的比率绘制为矢量的大小。

fprintf中('\ n \ n ***基准向量 - 向量互相关*** \ n \ n');fprintf中('标杆功能:\ n');类型('benchXcorrVec');fprintf中('\ n \ n');尺寸= [2000 1E4 1E5 5E5 1E6];TC =零(1,numel(尺寸));TG =零(1,numel(尺寸));numruns = 10;对于S = 1:numel(大小);fprintf中('跑步%d元素xcorr ... \ N',大小(S));delchar = repmat('\ B',1,numruns);一个=兰特(尺寸(S),1);B =兰特(尺寸(S),1);TC(S)= benchXcorrVec(A,B,numruns);fprintf中([delchar'\吨\ TCPU时间:%.2f MS \ N'],1000 * TC(S));TG(S)= benchXcorrVec(gpuArray(a)中,gpuArray(b)中,numruns);fprintf中([delchar'\吨\ tGPU时间:%.2f MS \ N'],1000 * TG(S));结束%绘制结果无花果=图。AX =轴(“父”, 图);semilogx(AX,尺寸,tc./tg,'R *  - ');ylabel(斧,'加速');xlabel(斧,“矢量大小”);标题(斧,“XCORR的GPU加速”);的DrawNow;
***基准向量 - 向量互相关***基准函数:函数T = benchXcorrVec(U,V,numruns)%用于基准xcorr与CPU和GPU上矢量输入。%版权所有2012 MathWorks公司timevec =零(1,numruns);gdev = gpuDevice;对于II = 1:numruns TS =抽动;O = xcorr(U,V);%#确定等待(gdev)timevec(II)= TOC(TS);fprintf中( '');结束吨=分钟(timevec);运行结束xcorr 2000元的... CPU时间:0.74毫秒GPU时间:3.51毫秒运行10000元的xcorr ... CPU时间:1.98毫秒GPU时间:3.69毫秒运行100000个元素xcorr ... CPU时间:16.16毫秒GPU时间:5.47毫秒运行500000个元素xcorr ... CPU时间:84.70毫秒GPU时间:15.51毫秒运行百万元的xcorr ... CPU时间:325.30毫秒GPU时间:28.03毫秒

标杆矩阵列互相关

对于第二种情况下,矩阵A的列是成对交叉相关,以产生使用语法xcorr(A)的所有相关性的大的矩阵输出。的CPU执行时间到GPU执行时间的比率绘制为矩阵A的大小

fprintf中('\ n \ n ***基准矩阵列的互相关*** \ n \ n');fprintf中('标杆功能:\ n');类型('benchXcorrMatrix');fprintf中('\ n \ n');尺寸=地板(linspace(0100,11));尺寸(1)= [];TC =零(1,numel(尺寸));TG =零(1,numel(尺寸));numruns = 10;对于S = 1:numel(大小);fprintf中('的%d x%的d矩阵... \ n运行xcorr(矩阵)',尺寸(一个或多个),大小(S));delchar = repmat('\ B',1,numruns);一个=兰特(尺寸(S));TC(S)= benchXcorrMatrix(一,numruns);fprintf中([delchar'\吨\ TCPU时间:%.2f MS \ N'],1000 * TC(S));TG(S)= benchXcorrMatrix(gpuArray(a)中,numruns);fprintf中([delchar'\吨\ tGPU时间:%.2f MS \ N'],1000 * TG(S));结束%绘制结果无花果=图。AX =轴(“父”, 图);图(斧,尺寸。^ 2,tc./tg,'R *  - ');ylabel(斧,'加速');xlabel(斧,“矩阵元”);标题(斧,'XCORR(基质)的GPU加速');的DrawNow;
***基准矩阵列的互相关***基准函数:函数T = benchXcorrMatrix(A,numruns)%用于基准xcorr与CPU和GPU矩阵输入。%版权所有2012 MathWorks公司timevec =零(1,numruns);gdev = gpuDevice;对于II = 1:numruns,TS =抽动;O = xcorr(A);%#确定等待(gdev)timevec(II)= TOC(TS);fprintf中( '');结束吨=分钟(timevec);端部的10×10矩阵... CPU时间运行xcorr(矩阵):0.78毫秒时间GPU:3.65毫秒运行的20×20矩阵... CPU时间xcorr(矩阵):1.39毫秒时间GPU:3.40毫秒运行的一个30×30矩阵... CPU时间xcorr(矩阵):2.26毫秒时间GPU:3.47毫秒运行的一个40×40矩阵... CPU时间xcorr(矩阵):6.04毫秒时间GPU:3.79毫秒运行xcorr(matrix) of a 50 x 50 matrix... CPU time : 10.23 ms GPU time : 3.92 ms Running xcorr (matrix) of a 60 x 60 matrix... CPU time : 15.18 ms GPU time : 4.16 ms Running xcorr (matrix) of a 70 x 70 matrix... CPU time : 35.34 ms GPU time : 5.58 ms Running xcorr (matrix) of a 80 x 80 matrix... CPU time : 46.71 ms GPU time : 6.26 ms Running xcorr (matrix) of a 90 x 90 matrix... CPU time : 59.43 ms GPU time : 7.04 ms Running xcorr (matrix) of a 100 x 100 matrix... CPU time : 74.93 ms GPU time : 8.21 ms

基准二维互相关

对于最后一种情况,两个矩阵,X和Y,是用交叉xcorr2(X,Y)相关。而Y被允许改变X是固定的大小。加速比绘制在第二矩阵的大小。

fprintf中('\ n \ n ***标杆2- d互相关*** \ n \ n');fprintf中('标杆功能:\ n');类型('benchXcorr2');fprintf中('\ n \ n');尺寸= [100,200,500,1000,1500,2000];TC =零(1,numel(尺寸));TG =零(1,numel(尺寸));numruns = 4;一个=兰特(100);对于S = 1:numel(大小);fprintf中('的100×100矩阵,%d x%的d矩阵... \ n运行xcorr2',尺寸(一个或多个),大小(S));delchar = repmat('\ B',1,numruns);B =兰特(尺寸(S));TC(S)= benchXcorr2(A,B,numruns);fprintf中([delchar'\吨\ TCPU时间:%.2f MS \ N'],1000 * TC(S));TG(S)= benchXcorr2(gpuArray(a)中,gpuArray(b)中,numruns);fprintf中([delchar'\吨\ tGPU时间:%.2f MS \ N'],1000 * TG(S));结束%绘制结果无花果=图。AX =轴(“父”, 图);semilogx(AX,尺寸。^ 2,tc./tg,'R *  - ');ylabel(斧,'加速');xlabel(斧,“矩阵元”);标题(斧,“XCORR2的GPU加速”);的DrawNow;fprintf中('\ n \ nBenchmarking完成。\ n \ n');
***基准2-d互相关***基准函数:函数T = benchXcorr2(X,Y,numruns)%用于基准xcorr2 CPU和GPU上。%版权所有2012 MathWorks公司timevec =零(1,numruns);gdev = gpuDevice;对于II = 1:numruns,TS =抽动;O = xcorr2(X,Y);%#确定等待(gdev)timevec(II)= TOC(TS);fprintf中( '');结束吨=分钟(timevec);结束运行100×100矩阵的xcorr2和100×100矩阵... CPU时间:15.92毫秒时间GPU:10.49毫秒运行100×100矩阵的xcorr2和200×200矩阵... CPU时间:31.35毫秒时间GPU:20.30毫秒运行一个100×100矩阵的xcorr2和500×500矩阵... CPU时间:159.65毫秒GPU时间:60.75毫秒运行100x100的矩阵xcorr2和1000×1000矩阵... CPU时间:552.55毫秒GPU时间:188.32毫秒运行的xcorr2 a 100x100 matrix and 1500 x 1500 matrix... CPU time : 1228.93 ms GPU time : 391.52 ms Running xcorr2 of a 100x100 matrix and 2000 x 2000 matrix... CPU time : 2402.89 ms GPU time : 655.20 ms Benchmarking completed.

其它GPU加速的信号处理功能

有迹象表明,可在GPU上运行的其他几个信号处理功能。这些功能包括FFT,IFFT,CONV,过滤器,fftfilt,等等。在某些情况下,可以实现相对于CPU大的加速度。对于GPU的完整列表,加速信号处理功能看到“GPU加速”部分在内容信号处理工具箱(TM)表。

是这个主题有帮助吗?