5

我最近将我的算法的表面参考更改为表面对象。然后,我注意到程序运行速度较慢。

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

表面参考 API

时间:9.068928 毫秒

surface<void, cudaSurfaceType3D> s_volumeSurf;
...
surf3Dwrite(value, s_volumeSurf, px*sizeof(float), py, pz, cudaBoundaryModeTrap);

表面对象 API

时间:14.960256 毫秒

cudaSurfaceObject_t l_volSurfObj;
...
surf3Dwrite(value, l_volSurfObj, px*sizeof(float), py, pz, cudaBoundaryModeTrap);

这是在具有 Compute Capability 3.0 和 CUDA 5.0 的 GTX 680 上进行测试的。

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

4

1 回答 1

7

在表面对象的情况下,表面描述符是从全局内存中获取的。在表面参考案例中,这些描述符被编译到常量内存中。获取这些描述符可能比全局内存访问快得多。如果您的内核足够小或 L1 缓存被禁用,您可能会观察到显着的性能损失。

您可以比较 SASS 代码以查看差异。

于 2013-07-16T06:20:13.097 回答