看起来我的应用开始是(i)FFT有界,它为平均大小约为500x200(宽度和高度始终均匀)的矩形进行了大量2D相关。场景与往常一样 - 做两个FFT(每个场一个),乘以复数场,然后是一个iFFT。
因此,在CPU(英特尔Q6600,JTransforms libraly)上,根据探测器,在GPU(GTX670,cuFFT库)上大约70%的时间进行FFT转换 - 大约50%(因此,CUDA的性能有所提高) ,但不是我想要的)。我意识到,可能是GPU没有完全饱和(带宽受限),但从其他情况来看 - 批量计算将大大增加应用程序的复杂性。
问题:
答案 0 :(得分:3)
我正在回答您的第一个问题:我还可以做些什么来减少cuFFT花费的时间?
引用CUFFT LIBRARY用户指南
- 将所有维度的大小限制为
2^a*3^b*5^c*7^d
。 CUFFT库具有高度优化的内核,适用于尺寸具有这些主要因素的变换。- 限制每个维度的大小以使用较少的不同素数因子。例如,大小
3^n
的变换通常比大小2^i*3^j
的变换更快 如果后者略小。- 将
x
维度的二次幂分解项限制为单精度变换的256
或用于双精度变换的64
的倍数。这进一步有助于内存合并。- 对于Fermi-class,Kepler-class和更新的GPU,将单精度变换的
x
维度严格限制为2
和8192
之间的2的幂。对于早期架构,在2
和2048
之间。这些转换实现为专用的手工编码内核,可将所有中间结果保存在共享内存中。- 使用本机兼容模式进行就地复杂到实际或从实际到复杂的转换。该方案减少了填充字节的写入/读取,因此有助于数据的合并。
醇>从CUFFT库的3.1版本开始,当x维度的二次幂分解项为时,利用了实际到复杂输出数据阵列和复杂到实际输入数据阵列的共轭对称性。大型1D尺寸(大于65,536的功率),2D和3D变换从实现复杂或复杂到真实变换的性能优化中获益最多。
您可以做的其他事情(引用Robert Crovella对running FFTW on GPU vs using CUFFT的回答):
cuFFT例程可以由多个主机线程调用,因此可以对多个独立转换进行多次调用。如果单个变换足够大以利用机器,那么你不太可能从中看到太多的加速。
cufft还支持批量计划,这是另一种“一次”执行多次转换的方式。
请注意: