OpenCL或CUDA调用的开销?

Mar*_*sen 4 c++ cuda gpgpu timing opencl

我正在编写一个执行大量BLAS gemv操作的函数.

我希望能够在GPU上做到这一点,我尝试过使用cuBlas.

我的问题是我的矩阵和向量相当小,100x100矩阵和100向量.与CPU相比,CuBlas需要更长的时间,我知道为什么,cpu上的快速缓存和执行GPU调用的大量开销.

因此,我试图找出一种智能的方法来测量将呼叫通信到GPU所需的时间.

这是CUDA设置调用并将其发送到图形处理器所需的时间 - 不计算实际进行矩阵向量乘法所需的时间.

我该怎么做呢?

Dr.*_*ABT 8

更新:以下结果是针对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上执行的内部着色器代码(只需从输入复制到输出).

希望这可以帮助,