CUFFTライブラリは高性能なフーリエ変換計算を実現するための主要なツールです。一次元、二次元、三次元の実数および複素数フーリエ変換をサポートし、様々なデータレイアウトとデータ型を扱えます。この記事では、CUFFTライブラリの主要な関数について概説します。
1. FFTハンドル
1.1 cufftHandle
FFT演算の状態とリソースを管理するためのハンドル型です。FFT演算の状態追跡やリソース管理に使用されます。
2. FFT計画の作成
FFT操作に必要なメモリとリソースを割り当て、設定します。
2.1 cufftPlan1d()関数
指定された信号サイズとデータ型に基づいて1次元FFT計画を構成します。
cufftResult cufftPlan1d(cufftHandle *計画, int nx, cufftType 型, int バッチ);
機能: 指定された信号サイズとデータ型に基づいて1次元FFT計画を構成します。
入力パラメータ:
- 計画:cufftHandleへのポインタ
- nx:フーリエ変換を実行するデータ量のサイズ(信号処理分野では信号の長さと見なされます)
- 型:フーリエ変換を実行するデータ型(例:CUFFT_C2C, CUFFT_C2Rなど)
- バッチ:フーリエ変換を実行する量(信号処理分野では信号の量と見なされます)
出力パラメータ:
- 計画:1次元フーリエ変換ハンドル
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
- CUFFT_INVALID_SIZE:nxまたはバッチパラメータのサイズがサポートされていません
2.2 cufftPlan2d()関数
指定された信号サイズとデータ型に基づいて2次元FFT計画を構成します。
cufftResult cufftPlan2d(cufftHandle *計画, int nx, int ny, cufftType 型);
機能: 指定された信号サイズとデータ型に基づいて2次元FFT計画を構成します。
入力パラメータ:
- 計画:cufftHandleへのポインタ
- nx:行列の列数と見なされます
- ny:行列の行数と見なされます
- 型:フーリエ変換を実行するデータ型(例:CUFFT_C2C, CUFFT_C2Rなど)
出力パラメータ:
- 計画:2次元フーリエ変換ハンドル
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
- CUFFT_INVALID_SIZE:nxまたはバッチパラメータのサイズがサポートされていません
2.3 cufftPlan3d()関数
指定された信号サイズとデータ型に基づいて3次元FFT計画を構成します。
cufftResult cufftPlan3d(cufftHandle *計画, int nx, int ny, int nz, cufftType 型);
機能: 指定された信号サイズとデータ型に基づいて3次元FFT計画を構成します。
入力パラメータ:
- 計画:cufftHandleへのポインタ
- nx:x方向のデータ点数
- ny:y方向のデータ点数
- nz:z方向のデータ点数
- 型:フーリエ変換を実行するデータ型(例:CUFFT_C2C, CUFFT_C2Rなど)
出力パラメータ:
- 計画:3次元フーリエ変換ハンドル
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
- CUFFT_INVALID_SIZE:nxまたはバッチパラメータのサイズがサポートされていません
2.4 まとめ
cufftHandleとcufftPlanXd()関数は似ているように見えますが、実際には異なる機能を持ちます。これらは通常、FFT関連のタスクを完了するために一緒に使用されます。
- 機能:
cufftPlanXd()関数はFFT演算の計画(plan)を作成するために使用されます。この計画は、FFTのサイズ、データ形式、実行方法など、FFT演算のパラメータと設定を記述します。cufftHandleはFFT演算の状態とリソースを管理するためのハンドル型です。FFT演算の状態追跡やリソース管理に使用されます。
- 使用方法:
- FFT演算を実行する前に、まずFFT計画を作成する必要があります。
cufftPlanXd()関数を使用してFFTの1次元パラメータを指定します。 - FFT計画を作成した後、それを
cufftHandleに関連付けることができ、その後cufftHandleを使用してFFT演算を実行します。
- 適用範囲:
cufftPlanXd()はFFT計画の作成にのみ使用され、FFT演算の実行やリソース管理には関与しません。cufftHandleはFFT演算の状態とリソースを管理するために使用され、GPUメモリや計算リソースの割り当てと解放を含みます。
- リソース管理:
cufftPlanXd()で作成されたFFT計画はリソース管理を含まず、FFT演算のパラメータと設定を記述するだけです。cufftHandleはFFT演算のリソースを管理するために使用され、GPUメモリと計算リソースの割り当てと解放を含みます。
3. FFT変換の実行
3.1 cufftExecC2C()関数
単精度複素数から単精度複素数へのFFTまたはIFFT変換を実行します。
cufftResult cufftExecC2C(cufftHandle 計画, cufftComplex *入力データ, cufftComplex *出力データ, int 方向);
機能: 単精度複素数から単精度複素数へのFFTまたはIFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の単精度複素数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は単精度複素数
- 方向:FFTの方向、つまり正方向変換(時域から周波数域へ)または逆方向変換(周波数域から時域へ)を実行するか
- CUFFT_FORWARD:正方向変換、時域から周波数域への変換
- CUFFT_INVERSE:逆方向変換、周波数域から時域への変換
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は単精度複素数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.2 cufftExecZ2Z()関数
倍精度複素数から倍精度複素数へのFFTまたはIFFT変換を実行します。
cufftResult cufftExecZ2Z(cufftHandle 計画, cufftDoubleComplex *入力データ, cufftDoubleComplex *出力データ, int 方向);
機能: 倍精度複素数から倍精度複素数へのFFTまたはIFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の倍精度複素数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度複素数
- 方向:FFTの方向、つまり正方向変換(時域から周波数域へ)または逆方向変換(周波数域から時域へ)
- CUFFT_FORWARD:正方向変換、時域から周波数域への変換
- CUFFT_INVERSE:逆方向変換、周波数域から時域への変換
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度複素数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.3 cufftExecR2C()関数
単精度実数から単精度複素数へのFFT変換を実行します。
cufftResult cufftExecR2C(cufftHandle 計画, cufftReal *入力データ, cufftComplex *出力データ);
機能: 単精度実数から単精度複素数へのFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の単精度実数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は単精度複素数
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は単精度複素数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.4 cufftExecD2Z()関数
倍精度実数から倍精度複素数へのFFT変換を実行します。
cufftResult cufftExecD2Z(cufftHandle 計画, cufftDoubleReal *入力データ, cufftDoubleComplex *出力データ);
機能: 倍精度実数から倍精度複素数へのFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の倍精度実数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度複素数
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度複素数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.5 cufftExecC2R()関数
単精度複素数から単精度実数へのIFFT変換を実行します。
cufftResult cufftExecC2R(cufftHandle 計画, cufftComplex *入力データ, cufftReal *出力データ);
機能: 単精度複素数から単精度実数へのIFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の単精度複素数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は実数
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は実数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.6 cufftExecZ2D()関数
倍精度複素数から倍精度実数へのIFFT変換を実行します。
cufftResult cufftExecZ2D(cufftHandle 計画, cufftDoubleComplex *入力データ, cufftDoubleReal *出力データ);
機能: 倍精度複素数から倍精度実数へのIFFT変換を実行します。
入力パラメータ:
- 計画:FFT計画ハンドル、FFTのパラメータと設定を記述します。
- 入力データ:変換対象の倍精度複素数シーケンスを含む入力データ配列へのポインタ
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度実数
出力パラメータ:
- 出力データ:FFT変換の結果を格納するための出力データ配列へのポインタ、データ形式は倍精度実数
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効
- CUFFT_ALLOC_FAILED:GPUリソースの割り当てに失敗
- CUFFT_INVALID_VALUE:APIに無効なパラメータが渡されました
- CUFFT_INTERNAL_ERROR:内部ドライバエラーが検出されました
- CUFFT_SETUP_FAILED:cuFFTライブラリの初期化に失敗
3.7 まとめ
cufftExecC2C()とcufftExecZ2Z()関数は4つのパラメータを持ちます。それぞれはFFTハンドル、入力配列ポインタ、出力配列ポインタ、およびフーリエ変換の方向を表します。一方、cufftExecR2C()、cufftExecD2Z()、cufftExecC2R()、cufftExecZ2D()関数は最初の3つのパラメータしか持ちません。これは、cufftExecR2C()とcufftExecD2Z()関数が実数から複素数へのフーリエ変換(FFT)を実行する際に一方向で固定されているため、逆方向変換がないためです。同様に、cufftExecC2R()とcufftExecZ2D()関数は複素数から実数への逆フーリエ変換(IFFT)を実行する際に一方向で固定されているため、正方向変換がないためです。これに対して、複素数から複素数へのFFT変換(例:cufftExecC2C()とcufftExecZ2Z()関数)の場合、正方向変換(時域から周波数域へ)と逆方向変換(周波数域から時域へ)を区別する必要があるため、directionパラメータを使用して変換の方向を指定する必要があります。
4. FFTハンドルの破棄
4.1 cufftDestroy()関数
FFT計画ハンドル(handle)を破棄し、関連リソースを解放します。
cufftResult cufftDestroy(cufftHandle 計画);
機能: FFT計画ハンドル(handle)を破棄し、関連リソースを解放します。
入力パラメータ:
- 計画:破棄するFFT計画のハンドル
出力パラメータ:
- なし
戻り値:
- CUFFT_SUCCESS:FFT計画の作成に成功
- CUFFT_INVALID_PLAN:ハンドルが無効