問題タブ [cufft]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - How to compute the throughput of cuFFT in GFLOPs
I'd like to compute the throughput of FFT and IFFT using cuFFT.
I think that it should be O(B n log n) where n is the signal length and B is the batch size.
The throughput in GFLOPs should be = 10^-9 * B * N * log N * c / runtime.
The thing is how to find out c (the constant here).
I found some people use c = 2.5 in the case of FFT, and c = 5 in the case of IFFT. Is this correct?
python - skcuda.cufft を使用する fft 関数の引数エラーを修正するにはどうすればよいですか?
scikits-cuda.cufft を使用して、任意のサイズの入力の変換を計算できる Python でラップされた GPU fft 関数を作成したいと考えています。(2の累乗しかとらないPyFFTを試しました)
CUDA コードから skcuda.cufft コードをモデル化しました。
私の skcuda.cufft コードは次のようになります。
しかし、エラーが発生します:
runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli') トレースバック (最新の呼び出しが最後):
ファイル ""、1 行目、runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli') 内
ファイル "/home/jesli/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py"、580 行目、実行ファイル execfile(ファイル名、名前空間) 内
ファイル「/home/jesli/sk-cufft_test.py」、19 行目、ft.cufftExecZ2Z(plan,x_gpu,xf_gpu,ft.CUFFT_FORWARD) 内
ファイル「/home/jesli/anaconda/lib/python2.7/site-packages/skcuda/cufft.py」、319行目、cufftExecZ2Z方向)
ArgumentError: 引数 2: : 間違った型
変換方向 ( CUFFT_FORWARD、CUFFT_INVERSE ) は、ソース コードで既に定義されています。
http://scikit-cuda.readthedocs.org/en/latest/_modules/skcuda/cufft.html
コードの何が問題だったのか、または関数が期待する引数を知りたいです。
c - 同時ストリームでの CUDA cuFFT API の動作
一部の画像処理に nVidia 980 GTX で CUDA 7.0 を使用しています。特定の反復では、15 ~ 20 回のカーネル呼び出しと複数の cuFFT FFT/IFFT API 呼び出しを介して、複数のタイルが個別に処理されます。
このため、各タイルを独自の CUDA ストリーム内に配置して、各タイルが一連の操作をホストに対して非同期で実行するようにしました。各タイルは反復内で同じサイズであるため、cuFFT プランを共有します。ホスト スレッドは、GPU に作業をロードし続けようとして、コマンドをすばやく移動します。これらの操作が並行して処理されている間、定期的な競合状態が発生していますが、特に cuFFT について質問がありました。タイル 0 に対して cuFFTSetStream() を使用してストリーム 0 に cuFFT プランを配置し、ホストが共有 cuFFT プランのストリームをタイル 1 のストリーム 1 に設定する前に、タイル 0 の FFT が実際には GPU でまだ実行されていない場合GPU でタイル 1 の作業を発行します。このプランの cuFFTExec() の動作は何ですか?
より簡潔に言えば、cufftExec() の呼び出しは、前の FFT 呼び出しが実際に開始される前に後続のタイルのストリームを変更するために cuFFTSetStream() が使用されているかどうかに関係なく、cufftExec() 呼び出しの時点でプランが設定されていたストリームで実行されますか? /完成?
コードを投稿していないことをお詫びしますが、実際のソースを投稿することはできません。
image - 戦略 - 多くの画像で 2D FFT を計算する CUFFT
128 枚の画像で 2D FFT に CUFFT を使用しています。各画像のサイズは 128 x 128 です。MATLAB では、1 つの 2D FFT を実行するのに 0.3 ミリ秒かかり、128 枚の画像すべてに対して FFT を実行するには、そのミリ秒数のほぼ 128 倍かかります。CUFFT を使用して、次のコードを実行すると、1 つの画像の FFT が計算されます。
私のマシンでは約0.4msかかります。
複数の画像に対して同じコードを実行してみましたが、実行時間は基本的に画像数倍の0.4msです。私が行った方法は、基本的に上記のコードを何度もコピーして貼り付けることです。もちろん、対応する画像の変数を変更します。つまり、
したがって、128 個の画像すべてに 2D FFT を適用すると、実行時間は MATLAB の実行時間とほぼ同じになると予想できます。
だから私の質問: 実行を適用する方法は正しいですか? GPU の並列処理能力を十分に活用できていますか? コードの実行方法を変更する必要があります。たとえば、最初に 128 個のイメージすべてに対して cudaMemcpy を実行し、CPU と GPU の実行をオーバーラップさせるためにそれらを実行する必要がありますか?
c++ - CUDA FFT が期待する値を返さない
現在、CUDA FFT ルーチンを使用するコードをデバッグしています。
私はこのようなものを持っています(私が何をしているのかについての私の考えについてはコメントを参照してください):
したがって、私が今抱えている問題は、outDbl の結果が期待どおりではないということです。たとえば、この関数に次の値を与えるとします。
実数 = [0 -5.567702511594111 -5.595068807897317 -5.595068807897317 -5.567702511594111]
imag = [0 9.678604224870535 2.280007038673738 -2.280007038673738 -9.678604224870535]
私は得ることを期待しています:
結果 = [-4.46511 -3.09563 -0.29805 2.51837 5.34042]
しかし、私はまったく違うものを手に入れます。
私は何を間違っていますか?FFT関数を誤解していませんか?基本的には複素数から実数への逆FFTではないでしょうか? データ コピー ルーチンに問題はありますか?
私はこれについて少し迷っていることを認めなければなりません。
c++ - cuFFT ストリームの同時実行
そのため、CUDA ストリーム機能と組み合わせて cuFFT を使用しています。私が抱えている問題は、cuFFT カーネルを完全な同時実行で実行できないように見えることです。以下は、nvvp から得た結果です。各ストリームは、サイズ 128x128 の 128 個の画像に対して 2D バッチ FFT のカーネルを実行しています。3 つのストリームをセットアップして、3 つの独立した FFT バッチ プランを実行します。
図からわかるように、一部のメモリ コピー (黄色のバー) が一部のカーネル計算 (紫、茶色、ピンクのバー) と並行していました。しかし、カーネルの実行はまったく並行していませんでした。お気づきのように、各カーネルは厳密に相互に追従していました。以下は、デバイスへのメモリ コピーとカーネルの起動に使用したコードです。
次に、すべてのメモリ コピー (同期) を完了し、すべてのカーネルを一度にストリームに送信するようにコードを変更したところ、次のプロファイリング結果が得られました。
その後、カーネルが同時に実行されていないことが確認されました。
「–default-stream per-thread」コマンドライン引数を渡すか、#include またはコードに #define CUDA_API_PER_THREAD_DEFAULT_STREAM を渡すことにより、完全な同時実行性を利用するようにセットアップする方法を詳細に説明する1 つのリンクを見ました。これは CUDA 7 で導入された機能です。GeForce GT750M を搭載した MacBook Pro Retina 15' (上記のリンクと同じマシン) で上記のリンクのサンプル コードを実行したところ、カーネルを同時に実行できました。しかし、cuFFT カーネルを並行して実行することはできませんでした。
次に、cuFFTカーネルがGPU全体を占有するため、2つのcuFFTカーネルが並行して実行されることはないと誰かが言っているこのリンクを見つけました。それから私は立ち往生しました。CUFFT が並行カーネルを有効にするかどうかを説明する正式なドキュメントが見つからなかったためです。これは本当ですか?これを回避する方法はありますか?
c++ - Cufft set frequency?
I am using CUDA's Cufft to process data i receive from a hydrophone(500,000 integers a second at 250hertz, high and low channels). Now as a basic example of how Cufft works is here...
Now all I want to know is, how do i set the frequency of the FFT (cufft) to be 250hertz?
Thanks
James
c++ - CUDA カフの 2D 例
私は現在、2D-FFTを実装する必要があるプログラムに取り組んでいます(相互相関用)。CUDAで1D FFTを実行したところ、正しい結果が得られました。現在、2Dバージョンを実装しようとしています。オンラインのいくつかの例とドキュメントでは、エラーが何であるかを見つけるのが難しいと思います.
これまでのところ、cuFFT マニュアルのみを使用してきました。
とにかく、私は 2 つの 5x5 配列を作成し、それらを 1 で埋めました。それらを GPU メモリにコピーし、順方向 FFT を実行して乗算し、結果に対して ifft を実行しました。これにより、値が 650 の 5x5 配列が得られます。5x5 配列の 1 つのスロットだけで、値が 25 の DC 信号が得られると予想されます。代わりに、配列全体で 650 を取得します。
さらに、信号が GPU メモリにコピーされた後に信号の値を出力することは許可されていません。書き込み
アクセス違反が発生します。これが問題にならなかった他のcudaプログラムでも同じことをしました。複雑な変数がどのように機能するかに関係がありますか、それとも人的ミスですか?
誰かが何がうまくいかないのかについての指針を持っているなら、私はそれを大いに感謝します. ここにコードがあります
上記のコードは、次の端末出力を提供します。