CUFFT的理论速度

今天又有一个问题不解,请指点:
根据NVIDIA官方介绍,“英伟达 CUDA 快速傅里叶变换 (cuFFT) 库可提供一个简单的接口,让计算 FFT 的速度最高提升 10 倍。”。不知道这里说的10倍是否包含数据拷贝的时间?

我前两天用的是CUDA5.0, VS2008。C语言版本的FFT是2122ms, clock_t测时;CUFFT计算时间为13ms, cudaEvent_t测时,加速比达2122/13=163倍!我的数据是在显存里的,没有cudaMemcpy数据的传输。不知道这个速度有没有问题?

今天我换了CUDA5.5,VS2010. C语言版本FFT时间未变,但CUFFT的时间变成了235ms,加速比为2122/235=9倍,难道是我的编程环境设置跟原来的VS2008不一样?CUFFT的运行效率跟VS的配置有关?还是说我VS2008的163倍速度本来就不可能达到?

当然了,我用的C语言版本的FFT程序算法跟CUFFT库中的肯定不一样,这样去比较速度有不合理之处,但无论如何,163倍和9倍肯定只有一个正确,因为相差太大了。
请指点。

LZ您好:

1:cufft是NV提供的闭源库,您可以直接使用,但无法知道具体实现。以及,我并不清楚该库的效能如何,是否能达到/在什么情况下能达到宣称的加速比,亦不知道该加速比是如何计算的,是什么样的GPU和什么样的CPU在哪个具体的FFT库实现下比较,在什么计算规模下比较以及是否包含/或者是否掩盖了数据传输时间。

2:您两次计算除了VS和CUDA Toolkit版本区别之外,请保证硬件环境的一致性,以及都使用足够新的驱动。

3:请保证两次的数据规模是一致的,以及两次的计算结果都是正确的。

4:请尽量使用profiler计时,并避开开始的隐含初始化过程。

如果这样5.5的cufft还是比5.0的cufft慢了那么多,那么我无法解释这个是为什么,请向NV原厂支持人员联系,提交您的评测结果。

5:无法评价哪个加速比是正确的,因为其一,我不清楚cufft在您的平台上的确切性能,其二,我也无法得知您的CPU版的FFT实现究竟情况如何,因此无法根据这两个加速比数值确定哪个是正确的,或者是否两者皆不正确。

大致如此,请您继续研究。

祝您好运~

我用的是CUDA event_t计的时间,现在想用profiler看看,提示错误
unable to profile application.
the application being profiled returned a non-zero return code.
我应该怎么做呢?
以前我的编绎模式里有profile选项,现在没有了。

这表明您的进程中途异常终止了。

所以您之前应该有错误的时间测试。请您先成功的运行好(例如,使用已知的正确数据检验是否已经正确的执行)。
然后在正确执行成功的基础上,再考虑测试时间。
(此时您使用profiler应该无问题了)
(以及,还能profiler下您的进程的当前目录没设定好,建议数据文件使用绝对路径,不一定是你的代码错误)

请先尝试正确运行,再考虑时间上的比较或者优化。
感谢周末来访。

我换了其它调试过的小程序也是不行。是不是我缺少了哪些必要设置。我昨天才安装的CUDA5.5,vs2010。
我是先在VS2010里用release编绎程序,然后运行,显示结果没有错。然后我在profiler界面create new session,在browser里面找到刚才生成的object file。打开之后,显示generating…然后就提示错误了。

object file?

您不能对object file(.o或者.obj)进行profiling或者debugging的。

您需要选择好您的exe文件。

(同时别忘记设置好您的路径,上文说过了)
(请重新尝试)

原来我没先对文件啊。
在browser里先好文件之后,路径为C:.…百度了一下,以盘符开头的就是绝对路径啊。
现在更麻烦了,我发现工程目录下根本就没有.EXE文件,可是我明明是编绎了,运行了呀。

LZ您好:

您可以看一看VS里面项目设置里面的将exe文件放置在了哪里。如果您是使用CUDA samples里面的simple cufft的项目修改的,那么生成的exe文件不在默认的当前路径,而在另外的地方,请您寻找一下。

祝您好运~

还是您经验丰富啊,我干什么您都猜得到,哈哈。按照您说的,真的找到了。

我使用 1024点的FFT运行1000000次,使用matlab计算耗时3.5秒, Vs2013调用cuda库是4.7秒,这个调用核心是自动分配的吗?