主要内容

加速与gpu的关联

这个例子展示了如何使用GPU来加速互相关。许多相关问题涉及大型数据集,使用GPU可以更快地解决。此示例需要并行计算工具箱™用户许可证。指GPU计算要求(并行计算工具箱)看看支持哪些图形处理器。金宝app

简介

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

流(gpu加速交叉相关的基准测试。\n);如果~ (parallel.gpu.GPUDevice.isAvailable)流(['\n\t**GPU不可用。停止。* * \ n”]);返回其他的dev = gpuDevice;流(...'检测到GPU (%s, %d个多处理器,计算能力%s)'...dev.Name, dev.MultiprocessorCount, dev.ComputeCapability);结束
基准测试gpu加速相互关联。检测到GPU (TITAN Xp, 30多处理器,计算能力6.1)

基准测试函数

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

这个例子测试了三种不同类型的相互关联。

基准简单互相关

对于第一种情况,两个大小相等的向量使用语法相互关联xcorr (u, v).CPU执行时间与GPU执行时间的比值是根据向量的大小绘制的。

流('\n\n ***基准向量-向量互相关*** \n\n');流('基准测试功能:\n');类型(“benchXcorrVec”);流(“\ n \ n”);尺寸= [2000 1e4 1e5 5e5 1e6];Tc = 0(1,数字(大小));Tg = 0 (1,numel(sizes));Numruns = 10;s = 1:元素个数(大小);流('运行%d元素的xcorr…\n'、大小(s));Delchar = repmat(“\ b”1、numruns);A = rand(尺寸(s),1);B = rand(尺寸(s),1);tc(s) = benchXcorrVec(a, b, numruns);流([delchar'\t\tCPU时间:%。2 f \ n '女士), 1000 * tc (s));tg(s) = benchXcorrVec(gpuArray(a), gpuArray(b), numruns);流([delchar\t\tGPU时间:%。2 f \ n '女士), 1000 * tg (s));结束绘制结果图;Ax =轴(“父”图);半ilogx(ax,尺寸,tc./tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,向量的大小的);标题(ax,XCORR的GPU加速);drawnow;
***基准功能:function t = benchXcorrVec(u,v, numruns) %用于在CPU和GPU上用矢量输入对xcorr进行基准测试。timevec = 0 (1,numruns);gdev = gpuDevice;对于ii=1:numruns ts = tic;O = xcorr(u,v);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');结束t = min(timevec);运行xcorr(2000个元素)…CPU时间:0.21 ms GPU时间:4.26 ms运行xcorr of 10000 elements… CPU time : 1.03 ms GPU time : 4.37 ms Running xcorr of 100000 elements... CPU time : 14.04 ms GPU time : 6.28 ms Running xcorr of 500000 elements... CPU time : 55.98 ms GPU time : 16.09 ms Running xcorr of 1000000 elements... CPU time : 169.00 ms GPU time : 25.60 ms

基准测试矩阵列相互关联

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

流('\n\n ***基准矩阵列互相关*** \n\n');流('基准测试功能:\n');类型(“benchXcorrMatrix”);流(“\ n \ n”);size = floor(linspace(0,100, 11));尺寸(1)= [];Tc = 0(1,数字(大小));Tg = 0 (1,numel(sizes));Numruns = 10;s = 1:元素个数(大小);流('运行一个%d x %d矩阵的xcorr(矩阵)…\n',尺寸(s),尺寸(s));Delchar = repmat(“\ b”1、numruns);A = rand(尺寸(s));tc(s) = benchXcorrMatrix(a, numruns);流([delchar'\t\tCPU时间:%。2 f \ n '女士), 1000 * tc (s));tg(s) = benchXcorrMatrix(gpuArray(a), numruns);流([delchar\t\tGPU时间:%。2 f \ n '女士), 1000 * tg (s));结束绘制结果图;Ax =轴(“父”图);情节(ax,大小。^ 2, tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,矩阵元素的);标题(ax,GPU加速XCORR(矩阵));drawnow;
***基准测试矩阵列互相关联***基准测试功能:function t = benchXcorrMatrix(A, numruns) %用于在CPU和GPU上用矩阵输入对xcorr进行基准测试。timevec = 0 (1,numruns);gdev = gpuDevice;对于ii=1:numruns, ts = tic;o = xcorr(A);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');结束t = min(timevec);end运行10 × 10矩阵的xcorr (matrix)…CPU时间:0.18 ms GPU时间:5.00 ms运行20 × 20矩阵的xcorr (matrix)… 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的大小是固定的,而Y的大小可以变化。加速是根据第二个矩阵的大小绘制的。

流('\n\n ***基准测试二维互相关*** \n\n');流('基准测试功能:\n');类型(“benchXcorr2”);流(“\ n \ n”);size = [100, 200, 500, 1000, 1500, 2000];Tc = 0(1,数字(大小));Tg = 0 (1,numel(sizes));Numruns = 4;A =兰特(100);s = 1:元素个数(大小);流(“运行100x100矩阵的xcorr2和%d x %d矩阵…\n”,尺寸(s),尺寸(s));Delchar = repmat(“\ b”1、numruns);B = rand(尺寸(s));tc(s) = benchXcorr2(a, b, numruns);流([delchar'\t\tCPU时间:%。2 f \ n '女士), 1000 * tc (s));tg(s) = benchXcorr2(gpuArray(a), gpuArray(b), numruns);流([delchar\t\tGPU时间:%。2 f \ n '女士), 1000 * tg (s));结束绘制结果图;ax =轴(“父”图);semilogx (ax,大小。^ 2, tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,矩阵元素的);标题(ax,XCORR2的GPU加速);drawnow;流(' \ n \ nBenchmarking完成。\ n \ n”);
***基准测试2d互相关***基准测试功能:function t = benchXcorr2(X, Y, numruns) %用于CPU和GPU的xcorr2基准测试。timevec = 0 (1,numruns);gdev = gpuDevice;对于ii=1:numruns, ts = tic;o = xcorr2(X,Y);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');结束t = min(timevec);对100x100矩阵和100x100矩阵运行xcorr2…CPU时间:20.35 ms GPU时间:6.96 ms运行100x100矩阵和200x200矩阵的xcorr2… 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算法加速部分中的信号处理工具箱™文档。

另请参阅

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