влияние forceinline на функциях прибора CUDA C

есть много советов о том, когда использовать встроенные функции и когда избегать его в обычном кодировании C. Каков эффект __forceinline__ на CUDA c __device__ функции? Где их следует использовать и где их следует избегать?

1 ответов


обычно nvcc компилятор кода устройства будет принимать собственные решения о том, когда вставлять конкретный __device__ функция и вообще говоря, вам, вероятно, не нужно беспокоиться о переопределении этого с помощью __forceinline__ директива декоратор/.

cc 1.устройства x не имеют тех же аппаратных возможностей, что и новые устройства, поэтому очень часто компилятор автоматически встроит функции для этих устройств.

Я думаю, что смысла указывать __forceinline__ это же как вы уже могли узнать о host C код. Он обычно используется для оптимизации, когда компилятор не может иначе встроить функцию (например, на cc 2.X или более новые устройства). Эта оптимизация (т. е. накладные расходы на вызов функции) может быть незначительной, если вы вызывали функцию один раз, но если вы вызывали функцию в цикле, например, убедившись, что она была встроена, может дать заметное улучшение в выполнении кода.

как встречный пример, inlining и рекурсия вообще есть противопоказания. Для рекурсивной функции, которая вызывает себя, я не думаю, что можно обрабатывать произвольную рекурсию, а также строгую вставку. Поэтому, если вы собираетесь использовать функцию рекурсивно (поддерживается в cc 2.x и выше) вы, вероятно, не захотите указывать __forceinline__.

В общем, я думаю, вы должны позволить компилятору управлять этим для вас. Он будет разумно решать, следует ли встроить функцию.