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