#cuFFTを並列(マルチスレッド実行もしくは複数ストリーム実行)で実行する
CUDAの関数は大体が非同期的に実行されるため、マルチスレッド実行しても効果があるかどうかは謎ですが、実行するのには躓くポイントがありました。
##スレッドごとにplanを作る
これすごい大事なポイントです。これ知らないとエラーが出たり、実行結果が不定になります。
cuFFTのドキュメントによると、以下のように書いてあります。
2.10. Thread Safety
cuFFT APIs are thread safe as long as different host threads execute FFTs using different plans and the output data are disjoint.
(私なりの意訳)スレッドごとに異なるplanかつ出力の変数が異なる限りcuFFTのAPIはスレッドセーフである。
これ読んでなくてplan同じものでやってました。
内部で作業領域とか取るので当たり前ですがそれぞれ別々にplanを作成しましょう。
##planにストリームを設定する。
何も指定しないとデフォルトのストリームになります。
cufftSetStream()
関数を使いましょう。
これによって複数ストリームで実行されるようになります。
※1つのデバイスにおいて、CUDAの処理が実行される順番は待ち行列のようなものであるストリームに突っ込んだ順になります。そのため、単一のストリームにマルチスレッドで命令を発行する場合は並列で実行されません。(複数ストリームにしたら並列実行"される"可能性があるだけで並列かどうかはデバイスとリソースによる)
cufftSetStream()
関数は第一引数にplanを、第二引数にストリームを指定します。
これで複数ストリームで実行することが可能になります。