CUDA技術を利用したGPUコンピューティングの実際(後編) ―― FFTを利用した光波の伝播(フレネル回折)をGPUで高速計算

下馬場 朋禄,伊藤 智義

tag: 組み込み 半導体

技術解説 2008年10月 1日

● FFTを使ってフレネル回折積分の計算量を減らす

 フレネル回折積分は,次の積分式により計算することができます.

siki01.gif
 .........(1)

 ここで,jは虚数単位を,(ξ,η)と(x,y)はそれぞれ開口面と観察面の座標を表します.この式を直接計算してもよいのですが,計算量が膨大になるためにFFTを使用して計算量を減らせるように式の変形を施していきます.

 この式の積分部分は畳み込み積分として表現できるので,

siki02.gif
 .........(2)
と書き直すことができます.ここで,*は畳み込み積分を表す記号,また と置きました.

 畳み込み積分は,畳み込みの定理という信号処理の理論を使うと,フーリエ変換の表現に直すことができます.フーリエ変換をF[・],逆フーリエ変換をF-1[・]で表すと,

siki03.gif
 .........(3)
となります.フレネル回折積分を計算すると,観察面における光の分布は複素数となります.図8(c)のように人間が光の分布を観察する場合は,光の強度( | u(x,y)| 2)を観察することになります.このとき,Cは省略して計算することができます.以降ではCを省略して話を進めることにします.

 上記の話は連続量を持つアナログ的な話なので,GPUで計算する場合は,座標の離散化を行う必要があります.開口面と観察面のサイズをN×Nとし,サンプリング間隔をpで表現すると,座標はx=mp(mは0≦m<Nの範囲の整数),y=np(nは0≦n<Nの範囲の整数)となります.また,フーリエ変換にFFTを使用することで,大幅に計算量を減らすこともできます.結局,FFTを使用してフレネル回折積分を次のように計算することができます.

siki04.gif


siki05.gif

  .........(5)

 ここでFFT[・]とFFT-1[・]は,それぞれFFTと逆FFTを示しています.以下では,この式をCUDAで実装する方法について述べていきます.

● CUFFTを使用してフレネル回折積分の高速化

 CUDAに付属するCUFFTライブラリを使用すれば,GPU上でFFTを簡単かつ高速に実行することができます.CUFFTは,FFTライブラリとして有名なFFTW(4)と類似したインターフェースを持ちます.

 まず,Visual Studio環境でCUFFTを使用するための設定を行います.CUFFTはその機能がcufft.dllというDLL内に収められています.そのため,このDLL用のライブラリをプロジェクトに登録する必要があります.登録の仕方は簡単で,本稿の前編の図11のダイアログ画面の「追加の依存ファイル」部分に「cufft.lib」を追加すれば,CUFFTの機能を呼び出せるようになります.なおCUFFTの関数を呼び出すためのヘッダ・ファイル「cufft.h」をインクルードする必要があります.

 cuComplexは複素数の実数部と虚数部を格納できる構造体で,CUDAのバージョンによって定義が異なっています.CUDA 1.1では,cuComplexのメンバ変数としてx,yが用意されており,xが実数部に,yが虚数部に相当します.直接,このメンバ変数に対してアクセスを行ってもよいのですが,CUDAのバージョンが上がることでcuComplexの仕様が変更されるかもしれません(実際,CUDA 1.0とCUDA 1.1では定義が異なっている).そこで,cuComplexを操作するためのマクロがcuComplex.hに多数用意されているので,このマクロを介してアクセスすることにします.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日