【问题标题】:FFTW 1 thread is always better than many threadsFFTW 1 线程总是比多线程好
【发布时间】:2012-07-27 08:57:46
【问题描述】:

我正在使用线程对 FFTW 进行一些测试,大双复数值的一维变换(向前和向后)的时间对于 1 个线程总是比 2-3 或 4 个线程更好。有人可以帮我解决这个问题吗?谢谢!!

1 个线程的输出是:

time           N
0.001515        16384   
0.003364        32768   
0.002625        65536   
0.006060        131072  
0.016190        262144  
0.042389        524288  
0.091719        1048576         
0.209468        2097152         
0.523317        4194304        
1.196903        8388608      

while for 4 个线程(结果与 2 或 3 个线程相似...):

time            N
0.002071        16384   
0.004009        32768  
0.007989        65536   
0.008715        131072  
0.020615        262144  
0.055483        524288  
0.159392        1048576         
0.322355        2097152         
0.761479        4194304         
1.647288        8388608         

我在两台不同的机器上测试我的代码,结果相同。 机器 1:

Ubuntu 10.04.1 LTS
2.6.32-24-generic  x86_64 GNU/Linux
gcc version 4.4.3 
Intel(R) Core(TM)2 Quad CPU    Q9550  @ 2.83GHz
ram 4gb

机器 2:

Ubuntu 10.04.1 LTS
2.6.32-21-server  x86_64 GNU/Linux
gcc version 4.4.3 
Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz
ram 8gb

我的代码可以生成随机复数值并进行正向和反向转换,并在这两个操作上花费时间,而不考虑对计划或内存分配的调用。

FFTW 配置为:

./configure --prefix=/home/.... --enable-threads 

我也尝试使用-sse2 选项,但结果相同,1 线程总是更好。

我编译:

gcc 1DFFTW.c -o 1DFFTW -I/$HOME/opt/fftw-3.3.2/include -L/$HOME/opt/fftw-3.3.2/lib -lrt -lfftw3_threads -lfftw3 -lpthread -lm

代码的重要部分是:

  if(nThreads>1){
     int err=fftw_init_threads();
     if (err==0) 
        printf("thread creation error : %d\n",err);
     else 
        fftw_plan_with_nthreads(nThreads);
  }
  int i;
  fftw_complex *in;
  fftw_complex *in2;

  fftw_complex *out;

  fftw_plan plan_backward;
  fftw_plan plan_forward;

  struct timespec start, stop;
  printf ( "\n" );
  printf ( "N= %d \n",n);

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

  srand ( time(NULL) );

  for ( i = 0; i < n; i++ )
  {
    in[i][0] = rand() / (double)RAND_MAX;
    in[i][1] = rand() / (double)RAND_MAX;
  }


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

  in2 = fftw_malloc ( sizeof ( fftw_complex ) * n );


  plan_forward = fftw_plan_dft_1d ( n, in, out, FFTW_FORWARD, FFTW_ESTIMATE );


  plan_backward = fftw_plan_dft_1d ( n, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE );

  clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start);

  fftw_execute ( plan_forward );


  fftw_execute ( plan_backward );

  clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop);

【问题讨论】:

    标签: c multithreading fft performance-testing fftw


    【解决方案1】:

    多线程算法的开销与在多个 CPU 之间分配任务和合并单个子问题的结果相关。您测量的是 CPU 时间,而不是挂钟时间。

    如果您想最小化 CPU 时间,请使用一个线程。这样,就没有线程开销。如果您想尽量减少挂墙时间,请使用更多线程。

    【讨论】:

    • 谢谢,如果我使用 gettimeofday 而不是 clock_gettime 我有不同的时间,并且使用多线程会有更好的结果!
    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多