更新:以下结果是针对2005硬件(nVidia 7800 GTX)上的手写FFT GPU算法,但显示了CPU-GPU传输瓶颈的原理
开销不是调用本身,而是编译GPU程序并在GPU和主机之间传输数据.CPU针对可完全在缓存中执行的功能进行了高度优化,DDR3内存的延迟远低于为GPU提供服务的PCI-Express总线.我在编写GPU FFT例程(CUDA之前)时亲自体验过这一点.请看相关问题.
N FFTw (s) GPUFFT (s) GPUFFT MFLOPS GPUFFT Speedup 8 0 0.00006 3.352705 0.006881 16 0.000001 0.000065 7.882117 0.010217 32 0.000001 0.000075 17.10887 0.014695 64 0.000002 0.000085 36.080118 0.026744 128 0.000004 0.000093 76.724324 0.040122 256 0.000007 0.000107 153.739856 0.066754 512 0.000015 0.000115 320.200892 0.134614 1024 0.000034 0.000125 657.735381 0.270512 2048 0.000076 0.000156 1155.151507 0.484331 4096 0.000173 0.000215 1834.212989 0.804558 8192 0.000483 0.00032 2664.042421 1.510011 16384 0.001363 0.000605 3035.4551 2.255411 32768 0.003168 0.00114 3450.455808 2.780041 65536 0.008694 0.002464 3404.628083 3.528726 131072 0.015363 0.005027 3545.850483 3.05604 262144 0.033223 0.012513 3016.885246 2.655183 524288 0.072918 0.025879 3079.443664 2.817667 1048576 0.173043 0.076537 2192.056517 2.260904 2097152 0.331553 0.157427 2238.01491 2.106081 4194304 0.801544 0.430518 1715.573229 1.861814
上表显示了基于内核大小的GPU FFT实现与CPU实现的时序.对于较小的尺寸,与GPU的数据传输占主导地位.可以在CPU上执行较小的内核,一些实现/大小完全在缓存中.这使CPU成为小型操作的最佳选择.
另一方面,如果你需要对数据执行大批量的工作,而只需要进行最小的GPU移动,那么GPU就会击败CPU.
至于在您的示例中测量效果,我建议执行如上所述的实验.尝试计算出针对每种矩阵大小计算的FLOPS,并针对不同大小的矩阵在CPU和GPU上运行测试.将GPU与CPU的大小,时间和FLOPS输出到CSV文件.对于任何分析,确保您运行几百次代码迭代并计算整个时间,然后通过迭代划分总时间以获得循环时间.如果您的算法允许,也可以尝试不同的形状矩阵(例如10x100而不是100x10).
使用此数据,您可以了解开销是多少.要找出完全重复相同的实验,但用无操作替换GPU上执行的内部着色器代码(只需从输入复制到输出).
希望这可以帮助,