我最近更改了表面对象的算法表面参考。然后,我注意到程序运行速度较慢。
下面是一个简单示例的比较,其中我用常量值填充3D浮动数组[400 * 400 * 400]。
时间:9.068928毫秒
surface<void, cudaSurfaceType3D> s_volumeSurf;
...
surf3Dwrite(value, s_volumeSurf, px*sizeof(float), py, pz, cudaBoundaryModeTrap);
时间:14.960256 ms
cudaSurfaceObject_t l_volSurfObj;
...
surf3Dwrite(value, l_volSurfObj, px*sizeof(float), py, pz, cudaBoundaryModeTrap);
这是在具有Compute Capability 3.0和CUDA 5.0的GTX 680上测试的。
有没有人对这种差异有解释?
答案 0 :(得分:5)
在表面对象的情况下,表面描述符是从全局内存中提取的。 在表面引用的情况下,这些描述符被编译成常量存储器。获取这些描述符可能比全局内存访问快得多。如果您的内核足够小或者禁用了L1缓存,您可能会发现性能显着下降。
您可以对SASS代码进行区分以查看差异。