求助,FFT变换效率的问题。

想用显卡来做FFT以提高效率,但是我自己写的测试程序发现用显卡做FFT还没CPU快,同样做8192点的FFT正反变换,GPU耗时0.5315毫秒,CPU耗时0.0864毫秒,GPU的计算是通过cufft计算的,CPU的计算是通过FFTW计算的。我的GPU计算能力是3.0,CPU是I7,为啥会这样呢,不是说好的GPU要比CPU快么……有没有可能是我的程序过于复杂了?
以下是我计算使用的代码:
cudaMemcpy( _realPart, idate, sizeof(float)*_nx, cudaMemcpyHostToDevice );
AppState = cufftExecR2C( _planR2C, _realPart, _complexPart);

if( AppState != CUFFT_SUCCESS )
{
	printf ( "CUFFT error : ExecR2C failed! \n" );
	return APP_ERROR;
}
cudaMemcpy( odate, _complexPart, sizeof(complex<float>)*(_nx/2+1), cudaMemcpyDeviceToHost );

统计时间只包含内存拷贝和运算的时间,不包含创建plan的时间。

求大神解答啊!

LZ您好:

cufft作为NV提供的FFT库,其效率应该是有保证的,当然FFTW也对新的CPU做了各种优化。
您可以跑一下profiler看看您的总的时间里面,复制占了多少,计算占据了多少。以及您的计算规模可能偏小。

因为我不用这个库,所以无法为您进一步提供建议了,请其他人有想法的积极补充。

祝您好运~

版主说的profiler是啥,新手不懂,不过如果说拷贝数据的时间大家差距不大,GPU的时间还是大部分花在计算上了,这个我确定。

另外我尝试增加了数据量,计算32768点FFT,GPU耗时0.746毫秒,CPU耗时0.367毫秒,看来确实是数据量越大GPU的优势越明显。

谢谢版主提醒了

(1)kernel可能第一次启动较慢,您也应当计算第二次或者第三次的kernel计算时间是多少。

(2)以及这样比多少不公平的,您应该不计算来回复制的时间的。
CPU用它的内存,就地计算。
而GPU在数据都在显存里后,只统计就地在显存里计算的时间。

请看下排除这2个因素后的实际时间,楼主测试下?

LZ您好:

1:profiler指的是随您CUDA Toolkit附带的visual profiler这个软件,可以测试您的CUDA程序,并给出您直观的各部分的耗时统计图表。以及还有其他参数统计,可供您调整优化程序使用。

2:因为GPU copy的话需要将数据从host端内存复制到GPU端(device端)这个复制过程是走pci-e总线的,比host端内存慢很多,延迟大很多,GPU计算结果也需要传回,还得走一次pci-e总线。
而CPU的copy都是在host端的内存里面折腾,还是快得多的。

以及如果您跑profiler的话,可以看到copy用时和计算用时的统计。

3:您可以进一步尝试在您的GPU和CPU配备下,直接计算,多大规模下GPU能取得优势。

大致如此,供您参考。

祝您好运~

谢谢版主的耐心解答,确实是数据规模的问题,计算点数超过10000000点以后GPU的计算效率就超过CPU了,而且随着数据量的增加,GPU的优势就越来越明显了。

数据拷贝到显存确实比内存间相互拷贝要慢一些,不过差距也不是特别明显,大概也就差几十个us吧。我又试了几次确实是数据规模的问题,也谢谢您的帮助!

LZ您好:

收到您的测试结果,以及您不妨按照4#横扫斑竹的建议,进行进一步的测试,以得到更为深刻和细致的结果,并分享给论坛诸位同好?

祝您好运~