Pregunta

Estoy haciendo algunas pruebas con FFTW el uso de hilos, el tiempo de 1d transformación(hacia adelante y hacia atrás) de doble grande complejo de los valores siempre es mejor 1 hilo de 2-3 o 4 hilos.Alguien me puede ayudar a resolver este problema ?Gracias!!

Una salida de 1 hilo es:

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      

mientras que para 4 hilos (resultados es similar para 2 o 3 hilos...) :

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         

Puedo probar mi código en dos máquinas diferentes con los mismos resultados.la máquina 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

equipo 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

Tengo el código que generan al azar complejo de valores y hacer hacia adelante y hacia atrás transformar y tomar el tiempo de los dos la operación, sin tener en cuenta las convocatorias de plan o asignaciones de memoria.

FFTW se configura como :

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

Yo intente con -sse2 opción también, pero con los mismos resultados, 1 hilo siempre es mejor.

Puedo compilar con :

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

La parte importante del código es :

  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);
¿Fue útil?

Solución

El multiproceso algoritmo de la sobrecarga asociada con la distribución de las tareas entre varias Cpu y la consolidación de los resultados de los distintos sub-problema.Usted está midiendo el tiempo de CPU, no la hora del reloj de pared.

Si desea minimizar el tiempo de CPU, utilice un hilo.De esa manera, no hay roscado de la sobrecarga.Si usted desea reducir al mínimo la pared de tiempo, el uso de más de un hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top