2012-07-29 3 views
0

스레드를 사용하여 FFTW로 몇 가지 테스트를하고 있습니다. 큰 이중 복소 값의 1 차원 변환 (앞뒤) 시간은 1 ~ 2 또는 2-3보다 항상 더 좋습니다 스레드. 누군가이 문제를 해결하도록 도와 줄 수 있습니까? 고맙습니다!!FFTW 1 스레드는 항상 많은 스레드보다 우수합니다.

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   

I 다른 두개 내 코드를 테스트 동일한 결과를 가진 기계. 기계 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 

I 임의의 복잡한 값을 생성하고 계정에 계획에 대한 호출을 앞뒤로 만들 변환 및없이이 두 작업의 시간을 코드를 또는 메모리 할당. 내가 너무 -sse2 옵션을 시도했지만 같은 결과로, 한 스레드가 항상 더 나은

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

:로

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 

코드의 중요한 부분이다 :

난 컴파일

멀티 스레드 알고리즘 오버 다중 CPU 간의 태스크를 분배하고 각각의 서브 결과를 통합과 관련된있다
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 시간을 최소화하려면 하나의 스레드를 사용하십시오. 그렇게하면 스레딩 오버 헤드가 없습니다. 벽 시간을 최소화하려면 더 많은 스레드를 사용하십시오.

+0

고맙습니다. gettimeofday 대신 clock_gettime을 사용하면 시간이 많이 걸리고 멀티 스레딩을 사용하면 더 좋은 결과를 얻을 수 있습니다! – tulkas85