主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

GPUを使用した相関の高速化

この例では,GPUを使用して相互相関を高速化する方法を示します。相関問題の多くは,大規模なデータセットを扱うことから,GPUの使用によりより高速な解決が可能です。この例では,并行计算工具箱™のユーザーライセンスが必要です。どのGPUがサポートされているかについては,リリース別のGPUサポート(并行计算工具箱)を参照してください。

はじめに

まず,ご使用のマシンのGPUの基本的な情報を学習します。GPUにアクセスするには,并行计算工具箱を使用します。

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

ベンチマーク機能

CPU用に書かれたコードはGPUに移植して実行できるため,1つの関数をCPUとGPUの両方のベンチマークに利用できます。ただし,GPU上のコードはCPUとは非同期に実行されるため,性能測定には特別な注意が必要です。ある関数の実行に要した時間を測定する前に,すべてのGPU処理が終了しているか,デバイス上で”等“メソッドを実行して確認します。この追加の呼び出しは,CPUの性能には影響を与えません。

この例では3つの異なるタイプの相互相関のベンチマークを行います。

単純な相互相関のベンチマーク

最初の例として,同じサイズの2つのベクトルが構文xcorr (u, v)を使用して相互相関されています。GPU実行時間に対するCPU実行時間の比は,ベクトルのサイズに対してプロットされています。

流('\n\n ***基准矢量-矢量互相关*** \n\n');流(“基准测试函数:\ n”);类型(“benchXcorrVec”);流(“\ n \ n”);大小= [2000 1e4 1e5 5e5 1e6];tc = 0(1,元素个数(大小));tg = 0(1,元素个数(大小));numruns = 10;s = 1:元素个数(大小);流(运行xcorr of %d elements…\n、大小(s));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);流([delchartGPU时间:%2 f \ n '女士), 1000 * tg (s));结束%绘制结果无花果=图;ax =轴(“父”图);semilogx (ax、大小tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,向量的大小的);标题(ax,“XCORR GPU加速”);drawnow;
***基准矢量-矢量互相关***基准函数:function t = benchXcorrVec(u,v, numruns) %用于在CPU和GPU上对矢量输入的xcorr进行基准测试。% Copyright 2012 The MathWorks, Inc. timevec = zeros(1,numruns);gdev = gpuDevice;For ii=1:numrun ts = tic;o = xcorr (u, v);%#ok wait(gdev) timevec(ii) = toc(ts);流('。');End t = min(timevec);运行xcorr 2000元素…CPU时间:0.21 ms GPU时间:4.26 ms 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

行列の列の相互相関のベンチマーク

2番目の例として,行列一个の列が,構文xcorr (A)を使用して対相互相関され,すべての相関からなる大きな行列出力が生成されています。CPUの実行時間とGPUの実行時間の比率は,行列一个のサイズに対してプロットされています。

流('\n\n ***基准矩阵列互相关*** \n\n');流(“基准测试函数:\ n”);类型(“benchXcorrMatrix”);流(“\ n \ n”);尺寸=地板(linspace(0,100,11));大小(1)= [];tc = 0(1,元素个数(大小));tg = 0(1,元素个数(大小));numruns = 10;s = 1:元素个数(大小);流('运行xcorr (matrix) of a %d x %d matrix…\n'、大小(s)、大小(s));delchar = repmat (“\ b”1、numruns);一个=兰德(大小(s));tc(s) = benchXcorrMatrix(a, numruns);流([delcharcpu时间:%。2 f \ n '女士), 1000 * tc (s));tg(s) = benchXcorrMatrix(gpuArray(a), numruns);流([delchartGPU时间:%2 f \ n '女士), 1000 * tg (s));结束%绘制结果无花果=图;ax =轴(“父”图);情节(ax,大小。^ 2, tc. / tg,“r * - - - - - -”);ylabel (ax,“加速”);包含(ax,矩阵元素的);标题(ax,“XCORR的GPU加速(矩阵)”);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

2次元の相互相関のベンチマーク

最後の例としてXとYの2つの行列がxcorr2 (X, Y)を使用して相互相関されています。Xのサイズは固定されており,Yのサイズは可変です。2番目の行列のサイズに対する加速の値がプロットされています。

流('\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:元素个数(大小);流(运行xcorr2的100x100矩阵和%d x %d矩阵…\n、大小(s)、大小(s));delchar = repmat (“\ b”1、numruns);b =兰德(大小(s));tc(s) = benchXcorr2(a, b, numruns);流([delcharcpu时间:%。2 f \ n '女士), 1000 * tc (s));tg(s) = benchXcorr2(gpuArray(a), gpuArray(b), numruns);流([delchartGPU时间:%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进行基准测试。% 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,传输线,conv,过滤器,fftfiltなどが含まれます。場合によっては、CPUに対しかなりの高速化が達成できます。GPUによって高速化された信号処理関数すべての一覧については,信号处理工具箱™ドキュメンテーションのGPUアルゴリズムの高速化の節を参照してください。

参考

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