主要内容

加速与gpu的关联

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

介绍

首先要了解有关机器中GPU的一些基本信息。使用“并行计算工具箱”访问GPU。

流(“测试gpu加速的相互关系。”);如果~ (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是异步执行的,所以在测量性能时应该采取特殊的预防措施。在测量执行一个函数所需的时间之前,通过在设备上执行'wait'方法确保所有GPU处理都已完成。这个额外的调用对CPU性能没有影响。

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

基准简单互相关

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

流('\n\n ***基准向量-向量互相关*** \n\n');流('基准测试功能:\n');类型(“benchXcorrVec”);流(“\ n \ n”);size = [2000 1e4 1e5 5e5 1e6];Tc = 0 (1,numel(size));Tg = 0 (1,numel(size));Numruns = 10;s = 1:元素个数(大小);流(“正在运行%d元素的xcor…\n”、大小(s));Delchar = repmat(“\ b”1、numruns);A = rand(size (s),1);B = rand(size (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 = axes()“父”图);Semilogx (ax,尺寸,tc./tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,向量的大小的);标题(ax,XCORR的GPU加速);drawnow;
***基准测试矢量矢量互关***基准测试函数:函数t = benchXcorrVec(u,v, numruns) %用于对CPU和GPU上的矢量输入进行基准测试。%版权所有2012 MathWorks, Inc. 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元素… 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));size (1) = [];Tc = 0 (1,numel(size));Tg = 0 (1,numel(size));Numruns = 10;s = 1:元素个数(大小);流(“正在运行一个%d x %d矩阵的xcor(矩阵)…\n”, size (s), sizes(s);Delchar = repmat(“\ b”1、numruns);A = rand(size (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 = axes()“父”图);情节(ax,大小。^ 2, tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,矩阵元素的);标题(ax,GPU加速XCORR(矩阵));drawnow;
***基准测试矩阵列互相关***基准测试函数:函数t = benchXcorrMatrix(A, numruns) %用于基准测试xcorr与CPU和GPU上的矩阵输入。%版权所有2012 MathWorks, Inc. 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

对标二维互相关

对于最后一种情况,使用xcor2 (X,Y)交叉关联两个矩阵X和Y。X的大小是固定的,而Y可以变化。加速是根据第二个矩阵的大小绘制的。

流('\n\n ***基准测试二维互相关*** \n\n');流('基准测试功能:\n');类型(“benchXcorr2”);流(“\ n \ n”);size = [100, 200, 500, 1000, 1500, 2000];Tc = 0 (1,numel(size));Tg = 0 (1,numel(size));Numruns = 4;A =兰特(100);s = 1:元素个数(大小);流('运行100x100矩阵和%d x %d矩阵的xcorr2…\n', size (s), sizes(s);Delchar = repmat(“\ b”1、numruns);B = rand(size (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”);
***基准测试2-D互相关***基准测试函数:函数t = benchXcorr2(X, Y, numruns) %用于在CPU和GPU上对xcorr2进行基准测试。%版权所有2012 MathWorks, Inc. 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);对100 × 100矩阵和100 × 100矩阵执行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算法加速章节中的信号处理工具箱™文档。

另请参阅

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