如何设置具有线程和不同精度的FFTW?

时间:2016-04-22 09:39:11

标签: multithreading 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 个答案:

答案 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支持四倍精度。