我需要使用具有不同算术精度和多线程计划的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);
就够了吗?
答案 0 :(得分:2)
用于不同精度的fftw库彼此完全独立。因此, 您需要通过调用fftw的相应函数来设置所有精度的多线程 :
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(intent);
以下是一个让您信服的示例代码。一旦建立了相应的库,它就可以在Unix上由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();
编译。
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);
并监控cpu使用情况,以检查在这种情况下fftw不会使用多线程进行四线精度。
要使用intel simd sse2为不同的精度构建fftw3,请执行:
fftwq_cleanup_threads();
没有sse2支持四倍精度。