問題タブ [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 - cufftPlanMany() に時間がかかりすぎるのはなぜですか?
最初に cufftPlanMany() を呼び出すときは約 0.7 秒かかりますが、それ以降の呼び出しはすべて高速です。cufftPlanMany() の最初の呼び出しを加速する方法はありますか?
numpy - 多次元配列の指定された軸に対する FFTW / CUFFT
FFTW / CUFFT (同様の API を持っています) を使用して、多次元配列の特定の軸に対して fft を実行する効率的な方法はありますか?
形状 (2, 3, 4) の 3D 配列があるとします。ストライドは (12, 4, 1) です。つまり、最後の軸に沿って 1 単位移動するには、フラット配列で 1 単位移動しますが、最初の軸に沿って 1 単位移動するには、ステップ オーバーする必要があります。 3 * 4 = 12 単位。(配列は、軸が転置されたときに他のストライドを持つことができるnumpy ndarrayですが、与えられたストライドでこの特定の3Dケースだけに対処する答えに満足しています)
ここで、中央の軸に沿って1D fftを計算したいとしましょう。CUFFT は次の関数を公開します。
変換を行うには、、、パラメーターが必要nembed
だと思います。それらはここに文書化されています:
http://docs.nvidia.com/cuda/cufft/index.html#advanced-data-layoutstride
dist
デュメンテーションは、1D fft の場合、位置 x のバッチ b の要素が次から取得されることを示しています。
input[b * idist + x * istride]
ただし、位置 [b][x][z] の要素は次の場所に格納されます。
input[b * 12 + x * 4 + z]
そのため、CUFFT を 3 番目 (z) 軸でループさせる方法が明確ではありません。
私が設定した場合:
- idist と odist を 3*4=12 にします (b をインクリメントすると、最初の軸に沿って移動します)。
- istride と ostride を 4 にします (x の増分は、fft したい軸である 2 番目の軸に沿って移動します)。
- バッチ = 2
- inembed と onembed を 3 に (ただし、ドキュメントによると、これらは 1D 変換では無視されます)
次に、最後の軸インデックスが 0 である 2 つのバッチのそれぞれについて正しい fft を計算しますが、最後のインデックスが 1、2、または 3 であるサブ配列はそのままにします。
これは一般的なユースケースのように思えますが、複数の呼び出し (GPU ではコストがかかります) を実行したり、異なるメモリ レイアウトでコピーを作成したりせずに、指定されたパラメーターでこれを行う方法を理解できないようです。
cuda - K40でcuFFTが「遅い」のはなぜですか?
単純な 3D cuFFT プログラムを GTX 780 と倍精度モードの Tesla K40 で比較しました。
GTX 780 では約 85 Gflops を測定しましたが、K40 では約 160 Gflops を測定しました。これらの結果は私を困惑させました: K40 が 1.4 Tflops であるのに対し、GTX 780 ha は 166 Gflops のピーク理論パフォーマンスです。
K40 での cuFFT の効果的なパフォーマンスが理論上のピーク パフォーマンスから非常に離れているという事実は、このリンクで Nvidia によって作成されたグラフからも得られます。
なぜこれが起こるのか誰かが私に説明できますか? cuFFT ライブラリに制限はありますか? 多分いくつかのキャッシュの動機...
matlab - Recursively use of self-implemented cuIDFT.cu leads to changing output every time when re-runing the code
I have implemented a CUDA version of inverse discrete cosine transform (IDCT), by "translating" the MATLAB built-in function idct.m
into CUDA:
- My implementation is
cuIDCT.cu
, works when m = n and both m and n are even numbers.
cuIDCT.cu
Then I compared the result of my CUDA IDCT (i.e. cuIDCT.cu
) against MATLAB idct.m
using following code:
- a test
main.cpp
function, and - a MATLAB main function
main.m
to read result from CUDA and compare it against MATLAB.
main.cpp
main.m
I ran the code on Visual Studio 11 (i.e. VS2012) in Windows 7 with Nvidia GPU Tesla K20c, using CUDA Toolkit version 7.5, and my MATLAB version is R2015b.
My test steps:
- For test case 1. Un-comment test case 1 and comment test case 2.
- Run
main.cpp
. - Run
main.m
in MATLAB. - Repeat step 1 and step 2 (without any change, just re-run the code).
- Run
I repeated step 3 for 20 times. The output result is unchanged, and results in main.m
are:
The maximum error is 7.7152e-07.
- For test case 2. Un-comment test case 2 and comment test case 1.
- Run
main.cpp
. - Run
main.m
in MATLAB. - Repeat step 1 and step 2 (without any change, just re-run the code).
- Run
I repeated step 3 for 20 times. The output result is changed, and results in main.m
are (not enough reputation to put all images, only wrong case is shown below):
one situation (the wrong one) of test case 2
The maximum error is 0.45341 (2 times), 0.44898 (1 time), 0.26186 (1 time), 0.26301 (1 time), and 9.5716e-07 (15 times).
From the test results, my conclusion is:
- From test case 1:
cuIDCT.cu
is numerically correct (error ~10^-7) toidct.m
. - From test case 2: recursively use of
cuIDCT.cu
leads to unstable result (i.e. the output changes every time when re-run the code and may sometimes be numerically wrong, error ~0.1)
My question:
From test case 1 we know cuIDCT.cu
is numerically correct to idct.m
. But why recursiviely use of cuIDCT.cu
leads to different output result each time when re-run the code?
Any helps or suggestions are highly appreciated.
fft - cuFFT R2C バッチ出力サイズが入力サイズと一致しない
cuFFTを使用してバッチを実験しています。しかし、私は正しい出力を得ているとは思わない。
GPU に 2 つの配列を割り当てています。
次のような単純なカーネルでソース配列を初期化しています。
基本的に、各配列には 0 から 15 までの値があります。これを 16 回取得します。
私は次のように計画を作成します。
そして、私は自分の計画を実行しています:
最後に、dstの内容をホストに転送します。しかし、値を出力すると、次のようになります。
反復的な出力を期待していましたが、16 個ごとではなく、9 個の数値ごとに繰り返されます。
私は何か間違ったことをしていますか?それとも、私が理解していない何かがあります。