スレッドを使用して FFTW でいくつかのテストを行っています。大きな倍精度複素数値の 1 次元変換 (前方および後方) の時間は、2 ~ 3 または 4 スレッドよりも 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
while 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
2 つの異なるマシンでコードをテストし、結果は同じです。マシン 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
ランダムな複雑な値を生成し、前方および後方変換を行い、プランまたはメモリ割り当ての呼び出しを考慮せずにこの 2 つの操作に時間をかけるコードがあります。
FFTW は次のように構成されます。
./configure --prefix=/home/.... --enable-threads
私もオプションを試してみまし-sse2
たが、同じ結果で、1スレッドの方が常に優れています。
私はコンパイルします:
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);