0

各反復でフーリエ変換を含む反復計算があります。

高レベルでは、次のようになります。

// 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 値が現れる可能性があります。

4

1 に答える 1

1

FFT/IFFT に関しては、CUFFT ルーチンが内部で共有メモリを使用しないと誤って想定していると思います。FFT 計算の一般的なアルゴリズムは、FFT 全体を 1 つのスレッド ブロックに適合する小さなものに分割するため、おそらく既に内部的に共有メモリを利用しています。たとえば、論文を参照してください。

PER_PIXEL_CALCULATIONS に関しては、共有メモリは通常、スレッド ブロック内のスレッドを相互に連携させるために使用されます。私の質問は: PER_PIXEL_CALCULATIONS は互いに独立していますか? もしそうなら、おそらくスレッド連携は必要なく、共有メモリも必要なく、レジスタのみを使用して計算を整理します。

とにかく、後者の点をより具体的にするには、実際に必要なものについてより多くの情報を提供する必要があります (元の投稿を編集して)。あなたのコードは Gerchberg-Saxton アルゴリズムの実装に関連していますか?

于 2013-01-05T22:24:34.657 に答える