2016-08-27 12 views
1

Я пишу программу в CUDA, которая делает огромное количество вызовов функции sincos(), используя двойную точность. Я боюсь, что это одно из самых больших узких мест в коде, и я не могу уменьшить количество вызовов функции.Есть ли способ оптимизировать вызовы sincos в CUDA?

Есть ли приличное приближение к sincos в CUDA или в библиотеке, которую я могу импортировать? Я также очень обеспокоен точностью, поэтому, чем лучше аппроксимация, тем счастливее будет мой код.

Я также думал о построении таблицы поиска или приближении значений к их серии Тейлор, но я хочу получить некоторые мнения перед тем, как спуститься по этой дороге.

ответ

3

Очень быстрая и точная функция sincos доступна в CUDA math api. Просто включите math.h. Или используйте sincosf (here), если это сработает для вас. (Я знаю, что вы сказали, двойная точность в вашем вопросе. Просто указывая некоторые вещи.)

Если вы можете использовать sincospif вместо sincosf, @njuffa работал его магия here, которые могут вас заинтересовать.

This question и this question также могут вас заинтересовать.

+0

Я уже использую 'sincos' из' math.h', и я не знаю, потеряю ли я слишком много точности с помощью 'sincosf', что вы думаете ?. Хотя мои углы не 'pi * expr', спасибо, что указали на' sincospif'! – Alejandro

+1

Конечно, существует большая разница в точности (бит) между 'sincosf' и' sincos'. Я не знаю, насколько это важно для вашего конкретного алгоритма. Поскольку вы заинтересованы в производительности, и, как правило, производительность и точность являются компромиссом, логично исследовать чувствительность вашего алгоритма к дополнительным битам точности, учитывая условия в вашем вопросе. Когда ньюффа придет, он сможет ответить на все ваши вопросы. –

+2

@Alejandro В дополнение к применимости 'sincos' могут быть другие специальные шаблоны использования. Некоторые коды используют синус и косинус с постоянными углами, что позволяет вычислять эти значения без вызовов 'sincos'. Другие коды используют синус и косинус в сочетании с обратными триггерными функциями, такое использование часто может быть заменено потенциально более дешевым алгебраическим вычислением. Возможно, вам стоит подумать о том, чтобы задать вопрос о том, как можно сократить количество вызовов синуса и косинуса для вашего конкретного случая использования. – njuffa