2012-07-29 20 views
0

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

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个线程...类似):

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 

我有一个随机生成的复杂值,使前后变换并借此两种操作的时间,而不考虑到计划中的调用的代码或内存分配。

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

-sse2选项尝试过,但有相同的结果,1个线程始终是更好:因为

FFTW经过配置。

我编译:

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); 

回答

3

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

如果您想最小化CPU时间,请使用一个线程。这样,没有线程开销。如果你想最大限度地减少墙壁时间,使用更多的线程。

+0

谢谢,如果我使用gettimeofday而不是clock_gettime我有不同的时间,并且使用多线程有更好的结果! – tulkas85 2012-07-29 16:26:38