各反復でフーリエ変換を含む反復計算があります。
高レベルでは、次のようになります。
// executed in host , calling functions that run on the device
B = image
L = 100
while(L--) {
A = FFT_2D(B)
A = SOME_PER_PIXEL_CALCULATION(A)
B = INVERSE_FFT_2D(A)
B = SOME_PER_PIXEL_CALCULATION(B)
}
変換を行うために「cufft」ライブラリを使用しています。
今の問題は、私が常にグローバルメモリで作業していることです。
基本的に、共有メモリを使用して作業の一部を行う方法があれば、それは素晴らしいことです.
しかし、「cufft」ライブラリ関数はホストからのみ呼び出すことができ、入力と出力をグローバルメモリに保存すると、FFTを使用してもこれをバイパスできないようです。
これにどのように取り組むべきですか?
ありがとう。
編集:
データ依存性があるためです。「ピクセルごと」の計算を最適化する以外に、多くのことはできないようです...
ボトルネックは、カーネルがグローバル メモリを介してデータを渡すという事実によるものです。この場合、これは避けられないようです。
つまり、基本的には、逆の変換を行わなければならないという事実が、中間の計算データを共有することを妨げているのです。
現在、周波数空間でほとんどの計算を行う方法を模索しています。(もっと数学の問題)
F{f(x,y)} を指定して F{max(0,f(x,y))}を近似する方法について誰かが良い考えを持っていますか?
編集:
f(x,y) は時間領域にあるため、実数値であることに注意してください。
f(x,y) もポイント単位の max(0,f(x,y)) を計算する前に処理されるため、実際には negetiv 値が現れる可能性があります。