Main Content

CWT からの CUDA コード

この例では、MEX ファイルを生成し、生成された CUDA コードを使用して連続ウェーブレット変換 (CWT) を実行する方法について説明します。

まず、CUDA 対応 GPU と NVCC コンパイラがあることを確認します。GPU 環境のチェックおよびアプリの設定 (GPU Coder)を参照して、適切な構成があることを確認してください。

GPU Coder 構成オブジェクトを作成します。

cfg = coder.gpuConfig("mex");

1,000 Hz で 100,000 サンプルの信号を生成します。この信号は、時間のサポートが互いに素である 2 つの余弦波で構成されています。

t = 0:.001:(1e5*0.001)-0.001;
x = cos(2*pi*32*t).*(t > 10 & t<=50)+ ...
    cos(2*pi*64*t).*(t >= 60 & t < 90)+ ...
    0.2*randn(size(t));

単精度を使用するように信号をキャストします。GPU 計算は、ほとんどの場合、単精度で実行するほうが効率が高くなります。ただし、NVIDIA GPU が倍精度をサポートしている場合、倍精度のコードを生成することもできます。

x = single(x);

GPU MEX ファイルとコード生成レポートを生成します。MEX ファイルの生成を許可するには、次の 3 つの入力パラメーターのプロパティ (クラス、サイズ、実数/複素数) を指定しなければなりません。

  • coder.typeof(single(0),[1 1e5]) は、実数の single 値を含む長さ 100,000 の行ベクトルを指定します。

  • coder.typeof('c',[1 inf]) は、任意の長さの文字配列を指定します。

  • coder.typeof(0) は、実数の double 値を指定します。

sig = coder.typeof(single(0),[1 1e5]);
wav = coder.typeof('c',[1 inf]);
sfrq = coder.typeof(0);
codegen cwt -config cfg -args {sig,wav,sfrq} -report
Code generation successful: View report

-report フラグはオプションです。-report を使用すると、コード生成レポートが生成されます。レポートの [概要] タブに、[GPU コード メトリクス] リンクが表示され、ここで、生成された CUDA カーネルの数、割り当てられたメモリ量などの詳細情報が提供されます。

データに対して MEX ファイルを実行し、スカログラムをプロットします。プロットが 2 つの互いに素な余弦波と一致することを確認します。

[cfs,f] = cwt_mex(x,'morse',1e3);
image("XData",t,"YData",f,"CData",abs(cfs),"CDataMapping","scaled")
set(gca,"YScale","log")
axis tight
xlabel("Time (Seconds)")
ylabel("Frequency (Hz)")
title("Scalogram of Two-Tone Signal")

_mex を付けずに上記の CWT コマンドを実行します。MATLAB と GPU MEX のスカログラムが同一であることを確認します。

[cfs2,f2] = cwt(x,'morse',1e3);
max(abs(cfs2(:)-cfs(:)))
ans = single
    7.3380e-07

参考

|