主要内容

加速与GPU的相关性

此示例显示如何使用GPU加速互相关。许多相关问题涉及大数据集,并且可以使用GPU更快地解决。此示例需要并行计算工具箱™用户许可证。参考GPU通万博1manbetx过发布支持(并行计算工具箱)查看支持哪些gpu。万博1manbetx

介绍

首先在您的计算机中学习有关GPU的一些基本信息。要访问GPU,请使用“并行计算”工具箱。

流('基准GPU加速的交叉相关。\ n');如果〜(parallel.gpu.gpudevice.isavailable)fprintf([' \ n \ t * * GPU不可用。停止。* * \ n”]);返回别的dev = gpuDevice;流(...“检测到GPU (%s, %d多处理器,计算能力%s)”...dev.name,dev.multiprocessorcount,dev.Compteapability);结尾
基于GPU加速的互相关。检测到GPU(Titan XP,30个多处理器,计算能力6.1)

基准测试函数

因为为CPU编写的代码可以移植到GPU上运行,所以可以使用一个函数对CPU和GPU进行基准测试。但是,由于GPU上的代码是从CPU异步执行的,所以在测量性能时应该采取特别的预防措施。在测量执行一个函数所花费的时间之前,通过在设备上执行“等待”方法,确保所有的GPU处理已经完成。这个额外的调用对CPU性能没有影响。

这个例子对三种不同类型的相互关系进行了基准测试。

基准简单的交叉相关

对于第一种情况,两个大小相等的向量使用语法相互关联Xcorr(U,V).CPU执行时间与GPU执行时间的比率绘制针对向量的大小绘制。

流('\n\n ***基准矢量-矢量互相关*** \n\n');流('基准函数:\ n');类型('benchxcorrevec');流(“\ n \ n”);尺寸= [2000 1E4 1E5 5E5 1E6];tc = 0(1,元素个数(大小));tg = 0(1,元素个数(大小));numruns = 10;为了s = 1:磁数(大小);流('运行%d元素的xcorr ... \ n',大小);delchar = repmat(“\ b”1、numruns);a =兰德(大小(s), 1);b =兰德(大小(s), 1);tc(s) = benchXcorrVec(a, b, numruns);流([delcharcpu时间:%。2 f \ n '女士],1000 * tc(s));TG(s)= BenchxcorRvec(GPUARRAY(A),GPUARRAY(B),NUMRUNs);流([delchar'\ t \ tgpu时间:%.2f ms \ n'],1000 * Tg(s));结尾%绘制结果无花果=图;ax =轴('父母'图);semilogx(斧头,大小,tc./tg,“r * - - - - - -”);ylabel (ax,“加速”);xlabel(斧头,'矢量大小');标题(斧头,“XCORR GPU加速”);drawnow;
***基准测试矢量 - 矢量互联***基准函数:功能t = benchxcorrvec(u,v,numruns)%用于基于CPU和GPU上的矢量输入的基准测试XCorr。% Copyright 2012 The MathWorks, Inc. timevec = zeros(1,numruns);gdev = gpuDevice;对于II = 1:numruns ts = tic;o = Xcorr(U,V);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');End t = min(timevec);结束2000元素的XCorr ... CPU时间:0.21 ms GPU时间:4.26 MS运行10000元素的XCorr ... CPU时间:1.03 MS GPU时间:4.37 MS运行100000元素的XCorr ... CPU时间:14.04毫秒GPU时间:6.28 MS运行500000元素的XCorr ... CPU时间:55.98 MS GPU时间:16.09 MS运行1000000元素的XCorr ... CPU时间:169.00 MS GPU时间:25.60毫秒

基准矩阵柱互相关

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

流('\ n \ n ***基准测试矩阵柱互联*** \ n \ n');流('基准函数:\ n');类型('benchxcorrmatrix');流(“\ n \ n”);尺寸=地板(Linspace(0,100,11));大小(1)= [];tc = 0(1,元素个数(大小));tg = 0(1,元素个数(大小));numruns = 10;为了s = 1:磁数(大小);流('运行Xcorr(矩阵)%d x%d矩阵... \ n',尺寸,大小);delchar = repmat(“\ b”1、numruns);一个=兰德(大小(s));tc(s) = benchXcorrMatrix(a, numruns);流([delcharcpu时间:%。2 f \ n '女士],1000 * tc(s));TG(s)= Benchxcorrmatrix(GPUARRAY(A),NUMRUNS);流([delchar'\ t \ tgpu时间:%.2f ms \ n'],1000 * Tg(s));结尾%绘制结果无花果=图;ax =轴('父母'图);情节(ax,大小。^ 2, tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);xlabel(斧头,矩阵元素的);标题(斧头,'GPU加速XCorr(矩阵)');drawnow;
***基准矩阵列互相关***基准函数:function t = benchXcorrMatrix(A, numruns) %用于在CPU和GPU上对输入矩阵的xcorr进行基准测试。% Copyright 2012 The MathWorks, Inc. timevec = zeros(1,numruns);gdev = gpuDevice;For ii=1:numruns, ts = tic;o = xcorr(一个);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');End t = min(timevec);end运行10 × 10矩阵的xcorr (matrix)…CPU时间:0.18 ms GPU时间:5.00 ms运行xcorr (matrix)的20 × 20矩阵… CPU time : 0.48 ms GPU time : 4.83 ms Running xcorr (matrix) of a 30 x 30 matrix... CPU time : 0.85 ms GPU time : 4.84 ms Running xcorr (matrix) of a 40 x 40 matrix... CPU time : 3.38 ms GPU time : 5.57 ms Running xcorr (matrix) of a 50 x 50 matrix... CPU time : 5.60 ms GPU time : 5.22 ms Running xcorr (matrix) of a 60 x 60 matrix... CPU time : 8.49 ms GPU time : 5.39 ms Running xcorr (matrix) of a 70 x 70 matrix... CPU time : 20.43 ms GPU time : 5.92 ms Running xcorr (matrix) of a 80 x 80 matrix... CPU time : 26.79 ms GPU time : 6.24 ms Running xcorr (matrix) of a 90 x 90 matrix... CPU time : 40.04 ms GPU time : 6.89 ms Running xcorr (matrix) of a 100 x 100 matrix... CPU time : 49.69 ms GPU time : 7.32 ms

基准测试的二维互相关

对于最终的情况,两个矩阵,x和y,使用xcorr2(x,y)交叉相关。x允许x固定为y尺寸。绘制加速度符合第二矩阵的大小。

流('\n\n ***基准二维互相关*** \n\n');流('基准函数:\ n');类型(“benchXcorr2”);流(“\ n \ n”);尺寸= [100,200,500,1000,1500,2000];tc = 0(1,元素个数(大小));tg = 0(1,元素个数(大小));numruns = 4;一个=兰德(100);为了s = 1:磁数(大小);流('运行100x100矩阵的Xcorr2和%d x%d矩阵... \ n',尺寸,大小);delchar = repmat(“\ b”1、numruns);b =兰特(尺寸);Tc(s)= benchxcorr2(a,b,numruns);流([delcharcpu时间:%。2 f \ n '女士],1000 * tc(s));TG(s)= Benchxcorr2(GPUARRAY(A),GPUARRAY(B),NUMRUNs);流([delchar'\ t \ tgpu时间:%.2f ms \ n'],1000 * Tg(s));结尾%绘制结果无花果=图;斧头=轴('父母'图);semilogx(斧头,大小。^ 2,tc./tg,“r * - - - - - -”);ylabel (ax,“加速”);xlabel(斧头,矩阵元素的);标题(斧头,“XCORR2 GPU加速”);drawnow;流('\ n \ nbenchmarking完成了。\ n \ n');
***基准2d互相关***基准功能:function t = benchXcorr2(X, Y, numruns) %用于在CPU和GPU上对xcorr2进行基准测试。% Copyright 2012 The MathWorks, Inc. timevec = zeros(1,numruns);gdev = gpuDevice;For ii=1:numruns, ts = tic;o = xcorr2 (X, Y);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');End t = min(timevec);运行100x100矩阵和100x100矩阵的xcorr2…CPU时间:20.35 ms GPU时间:6.96 ms运行xcorr2的100 × 100矩阵和200 × 200矩阵… CPU time : 42.87 ms GPU time : 11.72 ms Running xcorr2 of a 100x100 matrix and 500 x 500 matrix... CPU time : 125.23 ms GPU time : 39.67 ms Running xcorr2 of a 100x100 matrix and 1000 x 1000 matrix... CPU time : 386.59 ms GPU time : 88.46 ms Running xcorr2 of a 100x100 matrix and 1500 x 1500 matrix... CPU time : 788.38 ms GPU time : 165.04 ms Running xcorr2 of a 100x100 matrix and 2000 x 2000 matrix... CPU time : 1523.05 ms GPU time : 279.55 ms Benchmarking completed.

其他GPU加速信号处理功能

还有其他几个信号处理功能可以在GPU上运行。这些函数包括fft, ifft, conv, filter, fftfilt等等。在某些情况下,您可以实现相对于CPU的较大加速。有关GPU加速信号处理函数的完整列表,请参阅GPU算法加速“信号处理工具箱”文档中的章节。

另请参阅

(并行计算工具箱)|(并行计算工具箱)|