C FFTW 1线程总是比许多线程好

C FFTW 1线程总是比许多线程好,c,multithreading,fft,performance-testing,fftw,C,Multithreading,Fft,Performance Testing,Fftw,我正在使用线程对FFTW进行一些测试,对于1个线程,大双复数值的1d转换(向前和向后)时间总是比2-3或4个线程好。有人能帮我解决这个问题吗?谢谢 1个线程的输出为: time N 0.001515 16384 0.003364 32768 0.002625 65536 0.006060 131072 0.016190 262144 0.042389 524288

我正在使用线程对FFTW进行一些测试,对于1个线程,大双复数值的1d转换(向前和向后)时间总是比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      
而对于4个线程(2个或3个线程的结果相似…):

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

Ubuntu 10.04.1 LTS
2.6.32-24-通用x86_64 GNU/Linux
gcc版本4.4.3
英特尔(R)核心(TM)2四处理器Q9550@2.83GHz
内存4gb
机器2:

Ubuntu 10.04.1 LTS
2.6.32-21服务器x86_64 GNU/Linux
gcc版本4.4.3
英特尔(R)核心(TM)i7处理器860@2.80GHz
ram 8gb
我的代码可以生成随机的复杂值,进行前向和后向转换,并在这两个操作中花费时间,而不考虑对计划或内存分配的调用

FFTW配置为:

./configure --prefix=/home/.... --enable-threads 
我也尝试使用
-sse2
选项,但同样的结果是,1个线程总是更好

我编译时使用:

gcc 1dftw.c-o 1dftw-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);
if(n读数>1){
int err=fftw_init_threads();
如果(错误==0)
printf(“线程创建错误:%d\n”,错误);
其他的
fftw_平面图_,带第n条(第n条);
}
int i;
fftw_复合体*in;
fftw_复合体*in2;
fftw_复合体*out;
fftw_计划向后;
fftw_计划向前;
结构timespec启动、停止;
printf(“\n”);
printf(“N=%d\N”,N);
in=fftw_malloc(尺寸(fftw_复合体)*n);
srand(时间(空));
对于(i=0;i
多线程算法的开销与在多个CPU之间分配任务和合并单个子问题的结果有关。您测量的是CPU时间,而不是挂钟时间


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

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


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

谢谢,如果我使用gettimeofday而不是clock\u gettime,我的时间不同,使用多线程会有更好的结果!谢谢,如果我用gettimeofday代替clock_gettime,我会有不同的时间,多线程会有更好的效果!
  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);