CUDA公式ライブラリ:フーリエ変換(CUFFT)関連関数の概要

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関連のタスクを完了するために一緒に使用されます。

  1. 機能:
  • cufftPlanXd()関数はFFT演算の計画(plan)を作成するために使用されます。この計画は、FFTのサイズ、データ形式、実行方法など、FFT演算のパラメータと設定を記述します。
  • cufftHandleはFFT演算の状態とリソースを管理するためのハンドル型です。FFT演算の状態追跡やリソース管理に使用されます。
  1. 使用方法:
  • FFT演算を実行する前に、まずFFT計画を作成する必要があります。cufftPlanXd()関数を使用してFFTの1次元パラメータを指定します。
  • FFT計画を作成した後、それをcufftHandleに関連付けることができ、その後cufftHandleを使用してFFT演算を実行します。
  1. 適用範囲:
  • cufftPlanXd()はFFT計画の作成にのみ使用され、FFT演算の実行やリソース管理には関与しません。
  • cufftHandleはFFT演算の状態とリソースを管理するために使用され、GPUメモリや計算リソースの割り当てと解放を含みます。
  1. リソース管理:
  • 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:ハンドルが無効

タグ: CUDA CUFFT フーリエ変換 GPU 高性能計算

5月25日 08:16 投稿