Функция CUDA copysign() не найдена в __device__ function (MSVC)

#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.