FFTW 1 hilo siempre es mejor que muchos de los hilos
-
13-12-2019 - |
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);
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.