2016-04-22 20 views
1

異なる算術精度とマルチスレッド計画でFFTWを使用する必要があります。スレッドと異なる精度でFFTWを設定するにはどうすればよいですか?

すべての精度でマルチスレッドをセットアップする必要がありますか?このように:

fftwf_init_threads(); 
fftwf_plan_with_nthreads(nthreads); 
fftw_init_threads(); 
fftw_plan_with_nthreads(nthreads); 
fftwl_init_threads(); 
fftwl_plan_with_nthreads(nthreads); 

または日常私開始でこれを書いては

fftw_init_threads(); 
fftw_plan_with_nthreads(nthreads); 

十分でしょうか?

答えて

1

異なる精度のfftwライブラリは互いに完全に独立しています。したがって、あなたはFFTWの対応する関数を呼び出すことによって、すべての精度のセットアップマルチスレッディングに必要:ここ

int nbthreads=2; 
fftw_init_threads(); 
fftw_plan_with_nthreads(nbthreads); 
fftwf_init_threads(); 
fftwf_plan_with_nthreads(nbthreads); 
fftwq_init_threads(); 
fftwq_plan_with_nthreads(nbthreads); 

... 

fftw_cleanup_threads(); 
fftwf_cleanup_threads(); 
fftwq_cleanup_threads(); 

はあなたをconvinveするためのサンプルコードです。対応するライブラリがビルドされると、Unix上でgcc main.c -o main -lfftw3_threads -lfftw3 -lfftw3f_threads -lfftw3f -lfftw3q_threads -lfftw3q -lm -lpthread -Wallでコンパイルできます。

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

#include <fftw3.h> 

int main (){ 
    int n = 40000000; 
    int nf = n*2; 
    int nq =n/32; 

    fftw_complex *in; 
    fftw_complex *in2; 
    fftw_complex *out; 
    fftw_plan plan_backward; 
    fftw_plan plan_forward; 

    fftwf_complex *inf; 
    fftwf_complex *in2f; 
    fftwf_complex *outf; 
    fftwf_plan plan_backwardf; 
    fftwf_plan plan_forwardf; 

    fftwq_complex *inq; 
    fftwq_complex *in2q; 
    fftwq_complex *outq; 
    fftwq_plan plan_backwardq; 
    fftwq_plan plan_forwardq; 

    //thread parameters 
    int nbthreads=2; 
    fftw_init_threads(); 
    fftw_plan_with_nthreads(nbthreads); 
    fftwf_init_threads(); 
    fftwf_plan_with_nthreads(nbthreads); 
    fftwq_init_threads(); 
    fftwq_plan_with_nthreads(nbthreads); 

    in = fftw_malloc (sizeof (fftw_complex) * n); 
    out = fftw_malloc (sizeof (fftw_complex) * n); 

    inf = fftwf_malloc (sizeof (fftwf_complex) * nf); 
    outf = fftwf_malloc (sizeof (fftwf_complex) * nf); 

    inq = fftwq_malloc (sizeof (fftwq_complex) * nq); 
    outq = fftwq_malloc (sizeof (fftwq_complex) * nq); 

    // forward fft 
    plan_forward = fftw_plan_dft_1d (n, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftw_execute (plan_forward); 

    plan_forwardf = fftwf_plan_dft_1d (nf, inf, outf, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwf_execute (plan_forwardf); 

    plan_forwardq = fftwq_plan_dft_1d (nq, inq, outq, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwq_execute (plan_forwardq); 

    // backward fft 
    in2 = fftw_malloc (sizeof (fftw_complex) * n); 
    plan_backward = fftw_plan_dft_1d (n, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftw_execute (plan_backward); 

    in2f = fftwf_malloc (sizeof (fftwf_complex) * nf); 
    plan_backwardf = fftwf_plan_dft_1d (nf, outf, in2f, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwf_execute (plan_backwardf); 

    in2q = fftwq_malloc (sizeof (fftwq_complex) * nq); 
    plan_backwardq = fftwq_plan_dft_1d (nq, outq, in2q, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwq_execute (plan_backwardq); 

    fftw_cleanup_threads(); 
    fftw_destroy_plan (plan_forward); 
    fftw_destroy_plan (plan_backward); 

    fftw_free (in); 
    fftw_free (in2); 
    fftw_free (out); 

    fftwf_cleanup_threads(); 
    fftwf_destroy_plan (plan_forwardf); 
    fftwf_destroy_plan (plan_backwardf); 

    fftwf_free (inf); 
    fftwf_free (in2f); 
    fftwf_free (outf); 

    fftwq_cleanup_threads(); 
    fftwq_destroy_plan (plan_forwardq); 
    fftwq_destroy_plan (plan_backwardq); 

    fftwq_free (inq); 
    fftwq_free (in2q); 
    fftwq_free (outq); 

    return 0; 
} 

あなたはfftwq_init_threads(); fftwq_plan_with_nthreads(nbthreads);fftwq_cleanup_threads();をコメントし、FFTWが、この場合、4倍精度のためのマルチスレッドを使用しないことを確認するために、CPUの使用状況を監視することができます。やる、intel simd sse2を使用して、異なる精度のためFFTW3を構築するには

./configure --enable-threads --enable-shared --enable-sse2 
make 
make install 
./configure --enable-threads --enable-shared --enable-sse2 --enable-float 
make 
make install 
./configure --enable-threads --enable-shared --enable-quad-precision 
make 
make install 

4倍精度にはSSE2サポートはありません。

関連する問題