Ссылка на поверхность быстрее, чем объект поверхности

Недавно я изменил ссылку на поверхность моего алгоритма для поверхностного объекта. Затем я заметил, что программа работает медленнее.

Вот сравнение для простого примера, когда я заполняю 3D-плавающий массив [400 * 400 * 400] с постоянным значением.

API-интерфейс поверхности

Время: 9.068928 мс

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

API поверхностного объекта

Время: 14.960256 мс

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

Это было протестировано на GTX 680 с Compute Capability 3.0 и CUDA 5.0.

Есть ли у кого-нибудь объяснение этой разницы?

1 ответ

В случае с поверхностным объектом дескрипторы поверхности извлекаются из глобальной памяти. В поверхностном справочном примере эти дескрипторы скомпилированы в постоянную память. Получение этих дескрипторов может быть намного быстрее, чем доступ к глобальной памяти. Если ваше ядро ​​достаточно мало или кеш L1 отключен, вы можете наблюдать значительную потерю производительности.

Вы можете разделить код SASS, чтобы увидеть разницу.

licensed under cc by-sa 3.0 with attribution.