Разница в производительности, которую вы видите, в основном является результатом оптимизации компилятора. Когда вы удаляете выражение exp
, переменная v
становится неиспользуемой, и компилятор удаляет вычисление v
, потому что это фактически мертвый код. Таким образом, значительное сокращение времени выполнения связано с устранением всех вычислений с плавающей запятой из цикла ядра, а не с удалением только функции exp
.
Что касается оптимизации производительности, очевидным является исключение использования pow
для вычисления простого квадрата (компилятор может делать это сам) и приведение в порядок всех выражений с плавающей запятой, чтобы исключить ряд неявных преобразования целых чисел с плавающей точкой (подсказка: 0 - целое число, 0. - двойная точность и 0.f - одинарная точность).
Трудно комментировать производительность транзакций памяти в ядре из кода, который вы выложили. Визуальный профилировщик CUDA 4 имеет несколько полезных средств диагностики, которые показывают, является ли фрагмент кода ограниченным по памяти или арифметическим. Возможно, вам будет полезно профилировать код и посмотреть, что он сообщает.