Cuda 曲面参照比曲面对象快

Cuda 曲面参照比曲面对象快,cuda,Cuda,我最近更改了一个曲面对象的算法的曲面参考。然后,我注意到程序运行得比较慢 这里是一个比较简单的例子,我用一个常量值填充一个3D浮动数组[400*400*400] 表面参考API 时间:9.068928毫秒 surface<void, cudaSurfaceType3D> s_volumeSurf; ... surf3Dwrite(value, s_volumeSurf, px*sizeof(float), py, pz, cudaBoundaryModeTrap); 这在计算能力为

我最近更改了一个曲面对象的算法的曲面参考。然后,我注意到程序运行得比较慢

这里是一个比较简单的例子,我用一个常量值填充一个3D浮动数组[400*400*400]

表面参考API 时间:9.068928毫秒

surface<void, cudaSurfaceType3D> s_volumeSurf;
...
surf3Dwrite(value, s_volumeSurf, px*sizeof(float), py, pz, cudaBoundaryModeTrap);
这在计算能力为3.0和CUDA 5.0的GTX 680上进行了测试


有人对这种差异有什么解释吗?

在曲面对象的情况下,曲面描述符是从全局内存中提取的。 在surface引用的情况下,这些描述符被编译到常量内存中。获取这些描述符可能比全局内存访问快得多。如果您的内核足够小或一级缓存被禁用,您可能会发现显著的性能损失


您可以区分SASS代码以查看差异。

您是如何运行您的基准测试的?我使用cudaEvent(cudaEventRecord、CudaEventsSynchronize和CudaEventsLassedTime)完成的。问题仍然存在于CUDA 5.5上……因此,您是否认为一般建议改为使用曲面引用?何时使用曲面对象更可取?
cudaSurfaceObject_t l_volSurfObj;
...
surf3Dwrite(value, l_volSurfObj, px*sizeof(float), py, pz, cudaBoundaryModeTrap);