#c #cuda
#c #cuda
Вопрос:
Я хочу использовать функцию CUDA math API __device__ float copysignf(float x, float y)
(см. Документацию) с помощью __device__
функции. Я включил math.h
и использую цепочку инструментов Visual Studio 2012. copysignf()
там не определено, но _copysignf()
есть (обратите внимание на подчеркивание). Я предполагаю, что это может вызвать проблему — компиляция приводит к ошибке:
Error 1 error : calling a __host__ function("_copysignf") from a __global__ function("test_kernel") is not allowed C:cuda.cu(152) (col. 10)
Как я могу использовать функцию CUDA copysignf()
из Visual Studio?
Примечание: Я дважды проверил несоответствия аргументов шаблона, оба аргумента имеют float
тип.
Комментарии:
1. Не используйте
_copysignf()
. Что произойдет, если вы используетеcopysignf()
?2.
copysignf()
действительно работает, спасибо! Я не пробовал это, потому что IntelliSense жалуется на то, что она не определена. Следовало бы знать лучше…
Ответ №1:
Вы получаете ошибку, описанную в вопросе, потому что _copysignf()
на самом деле является функцией хоста и не имеет аналога устройства (т. Е. CUDA).
Просто используйте функции, описанные в документации, на которую вы ссылались. Вы не обязательно найдете все эти определения в math.h
, поставляемом с Visual Studio, но это не является определяющим фактором того, что будет работать в коде устройства CUDA.
Индикация intellisense — это отдельная проблема, и многие люди в той или иной степени пытались ее обойти. Просто найдите в SO «CUDA red underline», и вы найдете много предложений. Но указание intellisense в коде CUDA не обязательно указывает на проблему.
Комментарии:
1. CUDA в основном поддерживает все математические функции, определенные ANSI C99 (и некоторые дополнительные). Хотя обычно она зависит от математики хоста. файл заголовка h для предоставления необходимых прототипов функций он предоставляет свои собственные прототипы для функций, прототипов которых нет в math.h. Вы можете найти эти прототипы в файле math_functions.h, поставляемом CUDA.